没有合适的资源?快使用搜索试试~ 我知道了~
iPhone游戏编程实例-俄罗斯方块
4星 · 超过85%的资源 需积分: 10 45 下载量 142 浏览量
2012-02-21
07:04:09
上传
评论 2
收藏 1.46MB PDF 举报
温馨提示
试读
31页
一个基于Cocos2d的IOS实战例子,对大家学习IOS游戏开发还是很有帮助的。
资源推荐
资源详情
资源评论
1
Jamie Gotch:
Fieldrunners底层技术
我对视频游戏的兴趣可以一直追溯到 Commodore 64 年代,那时它只有 4
位颜色和 64KB 的内存。我可不算幸运,在任天堂游戏机(Nintendo Entertain-
ment System)鼎盛时期不能像我的大多数朋友那样拥有它,不过可能幸亏如
此。拥有一个计算机为我带来了更多的机会和可能。随着对视频游戏的兴趣日
益增长,我开始开发自己的游戏。Commodore 64 使我能够做到这一点。开始
学习编程之后不久,我就开始创建自己的游戏,而接下来的事情已成历史就不
用多说了。我的整个学术生涯主要关注于学习编程艺术和提高数学水平,希望
有朝一日可以创建我自己的游戏——这就是 Fieldrunners。
投入 Xcode 和 Objective-C
最初开始开发 Fieldrunners 时,有关 iPhone 开发的一切(Xcode、Objec-
tive- C,甚至使用 OS X)对我来说都是全新的。那时,我的开发经验主要是在
Windows 上编写 C++ 代码。之前我也曾涉足过其他一些语言和平台,不过从
来不需要也没有渴求在 Macintosh 平台上或者为这个平台编写代码,我的意思
是说,这种情况一直持续到 iPhone SDK 的发布。
起 初, 我 还 有 些 迟 疑, 我 知 道, 如 果 转 向 这 样 一 个 平 台, 在 我 对
Objective-C 熟练到可以高效率地完成开发之前,可能要花费很多时间和精力。
不过,我也知道,对于我心中所想的 Fieldrunners(一个快节奏的塔防游戏),
iPhone 再合适不过了。
因此,我毅然决然地投入其中,开始学习创建一个 iPhone 游戏需要的一
切知识。我很快惊讶地发现,所有一切使用起来都那么容易,从操作系统到
Xcode,甚至 Objective-C。当然,我也必须克服一些挑战,正是这些困难促使
我写下这一章,希望能帮助你避免我曾经犯过的错误。
从哪里开始呢
从头创建一个游戏可能相当困难。你早先做出的很多决策都可能会对最
Jamie Gotch:Fieldrunners底层技术2
终产品产生巨大影响。因此,在具体编写代码之前先创建大致的行动计划非常重要。为了创建
这个计划,需要明确要创建什么类型的游戏并确定自身需求。
确定需求
游戏形状各异,大小不同。特别是休闲型游戏,它的需求跨度更广。例如,牌类游戏通常
不需要以很高的帧速率绘制屏幕,也不需要同时播放多种音效。首先了解应用需求,从长期来
讲可以节省大量时间,也可以为你免去很多麻烦。下面这些问题可以帮助你确定游戏的具体需
求。
你的游戏非常依赖于 3D 图形吗?它是基于 sprite 还是使用简单的 2D 形状?
■
你的游戏需要很多同时在屏幕上不断移动的图形元素吗?或者,是不是同时只有一个或
■
两个移动的图形,而其余的图形元素大多数情况下都只是原地不动?
你的游戏同时使用多种音效(比如,爆炸、开火、尖叫)吗?或者,只是每隔几秒才播
■
放一次声音?
你的具体需要可以指示图形和声音编程将使用的技术。
OpenGL ES 与 Quartz
很多人开始开发游戏时问我最多的一个问题就是,到底使用 OpenGL 还是 Quartz。
Quartz 更易于使用,因为它的大多数概念都来自高中几何。与之不同,OpenGL 编程使
■
用了一些更复杂的概念,如矩阵和向量。
Quartz 对于不需要以高帧速率重绘屏幕和只需要 2D 图形的应用非常适用。OpenGL 设
■
计时则特别考虑了 3D 图形。iPhone GPU 支持堪与 Sony PS2 和 PSP 媲美的高速图形。
Quartz 使用的电池电量要少于 OpenGL,因为 OpenGL 更多地使用了 iPhone GPU.
■
OpenAL、AVFoundation 与 CoreAudio
类 似 地, 谈 到 声 音 和 音 乐 播 放 时, 也 有 很 多 选 择, 包 括 OpenAL、AVFoundation 和
CoreAudio 框架。
AVFoundation
■
使用更简单。只需加载你的声音文件,告诉播放器播放、暂停或停止播
放声音。可以创建多个 AVAudioPlayer 实例,在每个实例上加载一个不同的声音,并指
示各个实例播放相应的声音。另一方面,这个框架不能保证播放声音的同步性。
CoreAudio 为你提供了更多控制,允许以很细的粒度同步声音播放的时间,不过它的
■
API 很复杂。
3
Jamie Gotch :Fieldrunners 底层技术
OpenAL 要求使用矩阵和向量在 3D 空间中指定声音位置,这类似于用 OpenGL 指定图
■
形的位置和组成。这使它成为三者之中最复杂的一个 API。
学习 Objective-C
最开始,我认为学习 Objective-C 会非常困难。我看过代码示例,那些奇怪的语法让我迷惑
不解。我根本搞不清楚它是什么意思,尽管我之前已经有丰富的编程经验。Cocoa Touch API 和
它的设计模式更为其增添了复杂性,这个可怕的任务让我忙得晕头转向,而完成之日却遥遥无
期。
我不知道是什么让我成功的,不过我只是不会接受失败,所以一本接一本地看 Cocoa 教程,
而后先后又一本接一本的看 Mac OS X 编程书(那时还没有关于 iPhone 开发的书)。终于,一切
豁然开朗,我就像现在这样理解了这个主题。
如今,已经出现一些有关 iPhone 的书,如 Dave Mark 和 Jeff LaMarche 所著的《iPhone 开
发基础教程》,还有一些开发人员博客和视频课程供有兴趣了解 iPhone 开发的人学习。你甚至
还可以到大学聆听资深 Apple 工程师关于 iPhone 编程的讲座,而且是免费的!如果我能在 18
个月前得到这些信息来源该有多好!不论你喜欢哪种学习方式,总有一种适合你。
我唯一的建议是不要放弃,要不断地去查找教程、图书和视频课程。对于之前你没有涉及
的资源,可以从中学到的内容绝对是难以预料的。我还建议你不要只考虑 iPhone 资源,还可以
看看 Mac OS X 编程资源(如 Mark Dalrymple 和 Scott Knaster 所著的《Objective-C 基础教程》),
还有 Cocoadevcentral.com 网站。它们的编程环境都是 Xcode,而且使用相同的语言和设计模式。
Mac OS X 编程资源有一个好处,Mac OS X 编程团队已经有 10 年的历史,有更多经过实践检验
的提示和技巧可供学习。
从众多资源学习 Objective-C 编程、Cocoa 框架和 Xcode 时,你还会意识到 Objective-C 上
内存管理方法的重要性。下面就来研究这个问题。
研究内存管理方法
iPhone 上内存管理的重要性再强调也不为过。写这本书时,iPhone 和 iPod Touch 有 128
MB 的内存。不过,大多数内存都被操作系统和后台处理所占用,如查看邮件和与 Exchange 同
步日程表。在 iPhone 上,后台处理还包括 SMS 消息和来电通知。即使是最好情况下,你的游
戏也只有 70 MB 的内存可用。如果大量使用 iPhone 来浏览和发送邮件,可用内存可能更少。
很多去年转向 iPhone 和 Objective-C 编程的开发人员有过 Java 和 C# 经验,或者使用过动
态语言(如 Ruby 或 PHP)。这些环境都内置有垃圾回收,将丑陋的内存管理细节对开发人员隐
藏。这通常来说是件好事。
另一方面,Objective-C 仍要求开发人员手动地处理内存管理,像 C 和 C++ 编程中一样。
Jamie Gotch:Fieldrunners底层技术4
iPhone 上的内存管理是开发人员遇到的最常见问题之一。即使老练的 C 和 C++ 程序员也可能被
Objective-C 完成内存管理的做法搞糊涂。
Objective-C 使用一种称为持有计数(retain counts)的内存管理方法。第一次创建一个对象
时,会有一个名为持有计数的属性,该属性初始时设置为 1。在这个对象的生命期中,每次将
这个对象赋至一个数据结构时(如一个集合),持有计数就会增 1。还有一些情况下,你需自行
增加持有计数,如把对象传递到代码的其他部分时。
使用完所持有的对象时,必须记住将其释放,否则就会存在所谓的内存泄漏(memory
leak)。Objective-C 在持有计数设置为 0 之前不会回收这个对象使用的内存。如果没有适当地
管理持有计数,就会耗尽 iPhone 上的可用内存,而操作系统会在最不合适的时候将你的游戏退
出。
理解自动释放
在 Objective-C 中利用自动释放(autorelease)池可以更容易地管理内存。使用自动释放池
时,会把标为自动释放的对象增加到这个池中。以后释放这个池时,其中的所有对象也会被释
放。如果没有使用自动释放池,则要由开发人员负责在不再需要这些对象时手动地释放各个对
象。可以参考图 1 的图示。
图 1 实际的自动释放池
说明
在 iPhone OS 上
,
由于应用在一个内存受限的环境中执行
,
如果方法或代码块中会
创建很多对象
,
那么不鼓励这些方法和代码块使用自动释放池
。
要在可能的时机明确地释放对
象
。
另外
,
使用 Application Kit 开发应用时不需要建立自动释放池
,
因为 Application Kit 会在应
用事件周期内自动建立一个自动释放池
。
自动释放池
5
Jamie Gotch :Fieldrunners 底层技术
除了学习 Objective-C 和 iPhone 上的内存管理很有难度,异常也让我很费解。我发现了一
个很方便的技巧,它非常有助于调试 Objective-C 代码中的异常。
出现异常时中断
这个方便的技巧就是设置一个断点捕获异常。Objective-C 通过调用一个 Objective-C 运行
时函数(名为
obj_exception_throw
)抛出异常。通过在这个函数上设置一个断点,允许你
检查发生崩溃时的调用栈来跟踪崩溃。这是一个很好的帮手!不必再费劲地猜测 EXC_BAD_
ACCESS 错误的原因。调试工具会显示直到出现异常那一刻的整个调用栈,你可以直接跳到导
致崩溃的那一行问题代码。
要 设 置 断 点, 打 开 Breakpoints 编 辑 器,创 建 一个 新的 断 点,名 为
objc_exception_
throw
,如图 2 所示。
图 2 Xcode 调试工具中的 Breakpoints 编辑器
A* 算法
A* 算法非常强大,用途也很广。它主要用于角色在一个布满障碍的地图上导航,不过也可
以用作其他用途。A* 在 Fieldrunners 的实现中就有用到。
很多书已经介绍了 A* 算法的复杂细节,所以本章不再过多深入。本章将简单介绍这个算
法,帮助你了解可以在什么时候以及在哪里使用这个算法。
从高层看 A
*
算法
A* 算法会在避开障碍的同时寻找两个节点之间的最短路径。尽管 A* 算法不要求节点必须
采用某种特定的布置,但是要了解它是如何工作的,最好将节点按一种网格图形摆放。请看图 3
的例子。白方格表示可走的方块,有颜色的方块表示不同类型的障碍。
剩余30页未读,继续阅读
资源评论
- mq807775392012-11-08真的很有用处
- lxwand2013-09-16怎么是空的
- Dracuuula2012-12-23嗯 可以看看 貌似讲的不错
- chuchu03262012-12-21效果不错。正在研究代码
禾子续
- 粉丝: 12
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功