音效
在本章中,您将会学习到:
- 音效片段的声明
- 在
Note
和Stage
原型中使用音效片段
音效片段
就像皮肤精灵一样,我们需要通过引用它们的名字来声明我们想要访问的音效片段。
class Clips {
public:
int stage = 0;
int perfect = 1;
int great = 2;
int good = 3;
}Clips;
auto effects = defineEffects<class Clips>({
{ EffectClipName.Stage, Clips.stage },
{ EffectClipName.Perfect, Clips.perfect },
{ EffectClipName.Great, Clips.great },
{ EffectClipName.Good, Clips.good }
});
保存后,在 /effects/
中放入对应的音效片段,并将其命名为对应的名称,这样在编译引擎时,Sonolus.h 会自动将音效片段打包成音效上传至服务器。
音符
为了为判定加上音效,我们需要检查最终判定并使用 Play
函数播放正确的音效片段。
注意到 Play
有一个 distance
参数,如果在指定时间 distance
之内音效片段已经被播放过了,Sonolus 将阻止其再次播放。这将阻止相同的片段在短时间内连续播放并对玩家造成影响。总的来说,0.02
(20 毫秒) 是一个很好的值。
class Note: public Archetype {
// ...
SonolusApi touch() {
FUNCBEGIN
// ...
FOR (i, 0, touches.size, 1) {
// ...
Switch(EntityInput.get(0), {
{ 1, Play(Clips.perfect, 0.02) },
{ 2, Play(Clips.great, 0.02) },
{ 3, Play(Clips.good, 0.02) }
})
// ...
} DONE
return VOID;
}
// ...
};
舞台
由于我们已经有了判定线来响应击打,播放其音效也是很有意义的。
然而,如果一个触摸已经被音符使用过了,我们就不应该播放舞台音效。
class Stage {
// ...
int touchOrder = 2;
SonolusApi touch() {
FUNCBEGIN
FOR (i, 0, touches.size(), i++) {
IF (!touches[i].started) CONTINUE; FI
IF (isUsed(touches[i])) CONTINUE; FI
Play(Clips.stage, 0.02);
Return(0);
} DONE
return VOID;
}
// ...
};