JetBoy游戏深入解析(下)——核心代码分析

By: 海市蜃楼 | In: Android开发

16 十一 2009

有个前面2篇(框架分析JetPlayer类解析)的介绍,相信大家都迫不及待的想知道JetBoyThread这个核心类到底是如何运行的,下面我们就逐步为大家解析。

首先,分析这个类的状态图,如下所示

JetThread-State
这张图就是我们整个程序的循环周期:PLAY——RUNNING——LOSE。根据这张图,我们逐步细化,这里我们重点介绍RUNNING,其他2种状态比较简单,这里就不再说明了。

然后,START_RUNNING 状态逐步细化,详细说明

START_RUNNING状态下的流程图,实际上就分为2部分:事件处理(updateGameState)、画图(doDraw),如下图所示:
JetThread-Run
将上面的2个活动图,逐步细化如下

  • doDraw细化后的活动图,如下图所示:
    JetThread-doDraw
    解析说明:根据状态画当前的游戏实时的图像。
  • updateGameState细化后的活动图,如下图所示:
    JetThread-updateGameState
    解析说明:这是一个循环从消息队列中获取消息的过程,直到消息队列为空。

看到上面的TIMER_EVENT大家是不是绝对奇怪,在Android SDK文档中有明确说明,如下:

Trigger Events :Breaking a MIDI file into individual (non-linear) segments and queueing up those segments for playback in a game based on events within the game is one way JET music files are interactive. Trigger events are an additional method for interactive playback.

也就是说我们可以在segment中定义一些事件,到了特定的时间来触发。在前面已经说过,JET除了播放声音特效意外,应该还有个更加重要的重要:游戏的时钟。我们就可以在segment中定义一些特定的事件,这些时间就相当于是CPU中的时间片。当然MIDI规范中已经定义了很多事件,我们可以自定义事件的ID范围:80-83。查看程序中的代码,如下:

private final byte NEW_ASTEROID_EVENT = 80;
private final byte TIMER_EVENT = 82;

这2个事件分别用来触发产生新的asteroid、界面更新。

至此,整个核心代码的流程,我们都已经分析完了。这个游戏相对来说比较简单,就是通过按下中间键来发射子弹,飞船的位置与当前出现的陨石在一条水平线上,通过计算飞船与陨石的距离来检测是是否集中陨石。

其次,补充说明遗漏的地方

在这里需要补充说的是,在程序中使用了

private Timer mTimer = null;
private TimerTask mTimerTask = null;

这2个就是来实现一个定时器,游戏界面上的时间就是通过这个定时器:定时向主线程发送消息来更新游戏剩余时间的。具体的实现是:通过Handler来绑定到当前线程,然后通过Handler向主线程发送消息,并在Handler中处理消息,这个在Snake游戏中已经说明了,这里就不在详细说明了。

最后,总结说明

这个实例比较复杂,尤其是JET部分,我也是查阅了不少的资料,然后再具体分析阅读,最终把我自己分析的与大家分享,其中有很多地方还不是很详细。这个游戏本身没有什么可玩性,其主要作用是:演示如何通过JET这个引擎来播放声音,以及如何利用JET的事件来作为游戏的时钟;但是通过这个实例,在以后发游戏开发中却为我们提供了一个很好的实例,在以后的游戏开发、应用程序开发中都很值得借鉴。

相关文章

4 Responses to JetBoy游戏深入解析(下)——核心代码分析

Avatar

Crazy24k

十二月 13th, 2009 at 9:46 上午

So Good!
thanks .

Avatar

larry

七月 9th, 2010 at 11:00 上午

感谢博主!

Avatar

tiejiaqishi

七月 23rd, 2010 at 5:39 下午

谢谢

Avatar

音速工作室Android开发中心 » Blog Archive » JetBoy游戏深入解析(上)——框架分析

八月 5th, 2010 at 6:11 下午

[...] JetBoy这个游戏是Android SDK中的一个例子游戏,花了几天的时间,简单的分析了下,为以后编写游戏代码积累一些经验。前面我们介绍了Snake游戏,这个游戏相对比较简单,JetBoy相对复杂些,其主要是告诉我们如何使用JetPlayer类。这个例子程序我们将分3篇幅(框架分析、JetPlayer类解析、核心代码分析)来解析,本篇幅我们主要分析其框架。 [...]

Comment Form

About mo-Android

这里有一群热爱开发的人,我们的文章以原创、翻译为主,包含了我们对Android的认识,对Android的研究,以及一些开发心得和感想,如果 你喜欢我们的站点,喜欢我们的文章,欢迎拍砖,欢迎交流。希望新版的mo-Android能够为你带来更好的体验。

  • sayisee: G1是享受不动了,呵呵~ PS:烦请博主到下面链接,帮忙选投上数第六个(西 [...]
  • fennek: 找了半天,在国家和地区的选项里只有香港,没有中国大陆,运营商里也只 [...]
  • 卡卡西: 1.6能向下兼容1.5的,目前没发现1.5的程序在1.6的机器上有什么问题,作者不要 [...]
  • 张凯: 把我加到群里呗,QQ:82190688 [...]
  • 张凯: 把我加到群里呗,QQ:82190688 [...]

Calendar

2010年九月
« 八    
 12345
6789101112
13141516171819
20212223242526
27282930