音符与面板数量
在本章中,您将会学习到:
- 如何设置音符原型
- 持续时间的计算
- 面板数量的计算
- 画布大小的更新
音符原型
让我们首先设置音符原型:
class Note: public Archetype {
public:
static constexpr const char* name = "My Note";
};
// ...
#ifdef preview
using namespace previewData;
#include"preview/Initialization.cpp"
#include"preview/Stage.cpp"
+ #include"preview/Note.cpp"
#elif watch
// ...
// ...
#ifdef preview
buffer data, configuration;
build<
// Replace with your archetypes here
Initialization,
Stage,
+ Note
>(configuration, data);
// ...
持续时间
如果我们知道了持续时间,我们就可以用它来计算面板数量。
那么我们如何获取持续时间呢?一个简单的方法就是使用一个变量存储一个关卡的时长,并在我们访问音符时更新它。
让我们使用 Preview Data 区块声明它:
#ifdef preview
class chart {
public:
Variable<PreviewDataId> duration;
}chart;
// ...
#endif
更新持续时间
为了计算音符时间,我们需要知道它的节拍。我们可以像游玩模式一样声明它:
class Note: public Archetype {
// ...
defineImports(beat);
};
在音符原型的 preprocess
回调函数中,如果音符时间更大,我们将更新持续时间:
class Note: public Archetype {
// ...
SonolusApi preprocess() {
FUNCBEGIN
chart.duration = Max(chart.duration, BeatToTime(beat));
return VOID;
}
};
面板数量
现在我们可以根据持续时间计算并更新面板数量:
#ifdef preview
// ...
class panel {
// ...
SonolusApi count() { return Ceil(chart.duration / h); }
}panel;
#endif
画布
最后,我们需要在所有音符都更新持续时间完成后,确保计算画布大小代码的正常执行。
我们可以将代码移动到舞台原型的 preprocess
回调函数并给予其一个更高的顺序:
class Stage: public Archetype {
// ...
int preprocessOrder = 1;
SonolusApi preprocess() {
FUNCBEGIN
canvas.set(
Scroll.LeftToRight,
panel.count() * panel.w * screen.h / 20
);
return VOID;
}
// ...
};