音频发射器

提供音频发射器可增强GameMaker音频引擎的灵活性,并允许您在音频资源中添加实时效果,如音调和多普勒变化,以及将声音定位在3D音频空间内并提供逼真的运动效果。所有这些函数都受收听者在音频环境中的位置影响,因此需要您使用所提供的函数来更改收听者的位置、速度和方向(请参见-音频监听器)。

使用音频发射器和监听器

通过结合音频发射器和收听者,您可以创造一个丰富、活泼的环境。设置此设置可能涉及一些内容,因此在本部分中,我们将讨论如何设置具有发射器和默认侦听器的完整系统。

设置衰减模型

使用音频发射器(以及使用audio_play_sound_at在与(0, 0, 0)不同的位置播放的声音)时,首先要使用audio_falloff_set_model()设置衰减模型。 衰减模型确定所播放声音的音量如何随着从收听者到发射器的距离而改变。

不严格要求您设置此值,但如果不调用此函数,则所使用的模型将是默认的audio_falloff_none。 这意味着增益设置为 1,因此音量不会随从收听者到发射器的距离而改变。

注意如果要确保声音不再超过最大距离,则应设置以_scaled结尾的衰减模型之一。

更新侦听器

默认音频收听器位于位置( 0, 0, 0)audio_play_sound在收听者的位置播放声音。因此,默认情况下,通过左右两个扬声器都能听到以这种方式播放的声音。

从收听者与声音或发射器的相对位置改变(通过改变收听者或发射器位置)的那一刻起,这种情况将不再存在。

它不仅具有位置,还具有方向,可以使用audio_listener_orientation更改该方向。 然而,默认情况下,该方向是颠倒的!默认方向的向上向量设置为(0, 1, 0),但由于GameMaker的y轴指向下,这意味着收听者在房间内倒立。

您期望在左扬声器中听到的所有声音实际上都会在右扬声器中听到,反之亦然(请参见audio_listener_orientation页的图片了解其外观)。因此,一旦开始移动发射器和接收器,请确保将接收器的方向设置为:

audio_listener_orientation(0, 0, 1, 0, -1, 0);

上面的代码行将设置默认侦听器的方向,以便它看起来进入屏幕并且面朝上。 这相当于听众站在或坐在电脑前看着屏幕。

当您创建自上而下的游戏时,让听者的方向遵循玩家(或任何其他"听众")所面对的方向可能更有趣。这可以通过以下代码行实现:

audio_listener_orientation(0, 0, 1, lengthdir_x(1, direction), lengthdir_y(1, direction), 0);

在这行代码中,不是有一个完全不变的向上向量(y=-1),而是根据玩家的方向来改变它。最简单的方法是使用lengthdir_xlengthdir_y函数。观看矢量可以保持不变,因为收听者仍然在查看屏幕。

播放声音

设置衰减模型并确保正确更新收听者的位置和方向后,可以使用audio_play_sound_at在3D音频空间中开始播放声音:

sound_instance = audio_play_sound_at(snd_Explosion, x, y, 0, 100, 300, 1, true, 1);

上面的代码行在位置(x,y,0)播放声音"snd_Explosion",其衰减参考距离为100,衰减最大距离为300,衰减系数为1。

请注意,您可以更改声音的某些属性,因为它可以通过上面的sound_instance变量访问。然而,这些只是声音本身的特性,如增益、偏移和音调。无法更改使用audio_play_sound_at播放的声音的位置或速度。

总之,audio_play_sound_at是在3D音频空间播放简单声音的好方法,但有限。一旦播放声音,它不允许您更改位置、速度或衰减参数。位置和衰减参数传递给函数,但以后无法更改。

如果你想更好地控制声音的播放方式,请使用音频发射器。

添加发射器

使用audio_emitter_create添加音频发射器。 它们位于( 0, 0, 0),具有 0 的速度和默认衰减设置。

emitter = audio_emitter_create();

更新发射器

音频发射器"发出"声音。它可以与现实世界中的扬声器相比较。

audio_play_sound_at相比,发射器在开始使用audio_play_sound_on播放声音后,其位置、速度、监听器掩码和衰减参数可以更改。

可以使用audio_emitter_position更新发射器的位置。 这可以设置为实例的位置:

audio_emitter_position(emitter, x, y, 0);

使用audio_emitter_velocity更新发射器的速度。 设置速度的最简单方法是将其设置为实例的hspeedvspeed,如下所示:

audio_emitter_velocity(emitter, hspeed, vspeed, 0);

注意 音频发射器的 速度每步像素数 表示。

GameMaker创建的音频发射器

使用序列时,GameMaker添加为序列中的每个音轨(seqtracktype_audio) 创建音频发射器。这些发射器的 ID 可以在序列实例的activeTracks[i].emitterIndex属性中找到。

GameMaker自动更新此发射器的位置。它不更新音轨发射器的速度,但您可以通过在序列步骤事件之一中调用audio_emitter_velocity自行执行此操作。

在发射器上播放声音

可使用audio_play_sound_on发射器上播放声音:

sound_instance = audio_play_sound_on(emitter, snd_Explosion, false, 10);

跟踪播放声音实例

每次调用audio_play_soundaudio_play_sound_ataudio_play_sound_on之一时,都会创建一个新的声音实例

由于各种原因,播放的声音实例可能无法听到,例如其位置离收听者太远。但它始终存在。

如果要更改声音实例的属性,应为变量指定返回值,如下所示:

sound_instance = audio_play_sound_at(snd_Explosion, x, y, 0, 100, 300, 1, true, 1);

在某个时刻,您可能有相当多的声音实例正在播放。在这种情况下,您可以按如下方式将其存储在数组中:

var _x = random(room_width);
var _y = random(room_height);
var _new_sound_instance = audio_play_sound_at(snd_Bird, _x, _y, 0, 200, 400, true, 10);
array_push(bird_sounds, _new_sound_instance);

每次执行上述代码时,新创建的声音实例的ID都会添加到bird_sounds数组中。

这样可以跟踪正在播放的所有声音实例(上例中的snd_Bird)。

重要声音正在"播放"并不一定意味着收听者将听到该声音。停止播放的声音、离收听者太远的声音、或增益设置过低的声音(或在增益设置过低的发射器上播放的声音)将无法听到。

其他侦听器

如果要使用其他侦听器,应首先使用audio_get_listener_count检查系统是否支持多个侦听器。

如果存在多个侦听器,可以使用audio_get_listener_info获取每个监听器的名称、监听器掩码和索引。

如果您知道侦听器索引,可以使用以audio_listener_set_而不是audio_listener_开头的函数来更改其设置(位置、速度和方向)。

函数

以下函数可用于处理音频发射器: