Snake是Android SDK例子程序中的一个小游戏,工程源代码:android-sdk-windows-1.5_r2\platforms\android-1.1\samples\Snake。这个小游戏在手机、游戏机、电脑中都出现过,游戏具体的玩法想必大家都知道,我主要是从Android开发应用程序的角度来分析这个游戏的框架、结构等。

首先将工程添加到Eclipes中,看源代码,分析类之间的关系,如下:
​​​​

整个工程主体也就3个类:Snake,SnakeView,TitleView。Activity,View,Handler是Android SDK提供的基础类,Coordinate,RefreshHandler是2个辅助类,也是SnakeView类中的内部类。其中,Coordinate就相当于是一个点的坐标(x,y),RefreshHandler的主要功能是将RefreshHandler对象绑定某个线程并与给它发送消息。Snake类是这个游戏的入口点,TitleView类负责游戏的绘画,SnakeView类负责对游戏控制操作的处理。

类的结构在上图中已经清晰说明,主要接口解析如下:

 

TitleView  extends  View

继承的接口

onSizeChanged()

在视图大小改变的时候调用,比如说手机由垂直旋转为水平

onDraw()

在视图需要重画的时候调用,比如说使用invalidate刷新界面上的某个矩形区域

Snake  extends  TitleView

继承的接口

onKeyDown()

监听用户键盘操作,并处理这些操作

新增加的接口

restoreState()/saveState()

恢复/保存游戏的数据

update()

重新计算当前游戏的数据

 

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

 

先解析下RefreshHandler这个辅助类的作用,RefreshHandler继承至Handler,其主要作用就是把RefreshHandler与当前线程进行绑定,然后就可以直接给线程发送消息并处理消息,有一点需要强调的是:Handle对消息的处理都是异步。RefreshHandler在Handler的基础上增加sleep()接口,其主要作用就是每隔一个时间段后给当前线程发送一个消息;而handleMessage()则就是在接受消息后,让界面对当前的游戏状态作出处理,运行机制如下:

​​

实际上以上就相当于一个定时器,在特定的时刻发送消息,根据消息处理相应的事件。Update()与Sleep()这2个函数间接的相互调用就构成了一个循环。

需要注意的是:mRedrawHandle绑定的是Avtivity所在的线程,也就是程序的主线程;另外由于sleep()是个异步函数,所以Update()与Sleep()之间的相互调用才没有构成死循环。

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

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

Snake源代码的内部细节,就不额外说明,在了解了框架后,再阅读代码就轻松多了。

总结说明

通过学习Snake这个简单的游戏,初步学习了如何开发游戏的界面、如何处理游戏的交互、如何保存游戏的数据等,这为我们以后开发更加复杂的游戏打好坚实的基础。

参考网址:​​http://www.moandroid.com/?p=474​