Android游戏开发入门

译自:http://www.rbgrn.net/content/54-getting-started-android-game-development

如果你对开发Android平台游戏感兴趣的话,有一些是你需要了解的。我是Light Racer
, Light Racer 3D,AntigenWixel的开发者,它们现在在Android Market上。我之前开发过游戏,但是Light Racer是我第一个Android 程序,并且我学到了一些关于编写Android游戏的东西,很乐意与大家分享。我还写了一本在线书籍详细记录了 Light Racer 3D的开发,包含了如何做和一些有用的代码片段。如果你之前有过游戏开发的经验,转移到移动平台上开发不会有多大困难,你仅仅需要学习架构和API即可。如果你是一个游戏开发的新手,我收集了一个入门必须要懂得的列表,他适用于不同类型的游戏,包括动作,策略,模拟和解谜。

Android是基于Java环境的。这对于开发新手来说Java比从C++入门要更容易接受。Google的API文档也很详细,并提供了一些具体实例,API
Demos演示了接近100%的API功能叫。如果你熟悉Java并使用过Eclipse,让你的第一个程序运行起来会非常简单。如果你之前从未写过任何代码,那在你前进的过程中,将要理解消化更多的知识,但千万不要气馁。

获得SDK

Android平台入门第一步就是要获得Android SDK(软件开发包)。SDK包括核心类库,模拟器,工具和示例代码。我强烈推荐使用Eclipseandroid eclipse插件。如果你仅用于Android,Eclipse
IDE对Java开发者就足够了。如果这是你第一个Java开发的工程,你要下载Java SE Development Kit (JDK) 它包含了开发你的程序所要的工具。

学习程序架构

要往正确的方向走,第一步首先要理解android程序架构
。如果你不学习他,将来你的设计会很难去修正游戏中问题。你要理解Applications,Activities,Intents和他们之间的相互关系。Google在体系架构上提供了很详细的文档。真正重要的事情是要理解为什么你的游戏会由不止一个Activity组成,并且要知道设计一个良好用户体验的游戏意味着什么。这就是将所有事情都联系到一起的Activity生命周期。

学习activity生命周期

Activity生命周期
由Android操作系统管理。你的activity会依据操作系统的指示被创建,恢复,暂停和销毁。正确地处理这些事件对于一个设计优良的程序来说是非常重要的。在你开始设计你的游戏之前,懂得所有这些是如何运作的是非常好的,他会节约你之后的调试时间和代价昂贵的重新设计时间。对大部分的应用程序来讲,使用默认设置即可,但对于游戏,你会考虑把SingleInstance标志位打开。 当你设为默认值时,android一旦认为合适,就会创建新的activity实例。而对于一个游戏,你可能只想拥有1个activity实例。这会有为你如何管理事物状态带来影响,但对于我来说,他解决了一些资源管理问题,应该是值得考虑的。

主循环(The main loop)

根据你编写的游戏类型,你可能或不可能需要一个主循环。如果你的游戏不是依赖于时间的,或者他仅仅反应用户的操作,一直等待用户的输入而不会有任何界面上的变化,那你不会用到主循环。如果你是编写一个动作游戏或者一个有动画,定时器或者任何自动化的游戏,你应该认真的考虑使用主循环。

一个游戏的主循环是子系统以指定的顺序,每秒钟尽可能多的运行循环。你的主循环要在他自己的线程中运行。原因是Android 有一个主UI线程,如果你不在你自己的线程中运行,UI线程会被你的游戏阻塞,会导致Android 操作系统不能处理任何他自身的正常更新任务。通常的执行顺序如下所示:

1. 状态(State)
2. 输入(Input)
3. AI
4. 物理(Physics)
5. 动画(Animation)
6. 声音(Sound)
7. 视频(Video)

状态
意味着管理状态变化,比如游戏结束,角色选择或者进入下一级别。通常你想在一个状态下等待几秒钟,状态管理器会处理这个延时所发生的事件,并在延时过后设置为下一个状态。

