《Android游戏编程入门经典》——14.2节使用SoundPool播放音频

本节书摘来自异步社区《Android游戏编程入门经典》一书中的第14章,第14.2节使用SoundPool播放音频,作者【美】Jonathan S. Harbour,更多章节内容可以访问云栖社区“异步社区”公众号查看

14.2 使用SoundPool播放音频
Android游戏编程入门经典
类android.media.SoundPool用于一次播放多个音频示例,因此使用它在游戏中播放音效。

注意:

忽略了资产文件扩展名。因此,不考虑扩展名,资产文件名必须是唯一的。无法在同一文件夹中保存sound1.mp3和sound1.ogg,因为两个文件都使用关键字sound1将文件添加到资源管理器中。

14.2.1 初始化SoundPool
首先,我们将创建SoundPool变量:

通常,在程序的onCreate()事件方法中初始化SoundPool对象。

SoundPool构造函数的第一个参数是为混合器创建的音频信道数量。本例中使用4,但是您可能想要使用10或20,如果您的游戏需要这么多音频信道。不要过量,否则混合器将会不必要地浪费内存和处理时间。合理的上限值是20。

第二个参数是AudioManager.STREAM_MUSIC,始终将它用于应用程序或游戏音频。对于语音电话和系统声音等内容还有其他流,但是我们不会将它们用于游戏音频。

不使用第三个参数并且总是将它设置为0。

14.2.2 加载音频资源
在刷新、保存或构建项目时,资源管理器会自动解析复制到项目.resraw文件夹中的音频文件。然后将它们添加到R.raw列表,由名称标识(无扩展名)。在运行时索引音频资源的一种简单方式是使用java.util.HashMap。散列映射就像是一个索引,具有在散列映射中存储的每个条目的可定义键值对。我们可以使用HashMap.put()方法将音频示例添加到散列集合中。

此技术非常有效,因为我们不需要这样记录声音标识符,只需要记录保存它们的散列的索引。通常情况下,我们必须记录SoundPool.load()返回的标识符,但是散列映射会立即将索引号转换为声音标识符。

首先,使用返回标识符的SoundPool.load()加载音频示例。然后,将此标识符保存到散列映射中并设置索引号。

将两个声明组合成一个以生成一个非常干净的代码行,用于加载和保存音频示例:

使用您想要加载的音频资源名替换R.raw.clip1。

14.2.3 播放音频资源
将音频加载到散列映射(标识符的索引查找)后,然后我们可以使用SoundPool.play()方法播放示例。

此方法的第一个参数是散列映射中示例的索引。其他参数始终不需要更改(除非您想要播放具有一些特效的示例)。

第二个参数和第三个参数分别是左声道音量和右声道音量,值范围为0.0到1.0(最大音量)。

第四个参数是优先级,通常设置为0。

第五个参数是循环模式,其中0是无循环,[ms]1是无限循环,其他值表示循环的次数(即1表示循环一次,2表示循环二次,以此类推)。

提示:

反复播放同一示例将导致每次停止并重启,但是播放不同的示例会将它们混合在音频流中。要播放混合的同一音频,必须加载音频多次或使用另一个SoundPool对象。

14.2.4 Audio Demo程序
Audio Demo(音频演示)程序仅输出一个黑色屏幕。单击屏幕可听到音频示例。可以修改源代码以更改示例数量并聆听不同的音频(总共是5个音频,值是0~4)。


《Android游戏编程入门经典》——14.2节使用SoundPool播放音频
上一篇:Photoshop为室内美女图片增加柔美的淡调紫褐色


下一篇:Photoshop 给生活照片润色的快速方法