【贪吃蛇—Java程序员写Android游戏】系列 1.Android SDK.doc
文本预览下载声明
?
【贪吃蛇—Java程序员写Android游戏】系列 1.Android SDK Sample-Snake详解
分类:?1.Android?【贪吃蛇—Java程序员写Android游戏】2011-03-31 16:18?7307人阅读?评论(13)?收藏?举报
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
[java]?view plaincopy
/**?
?*?pTitle:?Snake/p?
?*?pCopyright:?(C)?2007?The?Android?Open?Source?Project.?Licensed?under?the?Apache?License,?Version?2.0?(the?License)/p?
?*?@author?Gavin?标注?
?*/??
package?com.deaboway.snake;??
import?android.app.Activity;??
import?android.os.Bundle;??
import?android.widget.TextView;??
/**?
?*?Snake:?a?simple?game?that?everyone?can?enjoy.?
?*??
?*?This?is?an?implementation?of?the?classic?Game?Snake,?in?which?you?control?a?
?*?serpent?roaming?around?the?garden?looking?for?apples.?Be?careful,?though,?
?*?because?when?you?catch?one,?not?only?will?you?become?longer,?but?youll?move?
?*?faster.?Running?into?yourself?or?the?walls?wil
显示全部