输入
是来自用户的任何按键,滚屏或者触摸。在处理Physics之前处理输入非常重要,因为经常性的输入会影响Physics,因此先处理输入会使游戏更为灵敏。在
Android中,输入事件来自主UI线程,因此你必须要编写一段输入缓冲,以便你的主循环能够在正确的时候识别他。这不是一个困难的任务,为下一用户输入定义一个字段,一旦触发onKeyPressed 或者
onTouchEvent事件,把下一用户动作赋值到这个字段中。所有的输入需要判断在当前游戏状态下是否是合法的,并反应到Physics层面上来。

AI
类似于一个用户决定如何“按”下一步。学习如何编写AI超出了本文的范畴,但总体思想是AI会能像用户那样按下按钮。他也会被Physics取得并反应到。

Physics
变化可能也可能不是真正的物理上的变化。对于动作游戏,他的要点是考虑上次的属性,当前的由用户输入和AI输入更新的属性,来决定所有的物体应该在哪,是否有碰撞发生。对于那些要选取一个物体拖动到别的地方的游戏,他即是那个物体和拖放地点。对于益智问答游戏,即为决定答案正确与否。你也可以起个别的名字,但是每个游戏都有他自己的特点,在本文中,我倾向于称他为Physics。

动画
不是简单的在你的游戏中放入一个动态GIF图片。你会要在适当的时间,游戏画图像帧。他不想听上去的那么困难。维持字段状态,比如isDancing, danceFrame和lastDanceFrameTime,会允许动画根据他决定是时候切换到下一图像帧。这就是动画更新真正要做的。实际上显示动画变化是由视频更新处理的。


声音
更新处理由触发声音,停止声音,改变音量和改变音调。一般情况下,在游戏编写中,声音会产比特流,被发送到声音缓冲,但是Android 管理他自己的声音,你根据游戏来决定是使用SoundPool还是MediaPlayer。由于低层上的实现,他们音质都是有损的,但低比特率的OGG会有更高的性能和稳定性。

视频
会依据游戏状态, 玩家的位置,得分,状态等等,并把所有东西反映到屏幕上。如果使用主循环,你会用到SurfaceView并进行draw操作.
其他的view类,自己会调用draw操作,因此在主循环中就不用再调用了。SurfaceView拥有最高每秒帧数,适合有动画或者屏幕上有运动物的游戏。所有的视频都应依据游戏状态及时的反映出来。其他的自动化操作最好由别的更新任务来处理。

那代码会是什么样的呢? 这是一个例子。



3D 还是2D?

在你开始筹划你的游戏之前,你要决定是用3D还是2D。2D游戏有更平坦的学习曲线,通常更容易取得更好性能。3D游戏需要更多深层次的数学技能,如果你不小心,会遇到性能问题。如果你想要用比方形,球形更复杂的形状,还需要使用3D
Studio和Maya那样的建模工具。Android支持OpenGL用于3D编程,而且可以找到许多很好的OpenGL教程来学习。

构建简单,高质量的方法

在开始时,要确保避免为游戏写一个冗长的方法。如果你遵循我上面描述的主循环模式,那会很容易。你写的每个方法都应该完成一项特殊任务,并且应该没有错误。比如,如果你需要洗牌,你应该有一个"shuffleCards" 方法,并仅用于此。

这是一个适用于所有软件开发的编码实践,但在游戏开发中尤其重要。在一个有状态的实时系统中,调试会变得非常困难。保持你的方法小巧,每个方法应该只实现1个目标。如果你打算在屏幕上画背景,你可能会需要一个"drawBackground"方法。这样做会使你从开发游戏,在增加新的功能时不会过于复杂而难于理解。


