音符生成
在本章中,您将会学习到:
- 目标时间与生成时间的计算
- 音符的生成逻辑
目标时间
我们首先需要计算一个音符的目标时间。Sonolus.h 通过使用由 Sonolus 提供的低级函数来提供从节拍直接转为时间的绑定。
由于目标时间是每个音符实体的不变属性,并且是生成逻辑所需要,因此我们应该在 preprocess
回调函数中计算一次并将其存储在 EntityMemory
区块中。
class Note: public Archetype {
// ...
Variable<EntityMemoryId> targetTime;
SonolusApi preprocess() {
FUNCBEGIN
targetTime = BeatToTime(beat);
return VOID;
}
// ...
};
生成时间
现在我们已经计算了目标时间,我们定义,为了给玩家时间准备,我们想要音符在 1
秒前生成并且从上方下落。现在我们可以计算生成时间。
就像目标时间一样,生成时间也是每个音符实体的不变属性,并且也是生成逻辑所需要的,我们也应该在 preprocess
回调函数中计算一次并将其存储在 LevelMemory
区块中。
class Note: public Archetype {
// ...
Variable<EntityMemoryId> spawnTime;
SonolusApi preprocess() {
FUNCBEGIN
// ...
spawnTime = targetTime - 1;
return VOID;
}
// ...
};
生成逻辑
音符应该根据它们的生成时间而生成,但是我们仍然需要保证音符只会在 Initialization
实体后生成。
一个很简单的方法就是加 1000
就行了:
class Note: public Archetype {
// ...
SonolusApi spawnOrder() { return 1000 + spawnTime; }
// ...
};
对于 shouldSpawn
回调函数,其逻辑应该是简单地将当前时间与生成时间进行比较:
class Note: public Archetype {
// ...
SonolusApi shouldSpawn() { return times.now >= spawnTime; }
// ...
};