在音乐循环中的一种容易的错误是把它当作游戏计时问题来处理:在步骤中观看audio_sound_get_track_position(),当它到达边界时寻找回去。GameMaker自身的手册警告说这不能准确。音频线程以每秒 44,100 或 48,000 个样本的速度前进,而游戏通常以每秒 60 次更新的速度更新,因此在检查和寻找之间可以通过很多样本。
GameMaker现在有了合适的音频线程循环控制:
audio_sound_loop_start(snd_music, 10.0);
audio_sound_loop_end(snd_music, 42.0);
var music_voice = audio_play_sound(snd_music, 100, true);
开始和结束值以秒为单位。你可以在播放声音资产之前设置它们,或者在播放时返回声音实例设置它们。当播放器到达循环结束时,GameMaker在音频线程上执行跳转,而不是等待步骤。
这还给了你一个干净的介绍/循环/尾声布局,在一个文件中。将介绍放在循环开始之前,循环体放在两个点之间,尾声放在循环结束之后。开始时启用循环。当游戏准备离开音乐状态时,请调用:
audio_sound_loop(music_voice, false);
当前的通过完成,穿过循环结束跳转,继续进入尾声。没有轮询和没有帧定时寻找。GameMaker支持一个循环部分每个声音,但你可以通过设置新的开始和结束值来更改部分。
仍然存在一个问题,即循环点不能解决的第二个问题:回声尾。 如果最后一个和弦在循环结束后仍在响起,一种声音跳转会丢弃旧的通过,而新的开始开始。即使定时可以样本准确,缝隙仍然会像一个洞。
有三个实际选项:
- 组织或渲染一个真正干净的边界。
- 渲染到尾声,混合尾声在开始下方,然后导出循环体。这使得一个自包含的单声道循环,但它的第一通过包含从从未发生的通过的尾声。
- 使用两个声音,使前一通过可以在下一通过开始时仍然响起。这是最自然的结果,但它需要在运行时进行调度和声音管理。
这是在GameMaker交付注释的实现中产生的,Loopsmith是一种循环工具,我建立了。它报告了精确的循环位置,并可以准备折叠尾声或双声道交付。提到这点是为了透明度;上述技术中的任何一个都不需要我的工具。相关GameMaker手册部分是 Audio > Audio Loop Points。
希望这可以避免有人在调试一个帧定时循环时遇到样本准确性的问题。欢迎回答问题或测试边界情况。
评论 (0)