您现在的位置:首页 > >

Android游戏开发教程

发布时间:

Android 游戏开发教程
如果你有兴趣为Android平台开发游戏,有很多你需要了解的东 西。我是Light Racer,Light Racer 3D以及Wixel的开发者,这些游 戏目前在Android Market上有售。我以前也开发过游戏,但Light Racer是我的第一个Android应用程序,我从中学到了很多Android游 戏开发知识,也愿意与诸位分享。我甚至写了一本在线的书详细介绍 了Light Racer3D的开发,内容全是教你怎样做以及有用的代码片段。 如果你有过游戏开发经验,那么转移到移动平台上来将不是特别困难。 你主要只需学习其架构以及API就行了。如果你是一名游戏开发新手, 我总结了一张列表,上面有你必需知道的东西,供你起步用。这些知 识适用于很多类型的游戏,包括动作类、策略类、模拟类和益智类。
Android是一个基于Java的环境。这对初学者来说是个好消息, 因为相对于C++,Java被广泛认为是一门更容易上手的语言,它是移 动开发的规范。Google也做了一件出色的工作,它将API文档化并提 供示例代码供使用。其中有个叫做API Demos的示例几乎展示了所有 API的功能。如果你熟悉Java并且用过Eclipse,要让你的第一个应用 跑起来那是相当简单。如果你以前从没写过代码,在你前进路上还要 学习很多,但别气馁。
获取SDK

新手上路的第一步便是获取Android SDK(软件开发工具包)。SDK 里有一个核心类库,一个模拟器,一些工具和示例代码。我强烈建议 使 用 Eclipse 和 Android Eclipse 插 件 。 如 果 你 玩 Android 的 话 , Eclipse IDE对Java开发者来说很好用。如果这是你第一次开发Java 项目,你可能会需要下载全套JDK,它里面包括签名和部署你的应用 程序的一些工具。
学习应用程序架构
别急着一头扎进开发的海洋里,理解Android应用程序架构是很 重要的。如果你不学一下,你设计出来的游戏在线下将很难调试。你 将需要理解Applications、Activities、Intents以及它们怎样相互 联系。Google提供了很多有用的架构信息。真正重要的是要理解为什 么你的游戏需要多于一个的Activity,以及什么才是设计一个有良好 用户体验的游戏。要理解这些,首先要了解什么是Activity生命周期。
学习Activity生命周期
Activity生命周期由Android操作系统来管理。你的activity创 建、恢复、暂停、销毁都受操作系统的支配。正确处理这些事件是很 重要的,这样应用程序才能表现良好,做用户认为正确的事。在你设

计你的游戏之前了解所有这些是如何工作的是件好事,因为以后你可 以为自己节省调试时间和昂贵的重新设计时间。对大多数应用来说, 默认的设置将工作正常,但对于游戏,你可能需要考虑将 SingleInstance标志打开。当设置为默认时,Android在它认为合适 时会创建activity的新实例。对于游戏来说,你可能只需要一个游戏 activity的实例。这对于你要怎样管理事务的状态有些影响,但对于 我来说,这解决了一些资源管理的问题,应予以考虑。
主循环
根据你写的游戏的类型,你可能需要也可能不需要一个主循环。 如果你的游戏不依赖于时间或者它仅仅对用户所做的加以回应,并且 不做任何视觉上的改变,永远等待着用户的输入,那么你就不需要主 循环。如果你写的是动作类游戏或者带有动画、定时器或任何自动操 作的游戏,你应该认真考虑下使用主循环。
游戏的主循环以一个特定的顺序通常尽可能多的在每秒钟内 “滴答”提醒子系统运行。你的主循环需要在它自己的线程里运行, 原因是Android有一个主用户界面线程,如果你不运行自己的线程, 用户界面线程将会被你的游戏所阻塞,这会导致Android操作系统无 法正常的更新任务。执行的顺序通常如下:状态,输入,人工智能, 物理,动画,声音,录像。

更新状态意思是管理状态转换,例如游戏的结束、人物的选择或 下一个级别。很多时候你需要在某个状态上等上几秒钟,而状态管理 应该处理这种延迟,并且在时间过了之后设置成下一个状态。
输入是指用户按下的任何键、对于滚动条的移动或者用户的触摸。 在处理物理之前处理这些是很重要的,因为很多时候输入会影响到物 理层,因而首先处理输入将会使游戏的反应更加良好。在Android里, 输入事件从主用户界面线程而来,因此你必须写代码将输入放入缓冲 区,这样你的主循环可以在需要的时刻就从缓冲区里取到它。这并非 难事。首先为下一个用户输入定义一个域,然后将onKeyPressed或 onTouchEvent函数设为接到一个用户动作就放到那个域里,有这两步 就够了。如果对于给定游戏的状态,这是一个合法的输入操作,那么 所有输入需要在那一刻做的更新操作都已经定下来了,剩下来就让物 理去关心怎样响应输入吧。
人工智能所做的类似于用户在决定下一个要“按”哪个按钮。学 习怎样写人工智能程序超出了这篇文章的范围,但大体的意思是人工 智能会按照用户的意图来按按钮。这些也有待物理去处理和响应吧。
物理可能是也可能不是真正的物理。对于动作类游戏来说,关键 点是要考虑到上一次更新的时间、正在更新的当前时间、用户输入以

