跳转到内容

跨平台游戏编程:gameplay3d/音频

来自 Wikibooks,开放世界中的开放书籍

Gameplay3d 支持 3D 音频(使用 OpenAL,其规范可以在 此处 找到)。在 gameplay3d 中使用声音的基本原理如下

  • 您的游戏可以拥有一个或多个 AudioSource,如果需要,它们可以附加到 Node 并定位在 3D 空间中;
  • 非位置音频,例如音乐,是通过创建和播放一个未附加到 NodeAudioSource 来实现的;
  • 您的游戏有一个 AudioListener,它接收来自 AudioSources 的声音。默认情况下,AudioListener 绑定到场景的活动摄像机,但可以根据需要附加到另一个摄像机或手动定位。

支持的音频格式

[编辑 | 编辑源代码]

Gameplay3d 目前支持以下格式

  • .ogg vorbis 音频,这是一个免费的开源压缩音频格式规范;
  • .wav 文件,这是一个 Microsoft 和 IBM 未压缩的音频格式。

建议在游戏发行版中使用 .ogg 文件,因为它们是压缩的,因此使用更少的内存。

创建 AudioSource

[编辑 | 编辑源代码]

AudioSources 可以从音频样本文件创建,如下所示

AudioSource* wheelsSound = AudioSource::create("res/explosion.wav");
AudioSource* backgroundMusic = AudioSource::create("res/music.ogg");

AudioSources 也可以从 .audio 文件创建和配置 - 以下内容将详细介绍。

定位 AudioSource

[编辑 | 编辑源代码]

可以使用 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

[编辑 | 编辑源代码]

要播放音频源

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 可以手动定位(在这种情况下,位于场景的原点),如下所示

AudioListener::getInstance()->setCamera(NULL);
AudioListener::getInstance()->setPosition(0.0f, 0.0f, 0.0f);

AudioListener 可以附加到特定的摄像机(例如,当屏幕上同时有多个视角时),如下所示

AudioListener::getInstance()->setCamera(mainCamera);

.audio 文件

[编辑 | 编辑源代码]

以下示例说明了如何使用 .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
}
华夏公益教科书