Android游戏开发入门

如果你对开发Android平台游戏感兴趣的话,有一些是你需要了解的。我是Light Racer
, Light Racer 3D,Antigen 和 Wixel的开发者,它们现在在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包括核心类库,模拟器,工具和示例代码。我强烈推荐使用Eclipse 和 android 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中可找到游戏代码和教程
订阅:
博文评论 (Atom)
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?
发表评论