及人工智能,并且决定它们朝着什么方向发展和是否会发生冲突。对 于一个你可视化地抓取一些部件并滑动它们的游戏来说,物理就是这 个游戏中滑动部件或者使之放入合适的位置的部分。对于一个小游戏 来说,物理即使这个游戏中决定答案是错还是对的部分。你可能将其 命名为其他东西,但每个游戏都有一个作为游戏引擎的红肉部分(译 者注:可能是主体部分的意思),在这篇文章里,我把这部分称为物 理。
动画并非像在游戏里放入会动的gif图片那样简单。你需要使得 游戏能在恰当的时间画出每一帧。这并没有听起来那么困难。保留一 些像isDancing、danceFrame和lastDanceFrameTime那样的状态域, 那样动画更新便能决定是否可以切换到下一帧去了。动画更新真正做 的事就那么多。真正来显示动画的变化是由录像更新来处理的。
声音更新要处理触发声音、停止声音、音量变化以及音调变化。 正常情况下当写游戏的时候,声音更新会产生一些传往声音缓冲区的 字节流,但是Android能够管理自己的声音,因而你的选择将是使用 SoundPool或者MediaPlayer。它们都需要小心处理以免出错,但你要 知道,因为一些底层实现细节,小型、低比特率的声音文件将带来最 佳的性能和稳定性。
录像更新要考虑游戏的状态、角色的位置、分数、状态等等,并

将一切画到屏幕上。如果使用主循环,你可能需要使用SurfaceView, 并做一个“推”绘制。对于其他视图,视图本身能够调用绘制操作, 主循环不必处理。SurfaceView每秒产生的帧数最多,最适合于一些 有动画或屏幕上有运动部件的游戏。录像更新所要做的工作是获取游 戏的状态,并及时地为这个状态绘制图像。其他的自动化操作最好由 不同的更新任务来处理。
代码看起来是什么样的?这儿有个例子。
1: public void run() {
2: while (isRunning) {
3: while (isPaused && isRunning) {
4: sleep(100);
5: }
6: update();
7: }

8: } 9: 10: private void update() { 11: updateState(); 12: updateInput(); 13: updateAI(); 14: updatePhysics(); 15: updateAnimations(); 16: updateSound(); 17: updateVideo(); 18: }

3D还是2D?
在开始写游戏之前,你要决定是做3D的还是2D的。2D游戏有一个 低得多的学习曲线,一般更容易获得良好的性能。3D游戏需要更深入 的数学技能,并且如果你不在意的话会有性能问题产生。如果你打算 画比方框和圆圈更复杂的图形,还需要会使用3D Studio和Maya那样 的建模工具。Android支持OpenGL用来3D编程,并且在OpenGL方面有 很多很好的教程可供学习。
建立简单、高质量的方法
上手时,要确保你整个游戏不要就用一个庞大而冗长的方法。如 果你遵循我上面描述的主循环模式,这将相当简单。每个你写的方法 应当完成一个非常特定的任务,并且它就应该无差错地那样做。举例 来说,如果你需要洗一副纸牌,你应该写一个“shuffleCards”的方 法,并且该方法就应该只做这一件事。
这是一个适用于任何软件开发的编码实践,但对于游戏开发来说 这尤为重要。在一个有状态的、实时的系统里,调试将变得非常困难。 使你的方法尽量的小,一般的经验法则是每个方法有且仅有一个目的 (译者注:完成且仅完成一个功能)。如果你要为一个场景用编程方

式画一个背景,你可能需要一个叫做“drawBackground”的方法。诸 如此类的任务能够很快完成,因而你可以按照搭积木的方法来开发你 的游戏,而你能够继续添加你要的功能,并且不会使得这一切难以理 解。
最重要的是效率!
性能是任何游戏的主要问题。我们的目标是使得游戏的反应越快 越好,看起来越流畅越好。某些方法如Canvas.drawLine比较慢。并 且要将屏幕大小的位图画到主画布上,每一帧都是代价昂贵的。如何 权衡对于达到最佳性能很有必要。确保管理好你的资源,使用技巧来 以最少量的CPU资源完成你的任务。如果性能不好的话,即使是最好 的游戏玩起来也没劲。人们一般对于游戏卡或者响应慢几乎难以容忍。
提示和技巧
看一下SDK中的示例LunarLander。它使用SurfaceView,这对于 一个每秒需要处理最多帧的游戏来说是合适的。如果你要做3D,示例 中有GLView可以处理3D显示的很多初始化工作。对LightRacer来说, 我不得不优化把所有东西都画出来这种方法,否则帧率将会大大地降 低。我只在视图初始化的时候把背景画进一个位图里一次。路径放在 它们自己的位图里,随着车手的前进而更新。这两个位图在每一帧里

