音符绘制
在本章中,您将会学习到:
- 音符坐标的计算
- 如何准确绘制音符
屏幕缩放
与游玩模式不同,在预览模式中,我们已经修改了屏幕坐标系来使用不同的 X 与 Y 轴缩放。
为了正确绘制音符,我们需要提供长度和宽度缩放参数:
#ifdef preview
// ...
class scaledScreen{
public:
let wToH = panel.h / 20;
}scaledScreen;
#endif
计算坐标
使用面板参数,我们可以计算在特定时间的坐标。
#ifdef preview
// ...
class panel {
// ...
SonolusApi getX(let time) { return Floor(time / h) * w * screen.h / 20; }
SonolusApi getY(let time) { return time % h; }
pair<let, let> getPos(let time) { return { getX(time), getY(time) }; }
}panel;
// ...
#endif
绘制
有了上述所有前提后,我们可以在正确的位置绘制正确大小的音符精灵:
class Note: public Archetype {
// ...
SonolusApi render() {
FUNCBEGIN
let time = BeatToTime(beat);
auto pos = panel.getPos(time);
let l = pos.first - LevelOptions.get(Options.noteSize) / 2, r = pos.first + LevelOptions.get(Options.noteSize) / 2;
let t = pos.second + LevelOptions.get(Options.noteSize) / 2, b = pos.second - LevelOptions.get(Options.noteSize) / 2;
Draw(Sprites.note, l, b, l, t, r, t, r, b, 1000 - time, 1);
return VOID;
}
};