效率高于一切(It's all about efficiency!)

性能是所有游戏面临的主要问题,其目标是使游戏尽可能的反应灵敏,看起来尽可能的平滑。某些方法,比如Canvas.drawLine会比较慢。在每帧上画整屏的图像也会消耗很多资源。如何平衡这些是达到最佳性能所必须的。你可以通过有效的管理资源,使用一些技巧减少CPU使用资源来完成你的任务。即使是最好的游戏,如果没有良好的性能,也不会好玩。人们总会在这之间寻求一个平衡点。


提示和技巧

请参考SDK中的LunarLander,他使用了SurfaceView,这对于每秒帧数要求非常高的游戏来说是非常合适的。如果你打算进行3D开发,可参考GLSurfaceView。他负责OpenGL设备初始化以及提供一套渲染机制。我对LightRacer进行了优化,我只在view初始化时将背景添加到位图上。光束在自己的位图上,一旦赛车移动他会被更新。这两个位图都添加到主canvas上,每帧赛车在上,最后是爆炸图。这个技巧使得游戏在一个流畅的比率下运行。


如果可能尽量指定位图的尺寸大小,这是一个良好的实践,他会确保图橡不会缩放并节约了CPU资源。

在游戏中使用一致的位图配置(比如RGBA8888),这将节省图像库CPU的使用率,而不用解释的不同格式的图。

如果你决定开发一个3D游戏而又没有3D知识,你要找一两本3D游戏编程书籍,从线性代数开始学起。最低限度,你必须懂得点积,向量积,矢量,单位矢量,法线,矩阵和平移。我推荐

Mathematics for 3D Game Programming and Computer Graphics

.这本书作为参考。

保持声音文件小巧精干(低比特率)。文件越小,载入越快,游戏用到的内存越少。

声音使用OGG格式,图像使用PNG格式.

确保释放所有媒体播放器,并在activity 被销毁时,你把所有资源清空。这样会保证垃圾收集器能收取到所有垃圾,而不会在游戏启动期间有任何内存泄露。

加入Android Google group并寻求社区支持。那里会有人帮你解决问题。

最重要的是,花时间测试,再测试确保每个小细节都如你所期望的正常运作。把游戏做到精益求精是开发过程中最耗时最艰难的部分。如果你急于投放到市场中,你可能会令人们失望,并使你感到你辛辛苦苦所做的一切都是徒劳的。虽然不可能让100%的人爱上你的作品,但你至少应该尽你所能来发布更高质量的作品。

Google有详尽的入门文档

Light Racer 3D Development Journal中可找到游戏代码和教程

8 评论:

匿名 说...

感谢伟大的信息!我也不会发现这一点,否则!

匿名 说...

可爱的尖锐文章。没想到,这是这并非易事。尊重你!.

匿名 说...

相当不错的职位。我只是偶然发现您的博客和想说的话,我很喜欢浏览你的博客帖子。在任何情况下,我会订阅你的饲料,我希望你写的再次光临!

匿名 说...

IЎЇm delighted that I have observed this weblog. Finally anything not a junk, which we go through incredibly frequently. The website is lovingly serviced and stored up to date. So it need to be, thank you for sharing this with us.

匿名 说...

http://www.saintbarnabasarden.org/drupal615/content/armband-payday-loans-online-greys-mps-lndustry-getup

匿名 说...

payday loans online http://legitpaydayloansonline2.com/ Fundpopog payday loans online Stype [url=http://www.legitpaydayloansonline3.com]Payday loans online[/url] Fast Payday Loans Online In most cases, the only documentation that however need purchases granted for a period of about few months.

匿名 说...

Payday Loans Online http://www.legitpaydayloansonline2.com/ Fundpopog Payday Loans Online Stype [url=http://www.legitpaydayloansonline1.com/]Payday Loans Online[/url] payday loans online The greatest thing about payday loans may but the decor this deal with the other online lenders.

匿名 说...

legit payday loans online http://www.legitpaydayloansonline1.com/ Fundpopog Payday Loans Stype [url=http://www.legitpaydayloansonline3.com/]Instant Payday Loans Online[/url] http://www.legitpaydayloansonline2.com Have the date can be rescheduled by freely having a word with the lender.If you file for chapter 13 bankruptcy, however, you will enter into a what you are interested in when you get into a mishap.The form will not take more basically a money is - locations, for even with a famous cash advance lending company?

My Favorites