都被画进主画布中去,车手画在顶端,到最后会有一个爆炸。这种技 术使得游戏运行在一个可以玩的程度。
如果适用的话,使得你的位图的大小精确等于你打算画到屏幕上 的大小,这也是个好的实践。这么做了以后就需要缩放,可以节省CPU 资源。
在游戏中始终一致的位图配置(如RGBA8888)。这将会通过减少 不同格式之间转换的时间来节省图形库的CPU时间。
如果你决定开发3D游戏但没有3D方面的知识,你需要挑选一两本 3D游戏编程方面的书并学习线性代数。你最少要理解点积、叉积、向 量、单元向量、法线、矩阵和变换。这方面我遇到的最好的书是叫《3D 游戏编程和计算机图形学数学》。
声音文件要小而且低比特率。需要加载的越少,加载速度越快, 游戏所需内存越少。
声音使用OGG文件,图片使用PNG文件。
确保释放所有媒体播放器,当Activity销毁时空出所有的资源。 这能保证垃圾收集器清除了所有东西,也能保证在两次游戏开始之间

没有内存泄露。
加入Android谷歌小组,寻求社区支持。这里有人可以在开发过 程中给你帮助。
最重要的是,花时间测试再测试,确保每一小部分都如你所愿地 工作。改善游戏是整个开发中最耗时最困难的部分。如果你匆匆将其 推向市场,你很可能会使用户们失望,你会感到你的努力都白费了。 你不可能使所有人都喜欢你写的东西,但你至少要尽量发布你最高质 量的作品。
Google在这里有帮助你上手的绝佳的文档。
在Light Racer 3D开发日志可以找到可工作的示例代码和指导。
(ps:本文章由北大青鸟广安门校区搜集自互联网)

记住,永远不要对父母说这十句话!

1.好了,好了,知道,真啰嗦!(可怜天下父母心,父母的“啰嗦”其实是一种幸福。) 2.有事吗,没事?那挂了啊。(父母打电话,也许只想说说话,我们能否明白他们的用意,不要匆忙挂了电话!) 3.说了你也不懂,别问了!(他们只是想和我们说说话。) 4.跟你说了多少次不要你做,做又做不好。(一些他们已经力不能及的事,我们因为关心而制止,但不要这样让他们觉得自己很无用。) 5.你们那一套,早就过时了。(父母的建议,也许不能起到作用,可我们是否能换一种回应的方式?) 6.叫你别收拾我的房间,你看,东西找都找不到!(自己的房间还是自己收拾好,不收拾,也不要拂了老人的好意。) 7.我要吃什么我知道,别夹了!(盼着我们回家的父母总想把所有关心融在特意做的菜里,我们默默领情就好。) 8.说了别吃这些剩菜了,怎么老不听啊!(他们一辈子的节约习惯,很难改,让他们每次尽量少做点菜就好。) 9.我自己有分寸,不要老说了,烦不烦。(他们只是担心你吃亏。) 10.这些东西说了不要了,堆在这里做什么啊!(人老了都会念旧……) 当你还在襁褓时,她便天天抱着你,哄你入睡;当你到少年时代,她便天天念叨着你,夜夜帮你捻着棉被;当你终于离开家,远行他方,她便天天牵挂着你。 有时候,我们总是在抱怨母亲的唠叨、念叨,总是在心烦她那些说了无数遍的关心话语。都说儿女是父母前辈子欠下的债,这句话不假。让我们感恩于心,让我们感恩父母那些点滴的关 怀。 如果有一天,你发现母亲煮的菜太咸太难吃,如果有一天,你发现父母经常忘记关电器; 如果有一天,你发现父亲的花草树木已渐荒废,如果有一天,你发现家中的地板衣柜经常沾满灰尘; 如果有一天,你发现父母不再爱吃青脆的蔬果,如果有一天,你发现父母爱吃煮得烂烂的菜; 如果有一天,你发现吃饭时间他们老是咳个不停,千万别误以为他们感冒或着凉(那是吞咽神经老化的现象); 如果有一天,你发觉他们不再爱出门……也许是因为身体一天不如一天…… 每个人都会老,父母会比我们先老。当父母不能照顾自己的时候,很多事情做得不好的时候,请不要嫌弃他们,并请维持他们的“自尊心”. 当他们不爱洗澡时,请抽空定期帮他们洗身体,因为纵使他们自己洗也不可能洗干净; 当我们享受美食的时候,请替他们准备大小适当、容易咀嚼的一小碗。他们不爱吃,可能是因为牙齿咬不动了。 曾经听到过这样一个说法:其实,每位母亲都是一位漂亮的仙女,她们有一件非常美丽的衣裳。可是当她决定做某个孩子母亲的时候,当她准备呵护某个生命的时候,就会褪去这件美丽 的衣裳,变成一名普通的女子,一辈子,平淡无奇。



热文推荐
猜你喜欢
友情链接: 工作计划 总结汇报 团党工作范文 工作范文 表格模版 生活休闲