iPhone 游戏开发教程 游戏引擎 (5)是本文要介绍的内容,继续上一章的你内容开始介绍,本节主要介绍了声音引擎和事件的内容,关于事件的介绍,下篇文章将会详细介绍。
声音引擎
声音是游戏开发中经常忽略的一的环节,但是当你知道声音构成了人类玩视频游戏的1/3的感觉时,你肯定会很困窘。在合适的时机播放正确的声音使得程序员仅作很小的工作就可以为游戏增加分数。
基本的音效特征包括载入和卸载声音样本、播放声音、停止播放、暂停播放以及循环播放。典型的,所有的声音都可以以同样的音量播放,但是你可能希望玩家调整以使所有的声音都符合他们的喜好。
声音样本
在播放音效之前,你需要从文件或者缓存中载入声音样本。IPHONE API支持AAC与MP3格式的高品质的声音,也支持PCM和IMA4的小样品,以及其他一些格式。
播放声音
一旦载入了声音样本,API提供了函数以开始和停止播放样本。大多数API还提供了暂停和继续功能,还有一些允许你从特定点开始播放。虽然还有更多高级特性,但是基本上以上就是程序员全部所需要的了。
多声道声音
因为声音播放依赖于硬件,你在同一时间可以听到的声音是有限的。每种声音播放时都使用一个声道。在IPHONE中,所有的MP3和AAC样本共用相同的硬件声道,而且只有一个是可用的,多声道支持PCM和IMA4。
这意味着同一时间,只有一个MP3/AAC格式的样本可以被播放。典型的,但多个PCM/IMA4样本可以同时播放多个样本(同时与MP3/AAC播放)。
音乐与SFX
游戏中的大部分声音都可以分为两大类:环境音(典型的,背景音乐)和音效(SFX)。有时,用环境音代替音乐,但他们都共享同样的特点。
音乐一般是重复播放一个相对长的样本或者引出下一段音乐样本。通常情况下,只有一首音乐在同一时间播放,使得MP3/AAC格式限制变成了一个不成问题的问题。
声效要短的多,而且需要许多不同的样本,在同一时间重叠播放。PCM/IMA4格式很好的满足了这个需求。
由于PCM/IMA4也只有有限的声道数,因此如果你打算同时播放很多的SFX样本,其中一些可能不能被播放。所以,为SFX音效设定优先级以确保某些音效一定能播放就显得很重要了。
例如,让我们讨论之前提到的我们的玩家虚拟人偶走进了一个满是愤怒的犀牛的房间。每头犀牛都会播放愤怒的鼻息声,可能还会接着播放撞人的声音,而玩家虚拟人偶则会发出害怕的哭叫声。我们会给与玩家虚拟人偶声效更高的优先级,以使其不会被犀牛的撞人声效所淹没。
幸运的是,目前的IPHONE支持至少32声道,所以一般不太可能需要在这个平台上去刻意安排优先级。
输出设备与干扰
IPHONE支持内置的对讲机与听筒作为输出设备。建议不要同时使用它们。当玩家将听筒插入到IPHONE中时,音频会自动改为从听筒播放。
由于IPHONE是移动设备,有可能玩家在路上在的时候,听筒会掉落。一个好的设计选择是当听筒被移除的时候暂停游戏以给玩家足够的时间让他重新接入耳机。此时,你也可以选择同时提供停止播放声音。
最重要的是,应该从玩家的用户角度来考虑声效。玩你的游戏并不是用户使用IPHONE的***标准,所以不要让你的声效的优先级打扰到用户,否则玩家会将其关掉。
用户输入
游戏引擎的玩家输入部分集中于来接收自于操作系统的低层次的事件,然后将其转化为高层次的事件,这样,游戏逻辑代码可以在PC游戏中使用它。低层次的事件可以是鼠标和键盘事件。对于控制台游戏,他们可能产生于控制器的手、触发器与按钮。在我们的例子里面,IPHONE会处理触摸与旋转事件。
触摸事件
触摸屏接口的设计方式与其他大多数移动手机、控制台与PC平台的接口设计方式有着根本的区别。在用户触摸屏幕与应用程序接收到该事件之间有延迟(尽管IPHONE已经在将缩短延迟方面做的足够好了),但是真正的问题是,不管何时用户做出触摸动作,他的手指都会遮盖住部分屏幕,大大降低了游戏画面的可见性。
你可以通过提供一个图形按钮给用户来点击(回到了按钮点击系统,代价是屏幕空间),或者提供一个聪明的隐喻来解决这个问题。比如,如果玩家点击了屏幕上的一块空间,你可以让虚拟人偶朝那个方向走。这样可以省去用户的连续点击输入。
尽管用户接口设计是游戏设计人员的责任,但是编程人员需要告诉设计人员这个平台可以做什么和不能做什么。IPHONE支持以下触摸事件:
触摸开始
触摸移动
触摸结束
触摸取消
你可能会问什么情况下会触发“触摸取消”事件。当某个事件将你的应用程序挂起在“触摸开始”事件与“触摸结束”事件之间时,程序会收到“触摸取消”事件通知你不会收到其他的事件(如触摸结束)。
为了处理多点触摸,包含一个UITouch对象list的UIEvent对象被发送到你的应用程序中。如果只有一个指头触摸到屏幕,你只会接收到一个UITouch对象;如果两个指头触摸到屏幕,你会接收到两个UITouch对象等等。而且IPHONE可以追踪正在发生或最近发生的连续的5次轻击事件(一个触摸开始事件后紧跟一个触摸结束事件)。
不幸的是,通过以上事件来判断用户是单击、双击、扫过或者压缩动作会可能变得比较麻烦。虽然不是很困难,但是在一开始并不是很容易正确处理。看以下例子:
- Time 0: TouchStart - numTaps(0) numTouches(1) Touches { (40,40) }
- Time 100: TouchEnd - numTaps (1) numTouches(1) Touches { (40,40) }
- Handle single-tap..
到目前为止,用户触摸了屏幕一次,你的代码可以执行相应的单击处理逻辑。但是稍等!
- Time 0: TouchStart - numTaps(0) numTouches(1) Touches { (40,40) }
- Time 100: TouchEnd - numTaps (1) numTouches(1) Touches { (40,40) }
- Handled single-tap.. INCORRECTLY
- Time 200: TouchStart - numTaps (1) numTouches(1) Touches { (40,40) }
- Time 300: TouchEnd - numTaps (2) numTouches(1) Touches { (40,40) }
- FAILED to handle double-tap
用户第二次轻击了屏幕。如果你已经在收到触摸结束的事件时进行了处理,可能错误的处理了用户实际上的双击处理。
我们应该如何正确处理这种情况呢?解决方法是将***次触摸结束事件推迟为定时回调。当***次接收到触摸结束事件时,我们设置一个回调。如果我们在回调之前接收到了第二次触摸结束事件,我们可以判定用户进行了双击,并取消回调,执行双击处理。我们接收到了回调,我们认为用户没有进行双击并应该进行单击处理。
这里有表达两种情况的例子:
- Time 0: TouchStart - numTaps(0) numTouches(1) Touches { (40,40) }
- Time 100: TouchEnd - numTaps (1) numTouches(1) Touches { (40,40) }
- Initiate callback timer
- Time 200: TouchStart - numTaps (1) numTouches(1) Touches { (40,40) }
- Time 300: TouchEnd - numTaps (2) numTouches(1) Touches { (40,40) }
- Handle double-tap, cancel callback
这次,玩家进行了双击而且代码进行了正确的处理。
- Time 0: TouchStart - numTaps(0) numTouches(1) Touches { (40,40) }
- Time 100: TouchEnd - numTaps (1) numTouches(1) Touches { (40,40) }
- Initiate callback timer
- Time 500: Callback recieved
- Handle single-tap
现在,玩家进行了单击而且代码也进行了正确的处理。
注意,你不必为那些仅期待单击事件的接口加上这些处理。
侦测诸如扫过的动作会更麻烦一点,但也更容易正确处理。代码中必须为每次触摸保存起始点与终点,并算出用户划的线的方向是向上、向下、向左、还是向右。还要判断他的手划过的是否足够快。
小结:iPhone 游戏开发教程 游戏引擎 (5)的内容介绍完了,希望本文对你有所帮助!想要深入了解iPhone 游戏引擎的更多内容,请参考以下几篇文章: