Android实例剖析笔记(五)

简介:   游戏暂停/继续机制      由于原来的代码中在游戏运行时没有提供控制选项(比如暂停/继续),因此除非你死了,否则只能玩到底。我这里对代码进行一些修改,加入一个Option Menu来提供暂停/继续机制。

  游戏暂停/继续机制

      由于原来的代码中在游戏运行时没有提供控制选项(比如暂停/继续),因此除非你死了,否则只能玩到底。我这里对代码进行一些修改,加入一个Option Menu来提供暂停/继续机制。

      首先加入一个变量记录游戏当前状态

private   int  mState  =  SnakeView.READY;

       然后重载onCreateOptionsMenu函数,创建一个控制菜单项,并对其进行处理,提供暂停/继续机制。

    /*
     * @see android.app.Activity#onOptionsItemSelected(android.view.MenuItem)
     * @Author:phinecos
     * @Date:2009-08-28
     
*/
    @Override
    
public   boolean  onOptionsItemSelected(MenuItem item)
    {
        
switch  (item.getItemId())
        {
            
case  MENU_CONTROL:
            {
                
if  (mState  ==  SnakeView.PAUSE)
                {
// 此前状态是"停止",则转为"运行"
                    mState  =  SnakeView.RUNNING;
                    mSnakeView.setMode(SnakeView.RUNNING);
                    item.setIcon(android.R.drawable.ic_media_pause).setTitle(R.string.cmd_pause);
                }
                
else   if (mState  ==  SnakeView.RUNNING)
                {
// 此前状态是"运行",则转为“暂停"
                    mState  =  SnakeView.PAUSE;
                    mSnakeView.setMode(SnakeView.PAUSE);
                    item.setIcon(android.R.drawable.ic_media_play).setTitle(R.string.cmd_run);
                }
                
else   if (mState  ==  SnakeView.READY)
                {
// 此前是"初始状态",则转为"运行"
                    mState  =  SnakeView.RUNNING;
                }
    
return   true ;
            }
        }
        
return   super .onOptionsItemSelected(item);
    }
    
/*
     * @see android.app.Activity#onOptionsItemSelected(android.view.MenuItem)
     * @Author:phinecos
     * @Date:2009-08-28
     
*/
    @Override
    
public   boolean  onCreateOptionsMenu(Menu menu) 
    {
         
super .onCreateOptionsMenu(menu);
         menu.add(
0 , MENU_CONTROL,  0 , R.string.cmd_pause).setIcon(android.R.drawable.ic_media_pause);
         
return   true ;
    }

  修改后运行截图如下:



  当然,这段代码还是有问题的,游戏刚开始时,必须先点击菜单确认,再按上方向键才能开始。(以后再来修改。。。)

  穿墙贪食蛇

      第二个修改是把这个普通的贪食蛇改成可以穿墙(呵呵,这样就可以不死了。。。)。想必要修改的就是撞墙检测那段代码?没错,就是下面这段!

