首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Android >

【贪吃蛇—Java软件工程师写Android游戏】系列 1.Android SDK Sample-Snake详解

2012-09-09 
【贪吃蛇—Java程序员写Android游戏】系列 1.Android SDK Sample-Snake详解Snake也是一个经典游戏了, Nokia蓝

【贪吃蛇—Java程序员写Android游戏】系列 1.Android SDK Sample-Snake详解
Snake也是一个经典游戏了, Nokia蓝屏机的王牌游戏之一。 Android SDK 1.5就有了它的身影。我们这里就来详细解析一下 Android SDK Sample中的 Snake工程。本工程基于 SDK 2.3.3版本中的工程,路径为: %Android_SDK_HOME% /samples/android-10/Snake

一、 Eclipse 工程

通过 File-New Project-Android-Android Project,选择“ Create project from existing sample”创建自己的应用 SnakeAndroid,如下图:



运行效果如下图:





二、工程结构和类图

其实 Snake的工程蛮简单的,源文件就三个: Snake.java SnakeView.java TileView.java。 Snake类是这个游戏的入口点, TitleView类进行游戏的绘画, SnakeView类则是对游戏控制操作的处理。 Coordinate, RefreshHandler是 2个辅助类,也是 SnakeView类中的内部类。其中, Coordinate是一个点的坐标( x, y), RefreshHandler将 RefreshHandler对象绑定某个线程并给它发送消息。如下图:



任何游戏都需要有个引擎来推动游戏的运行,最简化的游戏引擎就是:在一个线程中 While循环,检测用户操作,对用户的操作作出反应,更新游戏的界面,直到用户退出游戏。

在 Snake这个游戏中,辅助类 RefreshHandler继承自 Handler,用来把 RefreshHandler与当前线程进行绑定,从而可以直接给线程发送消息并处理消息。注意一点: Handle对消息的处理都是异步。 RefreshHandler在 Handler的基础上增加 sleep()接口,用来每隔一个时间段后给当前线程发送一个消息。 handleMessage()方法在接受消息后,根据当前的游戏状态重绘界面,运行机制如下:



运行机制

这比较类似定时器的概念,在特定的时刻发送消息,根据消息处理相应的事件。 update()与 sleep()间接的相互调用就构成了一个循环。这里要注意: mRedrawHandle绑定的是 Avtivity所在的线程,也就是程序的主线程;另外由于 sleep()是个异步函数,所以 update()与 sleep()之间的相互调用才没有构成死循环。

最后分析下游戏数据的保存机制,如下:



这里考虑了 Activity的生命周期:如果用户在游戏期间离开游戏界面,游戏暂停;或者由于内存比较紧张, Android关闭游戏释放内存,那么当用户返回游戏界面的时候恢复到上次离开时的界面。

三、源码解析

详细解析下源代码,由于代码量不大,以注释的方式列出如下:

1、 Snake.java



3、 TileView.java





四、工程文件下载

为了方便大家阅读,可以到如下地址下载工程源代码:

http://download.csdn.net/source/3145349

五、小结及下期预告:

本次详细解析了 Android SDK 自带 Sample—— Snake的结构和功能。下次将会把这个游戏移植到 J2ME平台上,并且比较 Android和 J2ME的区别和相通之处,让从事过 J2ME开发的朋友对 Android开发有个更加直观的认识。 public class Dingyige{ Public static void main(String [] arg){ System.out.println("楼主辛苦了"); }}
19 楼 tinren 2011-04-20   受益匪浅,入门的经典,谢谢 20 楼 zhdkn 2011-04-29   android刚入门,值得看看 21 楼 追梦人21 2011-05-02   楼主你好,看了你对于贪吃蛇的代码的讲述,我受益匪浅,非常感谢楼主可以奉献出来帮助新人。不过我有一个疑问,希望可以得到楼主的解答。

楼主的运行效果图的第一张应该是点击“上”之后开始初始化的界面,我的疑问就在这里。我也做了一个测试,这是创建蛇身的第一个代码,也就是蛇头,mSnakeTrail.add(new Coordinate(7, 7)); 默认的方向是北方,而 运行出来是黄色的蛇头的坐标明显不是(7,7)而是(7,5)。

为了进一步验证,我将创建蛇身的代码就只保留了这一句,也就是只创建一个蛇头,当当next方向为北时,蛇头坐标为(7,5),next方向为南时,蛇头方向为(7,9),next方向为东时,蛇头方向为(9,7),next方向为西时,蛇头坐标为(5,7)。很明显,在游戏开始时,蛇头已经朝next方向前进了两个单位。

请问楼主这是为什么呢?该怎么解释这一现象呢?希望可以得到楼主的回复,祝您工作愉快!

22 楼 追梦人21 2011-05-06   是因为我的问题在第三页,没有被楼主看到吗?谁来帮忙解决一下这个问题啊!!! 23 楼 deaboway 2011-05-12   追梦人21 写道是因为我的问题在第三页,没有被楼主看到吗?谁来帮忙解决一下这个问题啊!!!

你很认真哦,最近有点小忙,刚看到。

请注意:

    // 更新蛇 
    private void updateSnake() { 
        // 生长标志 
        boolean growSnake = false; 
 
        // 得到蛇头坐标 
        Coordinate head = mSnakeTrail.get(0); 
        // 初始化一个新的蛇头坐标 
        Coordinate newHead = new Coordinate(1, 1); 
 
        // 当前方向改成新的方向 
        mDirection = mNextDirection; 

当你按向上键的时候,其实新的蛇头已经产生了,所以,你会看到新的蛇头不是原来的蛇头。 24 楼 lrh_java 2011-05-16   是个很好的例子,马上入门!

热点排行