Android实例剖析笔记(五)

简介:
 这个系列的前四篇文章介绍了Android sdk中自带的NotePad程序,算是开了个头,这篇开始介绍Android sdk中自带的第二个示例程序—Snake(贪食蛇)。本文将主要介绍我对这个示例程序进行的一些修改。

游戏暂停/继续机制

      由于原来的代码中在游戏运行时没有提供控制选项(比如暂停/继续),因此除非你死了,否则只能玩到底。我这里对代码进行一些修改,加入一个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);
运行效果如下图所示:


    接下来的修改目标是加入得分排行榜机制,再加入一个启动画面和选择菜单。当然,这一篇文章水了点,仅仅记录了自己做的一些小实验,并没有涉及到Snake的代码分析,不过请继续期待下一篇文章。。。


本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2009/08/28/1555873.html,如需转载请自行联系原作者
目录
相关文章
|
5天前
|
Linux 编译器 Android开发
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
在Linux环境下,本文指导如何交叉编译x265的so库以适应Android。首先,需安装cmake和下载android-ndk-r21e。接着,下载x265源码,修改crosscompile.cmake的编译器设置。配置x265源码,使用指定的NDK路径,并在配置界面修改相关选项。随后,修改编译规则,编译并安装x265,调整pc描述文件并更新PKG_CONFIG_PATH。最后,修改FFmpeg配置脚本启用x265支持,编译安装FFmpeg,将生成的so文件导入Android工程,调整gradle配置以确保顺利运行。
24 1
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
|
4月前
|
Java 关系型数据库 数据库
Android App连接真机步骤与APP的开发语言和工程结构讲解以及运行实例(超详细必看)
Android App连接真机步骤与APP的开发语言和工程结构讲解以及运行实例(超详细必看)
36 0
|
7月前
|
编解码 Android开发 开发者
Android平台RTMP多实例推送的几种情况探讨
好多开发者提到,如何实现Android平台,多实例推送,多实例推送,有几种理解: 1. 多路编码,多个实例分别推送到不同的RTMP URL(如Android采集板卡同时接2路出去); 2. 同一路编码,多个实例分别推送到不同的RTMP URL(如推送到内网、外网不同的RTMP服务器); 3. 部分路编码、部分路对接编码后的H.264/AAC数据,多个实例分别推送到不同的RTMP URL(混合推)。
|
3天前
|
存储 Java API
Android系统 文件访问权限笔记
Android系统 文件访问权限笔记
35 1
|
3月前
|
Shell Android开发 数据安全/隐私保护
安卓逆向 -- Frida环境搭建(HOOK实例)
安卓逆向 -- Frida环境搭建(HOOK实例)
44 0
|
6月前
|
Shell Android开发 数据安全/隐私保护
安卓逆向 -- Frida环境搭建(HOOK实例)
安卓逆向 -- Frida环境搭建(HOOK实例)
92 0
|
6月前
|
Java Android开发
[笔记]Android 学习一之转场动画+ViewPager+ListView简单Demo
[笔记]Android 学习一之转场动画+ViewPager+ListView简单Demo
|
6月前
|
Android开发
[笔记]Android开发之相机开发 Camera1、2、X
[笔记]Android开发之相机开发 Camera1、2、X
|
10月前
|
Java Android开发 容器
Android实战开发--小慕笔记UI设计(Fragment布局的使用)
Android实战开发--小慕笔记UI设计(Fragment布局的使用)
Android实战开发--小慕笔记UI设计(Fragment布局的使用)
|
11月前
|
Java
Android_登录注册小实例
首先我对EditView,button,textview外观设置了一下。
56 0