//  Collision detection
//  For now we have a 1-square wall around the entire arena
if  ((newHead.x  <   1 ||  (newHead.y  <   1 ||  (newHead.x  >  mXTileCount  -   2 ) ||  (newHead.y  >  mYTileCount  -   2 )) 
{
// 撞墙
     setMode(LOSE);
     
return ;
}

  原来的版本是发现撞墙时就直接判定为失败,我这里做个小小的修改,让它可以穿墙而去:

private   void  updateSnake()
    {
        
boolean  growSnake  =   false ;

        
//  grab the snake by the head
        Coordinate head  =  mSnakeTrail.get( 0 );
        Coordinate newHead 
=   new  Coordinate( 1 1 );

        mDirection 
=  mNextDirection;

        
switch  (mDirection) 
        {
        
case  EAST: 
        {
            newHead 
=   new  Coordinate(head.x  +   1 , head.y);
            
break ;
        }
        
case  WEST: 
        {
            newHead 
=   new  Coordinate(head.x  -   1 , head.y);
            
break ;
        }
        
case  NORTH: 
        {
            newHead 
=   new  Coordinate(head.x, head.y  -   1 );
            
break ;
        }
        
case  SOUTH: 
        {
            newHead 
=   new  Coordinate(head.x, head.y  +   1 );
            
break ;
        }
        }

        
// 穿墙的处理
         if  (newHead.x  ==   0 )
        {
// 穿左边的墙
            newHead.x  =  mXTileCount  -   2 ;
        }
        
else   if  (newHead.y  ==   0 )
        {
// 穿上面的墙
            newHead.y  =  mYTileCount  -   2 ;
        }
        
else   if  (newHead.x  ==  mXTileCount  -   1 )
        {
// 穿右边的墙
            newHead.x  =   1 ;
        }
        
else   if  (newHead.y  ==  mYTileCount  -   1 )
        {
// 穿下面的墙
            newHead.y  =   1 ;
        }
        
//  判断是否撞到自己
         int  snakelength  =  mSnakeTrail.size();
        
for  ( int  snakeindex  =   0 ; snakeindex  <  snakelength; snakeindex ++
        {
            Coordinate c 
=  mSnakeTrail.get(snakeindex);
            
if  (c.equals(newHead))
            {
                setMode(LOSE);
                
return ;
            }
        }
        
//  判断是否吃掉“苹果”
         int  applecount  =  mAppleList.size();
        
for  ( int  appleindex  =   0 ; appleindex  <  applecount; appleindex ++ )
        {
            Coordinate c 
=  mAppleList.get(appleindex);
            
if  (c.equals(newHead)) 
            {
                mAppleList.remove(c);
                addRandomApple();
                mScore
++ ;
                mMoveDelay 
*=   0.9 ;
                growSnake 
=   true ;
            }
        }
        
//  push a new head onto the ArrayList and pull off the tail
        mSnakeTrail.add( 0 , newHead);
        
//  except if we want the snake to grow
         if  ( ! growSnake) 
        {
            mSnakeTrail.remove(mSnakeTrail.size() 
-   1 );
        }
        
int  index  =   0 ;
        
for  (Coordinate c : mSnakeTrail) 
        {
            
if  (index  ==   0 )
            {
                setTile(YELLOW_STAR, c.x, c.y);
            } 
            
else  
            {
                setTile(RED_STAR, c.x, c.y);
            }
            index
++ ;
        }
}

  其实修改后的代码非常简单,就是把新节点的值做些处理,让它移动到对应的行/列的头部或尾部即可。下面就是修改后的“穿墙”贪食蛇的运行截图:


  全屏机制

      游戏一般都是全屏的,原始代码也考虑到标题栏太过难看了,于是使用下面这句代码就去掉了标题栏:

requestWindowFeature(Window.FEATURE_NO_TITLE);

可还是没有达到全屏的效果,在Android1.5中实现全屏效果非常简单,只需要一句代码即可实现:

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

  运行效果如下图所示:

  

目录
相关文章
|
1月前
|
Web App开发 安全 程序员
FFmpeg开发笔记(五十五)寒冬里的安卓程序员可进阶修炼的几种姿势
多年的互联网寒冬在今年尤为凛冽,坚守安卓开发愈发不易。面对是否转行或学习新技术的迷茫,安卓程序员可从三个方向进阶:1)钻研谷歌新技术,如Kotlin、Flutter、Jetpack等;2)拓展新功能应用,掌握Socket、OpenGL、WebRTC等专业领域技能;3)结合其他行业,如汽车、游戏、安全等,拓宽职业道路。这三个方向各有学习难度和保饭碗指数,助你在安卓开发领域持续成长。
60 1
FFmpeg开发笔记(五十五)寒冬里的安卓程序员可进阶修炼的几种姿势
|
22天前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
73 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
6月前
|
Android开发
Android应用实例(一)之---有道辞典VZ.0
Android应用实例(一)之---有道辞典VZ.0
42 2
|
3月前
|
JavaScript 前端开发 Java
FFmpeg开发笔记(四十七)寒冬下安卓程序员的几个技术转型发展方向
IT寒冬使APP开发门槛提升,安卓程序员需转型。选项包括:深化Android开发,跟进Google新技术如Kotlin、Jetpack、Flutter及Compose;研究Android底层框架,掌握AOSP;转型Java后端开发,学习Spring Boot等框架;拓展大前端技能,掌握JavaScript、Node.js、Vue.js及特定框架如微信小程序、HarmonyOS;或转向C/C++底层开发,通过音视频项目如FFmpeg积累经验。每条路径都有相应的书籍和技术栈推荐,助你顺利过渡。
59 3
FFmpeg开发笔记(四十七)寒冬下安卓程序员的几个技术转型发展方向
|
3月前
|
编解码 安全 Ubuntu
Android Selinux 问题处理笔记
这篇文章是关于处理Android系统中SELinux权限问题的笔记,介绍了如何通过分析SELinux拒绝的日志、修改SELinux策略文件,并重新编译部署来解决权限问题,同时提供了一些SELinux的背景知识和实用工具。
60 0
|
4月前
|
API Android开发
Android 监听Notification 被清除实例代码
Android 监听Notification 被清除实例代码
|
5月前
|
安全 Java Android开发
使用Unidbg进行安卓逆向实例讲解
使用Unidbg进行安卓逆向实例讲解
128 2
|
6月前
|
安全 Linux Android开发
FFmpeg开发笔记(十六)Linux交叉编译Android的OpenSSL库
该文介绍了如何在Linux服务器上交叉编译Android的FFmpeg库以支持HTTPS视频播放。首先,从GitHub下载openssl源码,解压后通过编译脚本`build_openssl.sh`生成64位静态库。接着,更新环境变量加载openssl,并编辑FFmpeg配置脚本`config_ffmpeg_openssl.sh`启用openssl支持。然后,编译安装FFmpeg。最后,将编译好的库文件导入App工程的相应目录,修改视频链接为HTTPS,App即可播放HTTPS在线视频。
107 3
FFmpeg开发笔记(十六)Linux交叉编译Android的OpenSSL库
|
5月前
|
Java API Android开发
技术经验分享:Android源码笔记——Camera系统架构
技术经验分享:Android源码笔记——Camera系统架构
54 0
|
6月前
|
Java 测试技术 开发工具
Android 笔记:AndroidTrain , Lint , build(1),只需一篇文章吃透Android多线程技术
Android 笔记:AndroidTrain , Lint , build(1),只需一篇文章吃透Android多线程技术
下一篇
无影云桌面