下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

Android游戏开发基础|安卓游戏开发入门基础知识

作者:课课家教育     来源: http://www.kokojia.com点击数:1192发布时间: 2016-08-03 16:51:30

标签: 安卓游戏开发Android游戏开发游戏开发基础

  Android游戏开发包括前台渲染技术、常用界面布局、网络开发、SQLite数据库的存取、传感器应用的开发、游戏中经常使用的人工智能算法、流行的物理引擎Box2D以及OpenGLES3D开发等。

Android游戏开发

  每个编程入门时都要先掌握一些基础知识和框架,Android游戏开发入门亦然。本文主要讲了Android游戏开发入门的基础知识,希望能给从事Android游戏开发的朋友提供些许帮助。

  对Android平台开发游戏感兴趣的朋友,需要了解很多Android游戏开发知识。如果你有过游戏开发经验,那么转移到移动平台上来不是特别困难,你只要主攻其架构以及API就行。

  Android是一个基于java环境的系统。这对初学者来说件好事,因为相比C++,Java被广泛认为是一门更容易入门的语言,它是移动开发的规范。Google也做了一件出色的工作,它将API文档化并提供示例代码供使用。其中有个叫做APIDemos的示例几乎展示了所有API的功能。如果你熟悉Java并且用过Eclipse,要让你的第一个应用跑起来那是相当简单。如果你以前从没写过代码,在你前进路上还要学习很多,但别气馁。

  一、Android SDK

  游戏开发初学者的第一步是获取Android SDK(软件开发工具包)。SDK里有一个核心类库,一个模拟器,一些工具和示例代码(建议使用Eclipse和Android Eclipse插件)。如果你使用的是Android系统,Eclipse IDE对Java开发者来说是很好用的。第一次开发Java项目的朋友,可能要下载全套JDK,它里面包括签名和部署应用程序的一些工具。

  二、Android应用程序架构

  首先,要理解Android应用程序架构。否则,设计出来的游戏在线下很难调试。你还需要理解Applications、Activities、Intents以及它们的相互联系。Google提供了很多有用的架构信息。真正重要的是理解为什么你的游戏需要多于一个的Activity,以及怎样才能设计出一个有良好的用户体验的游戏。要理解这些之前,先了解什么是Activity生命周期。

  三、Activity生命周期

  Activity生命周期由Android操作系统来管理。你的activity创建、恢复、暂停、销毁都受操作系统的支配。正确处理这些事件很重要,这样应用程序才能表现良好,做用户认为正确的事。设计游戏之前,首先去了解所有这些是如何工作的,因为以后你可以为自己节省调试时间和重新设计的时间。对大多数应用来说,默认的设置将工作正常,但对于游戏,你可能需要考虑将Single Instance标志打开。当设置为默认时,Android在它认为合适时会创建activity的新实例。对游戏来说,你可能只需要一个游戏activity的实例。这对于你要怎样管理事务的状态有些影响,但对于我来说,这解决了一些资源管理的问题,应予以考虑。

  四、游戏主循环

  根据你写的游戏的类型,你可能需要或不需要一个主循环。如果你的游戏不依赖于时间,或者它只是对用户所做的作出回应,且不做任何视觉上的改变,只是等待用户的输入,那么你就不需要主循环。但如果你写的是动作类游戏或者带有动画、定时器或任何自动操作的游戏,你就可能需要使用主循环。

  游戏的主循环以一个特定的顺序,通常尽可能多的在每秒钟内“滴答”提醒子系统运行。你的主循环需要在它自己的线程里运行,因为Android有一个主用户界面线程,如果你不运行自己的线程,用户界面的线程将会被你的游戏所阻塞,这会导致Android操作系统无法正常地更新任务。执行的顺序通常如下:状态、输入、人工智能、物理、动画、声音、录像。

  更新状态即管理状态转换,例如游戏的结束、人物的选择或进入下一个级别。很多时候,你需要在某个状态上等几秒钟,而状态管理应该处理这种延迟,并且在时间过了之后设置成下一个状态。

  输入是指用户按下的任何键、对于滚动条的移动或者用户的触摸。在处理物理之前处理这些很重要,因为很多时候输入会影响到物理层,因而首先处理输入将会使游戏的反应更加良好。在Android里,输入事件从主用户界面线程而来,因此你必须写代码将输入放入缓冲区,这样你的主循环可以在需要的时刻就从缓冲区里取到它,这并不难。首先,为下一个用户输入定义一个域,然后将on Key Pressed或on Touch Event函数设为接到一个用户动作就放到那个域里,有这两步就够了。如果对于给定游戏的状态,这是一个合法的输入操作,那么所有输入需要在那一刻做的更新操作都已经定下来了,剩下来就让物理去关心怎样响应输入吧。

  人工智能所做的跟用户在决定下一个要“按”哪个按钮类似。人工智能程序,大体意思就是人工智能会按照用户的意图来按按钮。这些有待物理去处理和响应。

  物理可能是、也可能不是真正的物理。对于动作类游戏来说,关键点是要考虑到上一次更新的时间、正在更新的当前时间、用户输入以及人工智能,并且决定它们朝着什么方向发展、是否会发生冲突。对于一个可视化地抓取一些部件并滑动它们的游戏来说,物理就是这个游戏中滑动部件或者使之放入合适的位置的部分。对于一个小游戏来说,物理即使这个游戏中决定答案是错还是对的部分。你可能将其命名为其他东西,但每个游戏都有一个作为游戏引擎的红肉部分(译者注:可能是主体部分的意思),在这篇文章里,我把这部分称为物理。

  动画不像在游戏里放入会动的gif图片那样简单。你需要使得游戏能在恰当的时间画出每一帧。这并不是很难。保留一些像isDancing、danceFrame和lastDanceFrameTime那样的状态域,那样动画更新便能决定是否可以切换到下一帧去了。动画更新真正做的事就那么多。真正来显示动画的变化是由录像更新来处理的。

  声音更新要处理触发声音、停止声音、音量变化以及音调变化。正常情况下,当写游戏的时候,声音更新会产生一些传往声音缓冲区的字节流,但是Android能够管理自己的声音,因而你的选择将是使用SoundPool或者MediaPlayer。它们都需要小心处理以免出错,但你要知道,因为一些底层实现细节,小型、低比特率的声音文件将带来最佳的性能和稳定性。

  录像更新要考虑游戏的状态、角色的位置、分数、状态等,并将一切画到屏幕上。如果使用主循环,你可能要使用SurfaceView,并做一个“推”绘制。对于其他视图,视图本身能够调用绘制操作,主循环不必处理。SurfaceView每秒产生的帧数最多,最适合一些有动画或屏幕上有运动部件的游戏。录像更新要做的是获取游戏的状态,并及时地为这个状态绘制图像。其他的自动化操作最好由不同的更新任务来处理。

  以下是java代码的例子:

  Android游戏开发基础|安卓游戏开发入门基础知识_Android游戏开发_游戏开发基础_课课家

  五、确定做3D还是2D效果

  开始写游戏之前,首先你要确定你是做3D还是2D效果的游戏。2D游戏有一个较低的学习曲线,一般更容易获得良好的性能。3D游戏需要更深入的数学技能,并且需要非常注意,避免性能方面的问题。如果你要画些比较复杂的图形,你还要会使用3D Studio和Maya这种建模工具。Android支持OpenGL用来3D编程,并且在Open GL方面有很多有用的教程可供学习。

  六、建立简单、高质量的方法

  入门时,要确保你整个游戏不要只用一个庞大而冗长的方法。遵循上述的主循环模式将会更加简单。你写的每个方法应当完成一个非常特定的任务,并且它应该无差错地那样做。举例说,如果你需要洗一副纸牌,你应该写一个“shuffleCards”的方法,并且该方法就应该只做这一件事。

  这是一个适用于任何软件开发的编码实践,对于游戏开发来说,这尤为重要。在一个有状态的、实时的系统里,调试将变得非常困难。使你的方法尽量的小,一般的经验法则是每个方法有且仅有一个目的(注:完成且仅完成一个功能)。如果你要为一个场景用编程方式画一个背景,你可能需要一个叫做“drawBackground”的方法。类似这样的任务很快就可以完成,所以你可以按照搭积木的方法来开发你的游戏,而你能够继续添加所要的功能,并且使得这一切更便于理解。

  七、性能很重要

  任何游戏的关键都是性能。游戏开发的目标是使得游戏的反应速度越快越好,看起来越流畅越好。某些方法,如Canvas.drawLine比较慢。并且要将屏幕大小的位图画到主画布上,每一帧都是代价昂贵的。如何权衡对于达到最佳性能很有必要。确保管理好你的资源,采用一些方法技巧,以最少量的CPU资源完成任务。性能差的游戏开发,即使再好玩的游戏也玩得没劲。据调查,人们最难以容忍游戏卡或者响应慢这两个问题。

  八、提示和技巧

  1.可以参考SDK中的示例Lunar Lander。一个游戏每秒需要处理很多帧,所以,Lunar Lander使用Surface View是合适的。若要做3D游戏,示例中有GLView可以处理3D显示的很多初始化工作。比如LightRacer,作者使用了优化、把所有东西都画出来这种方法,大大地提高了帧率。只在视图初始化时把背景画进一个位图里一次,路径放在它们自己的位图里,随着车手的前进而更新。这两个位图在每一帧里都被画进主画布,车手画在顶端,到最后会有一个爆炸。

  2.如果适用,可以让你的位图大小精确等于你打算画到屏幕上的大小,这也是个好的实践。这么做了以后就需要缩放,可以节省CPU资源。

  3.在游戏中,始终一致的位图配置(如RGBA8888)可以减少不同格式之间转换的时间,从而节省图形库的CPU时间。

  4.如果你决定开发3D游戏,但缺乏3D方面的知识,可以挑选一两本3D游戏编程方面的书籍,以及学习线性代数。至少要理解点积、叉积、向量、单元向量、法线、矩阵和变换。想了解这方面的知识可以去看看《3D游戏编程和计算机图形学数学》这本书。

  5.声音文件要小、且比特率低。需要加载的东西越少,加载速度就越快,游戏所需内存也越少。

  6.建议声音使用OGG文件,图片使用PNG文件。

  7.确保释放所有媒体播放器,当Activity销毁时空出所有的资源。这能保证垃圾收集器清除所有东西,也能保证在两次游戏开始之间没有泄露内存。

  8.你可以通过加入Android谷歌小组,寻求社区支持。这里有人可以在开发过程中给你帮助。

  9.最重要的是,花时间进行多次测试,确保每一小部分都能如期地工作。对游戏软件进行升级或改进是整个开发中最耗时最困难的部分。但如果急于将其推向市场,你的游戏很可能会使用户们失望,用户体验度不高,你会感到你的努力都白费了。虽说你不可能让所有人都对你的作品满意,但你至少要尽量提高你发布的作品的质量。

  游戏开发都是由浅入深的,只有夯实基础,注意每一个细节,多角度思考,才能开发出更加吸引人的游戏。

赞(0)
踩(0)
分享到:
华为认证网络工程师 HCIE直播课视频教程