Android实例剖析笔记(五)-阿里云开发者社区

开发者社区> 狼人2007> 正文

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(11);

        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);

  运行效果如下图所示:

  

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
10054 0
Android实例剖析笔记(三)
  Activity的生命周期 Activity类中有许多onXXX形式的函数可以重载,比如onCreate,onStart,onStop,onPause,那么它们的调用顺序到底是如何的呢?下面就通过一个实验来进行分析。
634 0
Android实例剖析笔记(四)
  NoteEditor深入分析   首先来弄清楚“日志编辑“的状态转换,通过上篇文章的方法来做下面这样一个实验,首先进入“日志编辑“时会触发onCreate和onResume,然后用户通过Option Menu选择”Edit title”后,会触发onSaveInstanceState和onPause,最后,用户回到编辑界面,则再次触发onResume。
797 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
13869 0
Android实例剖析笔记(一)
  开卷语        俗话说,“熟读唐诗三百首,不会作诗也会吟”。最近收集了很多Android的示例代码,从这些代码的阅读和实验中学习到很多知识,从而产生写这个系列的打算,目标就是一步步跟着实例进行动手实作,真正从“做”中体会和学习Android开发。
778 0
我的Android进阶之旅------&gt;Android自定义窗口标题实例
   该实例的功能比较简单,但是通过该实例的扩展可以在自定义标题中做出菜单导航等实用的功能,为了实现自定义窗口标题,需要做以下几个步骤: 1、给自定义标题提供一个界面 2、将自定义标题应用给Activity窗口 3、把android系统为Activit...
872 0
Android实例剖析笔记(二)
  简介   android提供了三种菜单类型,分别为options menu,context menu,sub menu。   options menu就是通过按home键来显示,context menu需要在view上按上2s后显示。
670 0
+关注
狼人2007
个人对技术的追求:代码少而精捍;思路清晰美观;可扩展好维护;技术驱动商业; 人生格言:只要你有信念,有追求,并且坚持,那你一定比随波逐流,行得远行得正...
3528
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载