跨平台游戏编程:gameplay3d/音频
外观
Gameplay3d 支持 3D 音频(使用 OpenAL,其规范可以在 此处 找到)。在 gameplay3d 中使用声音的基本原理如下
- 您的游戏可以拥有一个或多个
AudioSource
,如果需要,它们可以附加到Node
并定位在 3D 空间中; - 非位置音频,例如音乐,是通过创建和播放一个未附加到
Node
的AudioSource
来实现的; - 您的游戏有一个
AudioListener
,它接收来自AudioSources
的声音。默认情况下,AudioListener
绑定到场景的活动摄像机,但可以根据需要附加到另一个摄像机或手动定位。
Gameplay3d 目前支持以下格式
- .ogg vorbis 音频,这是一个免费的开源压缩音频格式规范;
- .wav 文件,这是一个 Microsoft 和 IBM 未压缩的音频格式。
建议在游戏发行版中使用 .ogg 文件,因为它们是压缩的,因此使用更少的内存。
AudioSources
可以从音频样本文件创建,如下所示
AudioSource* wheelsSound = AudioSource::create("res/explosion.wav");
AudioSource* backgroundMusic = AudioSource::create("res/music.ogg");
AudioSources
也可以从 .audio
文件创建和配置 - 以下内容将详细介绍。
可以使用 Node::setAudioSource()
将 AudioSource
绑定到场景中的 Node。当节点变换时,音频源的位置会自动更新。
例如,我们可以使用以下示例来定位一个发出鸟叫声的 AudioSource
// Create and configure the AudioSource
AudioSource* audioSource = AudioSource::create("res/birdsound.ogg");
assert(audioSource);
audioSource->setLooped(true);
// Create a new node and set the AudioSource
Node* birdNode = _scene->addNode("bird");
birdNode->setAudioSource(audioSource);
SAFE_RELEASE(audioSource);
// Position the node (high up in the trees), add it to the scene and play the sound
birdNode->setTranslation(10.0f, 100.0f, 30.0f);
_scene->addNode(birdNode);
birdNode->getAudioSource()->play();
SAFE_RELEASE(birdNode);
要播放音频源
audioSource->play();
其他控制播放的成员函数是 pause()
、resume()
、stop()
和 rewind()
。
我们可以配置声音,如下所示
audioSource->setLooped(true); // - Play the sound in a loop.
audioSource->setGain(0.5f); // - Set the gain/volume of the audio source. 1.0 means that the sound is unattenuated.
// Gain larger than one (i.e. amplification) is permitted for source and listener.
// However, the implementation is free to clamp the total gain (effective gain per-source
// multiplied by the listener gain) to one to prevent overflow.
audioSource->setPitch(2.0f); // - 1.0 equals identity. Each reduction by 50 percent equals a pitch shift of -12
// semitones (one octave reduction). Each doubling equals a pitch shift of 12
// semitones (one octave increase). Zero is not a legal value.
audioSource->setVelocity(1.0f, 0.0f, 15.0f); // - Velocity is taken into account by the OpenAL driver to synthesize the
// Doppler effect perceived by the listener for each source, based on the
// velocity of both source and listener (and the OpenAL Doppler-related
// parameters).
AudioListener
可以手动定位(在这种情况下,位于场景的原点),如下所示
AudioListener::getInstance()->setCamera(NULL);
AudioListener::getInstance()->setPosition(0.0f, 0.0f, 0.0f);
AudioListener
可以附加到特定的摄像机(例如,当屏幕上同时有多个视角时),如下所示
AudioListener::getInstance()->setCamera(mainCamera);
以下示例说明了如何使用 .audio 文件设置所有 AudioSource 属性。
在您的 .cpp
文件中添加以下内容
AudioSource* source = AudioSource::create("res/game.audio#fireball");
在您的 game.audio
文件中添加以下内容
audio fireball
{
path = res/audio/fireball.wav
looped = false
gain = 0.7
pitch = 0.5
velocity = 0.5 0.0 1.0
}