我准备给我哥玩几个单机游戏,给个建议。
获取SDK
新手上路的第一步是拿到Android SDK(软件开发包)。SDK中有一个核心类库,一个仿真器,一些工具和样例代码。我强烈推荐使用Eclipse和Android Eclipse插件。如果你玩Android,Eclipse IDE对Java开发者来说非常有用。如果这是您第一次开发Java项目,您可能需要下载完整的JDK,其中包括一些用于签名和部署应用程序的工具。
学习应用程序架构
不要贸然进入开发的海洋,了解Android应用的架构非常重要。不学的话,你设计的游戏很难离线调试。你需要了解应用程序、活动、意图以及它们之间的相互关系。Google提供了很多有用的架构信息。真正重要的是理解为什么你的游戏需要不止一个活动,以及设计一个用户体验良好的游戏意味着什么。要理解这一点,首先要明白什么是活动生命周期。
学习活动生命周期
活动生命周期由Android操作系统管理。您的活动的创建、恢复、暂停和销毁都由操作系统控制。正确处理这些事件非常重要,这样应用程序才能表现良好,做用户认为正确的事情。在你设计你的游戏之前知道这一切是如何工作的是很好的,因为你可以节省你自己的调试时间和将来昂贵的重新设计时间。对于大多数应用程序,默认设置将正常工作,但对于游戏,您可能需要考虑打开SingleInstance标志。当设置为默认值时,Android将创建一个它认为合适的新活动实例。对于游戏,您可能只需要一个游戏活动实例。这对你如何管理事态有一些影响,但对我来说,它解决了一些资源管理的问题,应该加以考虑。
大循环
根据你写的游戏类型,你可能需要也可能不需要一个主循环。如果你的游戏不依赖于时间或者只是响应用户做了什么,永远等待用户的输入而不做任何视觉上的改变,那么你就不需要主循环。如果你写一个动作游戏或者一个有动画、定时器或者任何自动操作的游戏,你应该认真考虑使用主循环。
游戏的主循环每秒“滴答”一声,提醒子系统按照特定的顺序运行。你的主循环需要在自己的线程中运行,因为Android有一个主用户界面线程。如果不运行自己的线程,用户界面线程会被你的游戏阻塞,导致安卓操作系统的正常更新任务。执行的顺序通常如下:状态、输入、人工智能、物理、动画、声音、视频。
更新状态意味着管理状态转换,如游戏结束、选择角色或下一关。很多时候你需要在某个状态下等待几秒钟,状态管理要处理这个延迟,时间过了之后再设置到下一个状态。
输入是指用户按下的任何键、滚动条的移动或用户的触摸。在处理物理之前先处理这些是很重要的,因为很多时候输入会影响物理层,所以先处理输入会让游戏反应更好。在Android中,输入事件来自主用户界面线程,因此您必须编写代码将输入放入缓冲区,以便您的主循环可以在需要时从缓冲区中获取它。这个不难。首先,为下一个用户输入定义一个域,然后设置onKeyPressed或onTouchEvent函数,在接收到用户操作后将它放入该域。这两步就够了。如果这是一个给定游戏状态的合法输入操作,那么那一刻需要做的所有更新操作都已经决定了,剩下的就是物理要关心如何响应输入了。
人工智能所做的类似于用户决定下一步“按”哪个按钮。学习如何编写一个人工智能程序不在本文讨论范围之内,但大意是人工智能会根据用户的意图按下按钮。这些也需要物理的处理和响应。
物理可能是也可能不是真正的物理。对于动作游戏来说,重点是要考虑上一次更新的时间,当前正在更新的时间,用户的输入和人工智能,决定它们向哪个方向发展,是否会有冲突。对于一个视觉上抓取一些部件并滑动的游戏来说,物理是游戏中滑动部件或将部件放在正确位置的部分。对于一个小游戏来说,物理甚至是游戏中决定答案对错的部分。你可能会给它起别的名字,但每个游戏都有一个红肉部分作为游戏引擎。在本文中,我称这部分为物理。
动画不是在游戏里放动画gif图片那么简单。你需要让游戏在正确的时间画出每一帧。这并没有听起来那么难。保留一些像isDancing、danceFrame、lastDanceFrameTime这样的状态字段,以便动画更新可以决定是否切换到下一帧。动画更新真正做的事情太多了。动画的真实变化是通过视频更新来处理的。
声音更新要处理触发音,停止音,音量变化,音调变化。一般情况下,写游戏的时候,声音更新会生成一些字节流到声音缓冲区,但是安卓可以自己管理声音,所以你的选择会是使用SoundPool或者MediaPlayer。它们都需要小心处理以避免错误,但您应该知道,由于一些底层实现细节,小的低比特率声音文件将带来最佳的性能和稳定性。
视频更新要考虑比赛状态,人物位置,比分,状态等等,把一切都画在屏幕上。如果您使用主循环,您可能需要使用SurfaceView并进行“推送”绘制。对于其他视图,视图本身可以调用绘制操作,主循环不必处理。SurfaceView每秒生成的帧数最多,最适合一些屏幕上有动画或运动部件的游戏。视频更新的工作就是获取游戏的状态,并及时为这种状态绘制图像。其他自动化操作最好由不同的更新任务来处理。
代码是什么样子的?这里有一个例子。
1:公共void run() {
2: while(正在运行){
3:while(isPaused & amp;& amp正在运行){
4:睡眠(100);
5: }
6:update();
7: }
8: }
9:
10:私有void更新(){
11:updateState();
12:update input();
13:update ai();
14:update physics();
15:update animations();
16:updateSound();
17:update video();
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文件的图片。
当活动被破坏时,确保释放所有媒体播放器并释放所有资源。这确保了垃圾收集器清除所有内容,并且游戏之间没有内存泄漏。
加入Android Google团队,寻求社区支持。这里有人可以在开发过程中帮助你。
最重要的是,花时间进行测试和再测试,以确保每个小部件都如您所愿地工作。改进游戏是整个开发过程中最耗时最困难的部分。如果贸然上市,很可能会让用户失望,你会觉得自己所有的努力都白费了。你不能让每个人都喜欢你写的东西,但你至少应该努力出版你的最高质量的作品。
Google在这里有很好的文档可以帮助你开始。
还有很多关于电驴的好书和视频教程~希望对你有帮助。