舞台
在本章中,您将会学习到:
- 舞台原型的设置
- 皮肤精灵的声明
- 如何绘制面板
舞台原型
让我们首先设置舞台原型:
class Stage: public Archetype {
public:
static constexpr const char* name = "My Stage";
};
// ...
#ifdef preview
using namespace previewData;
#include"preview/Initialization.cpp"
+ #include"preview/Stage.cpp"
#elif watch
// ...
// ...
#ifdef preview
buffer data, configuration;
build<
// Replace with your archetypes here
Initialization,
+ Stage
>(configuration, data);
// ...
声明
即使在游玩模式中,我们的舞台只有一条没有轨道或舞台的判定线,但在预览模式中,绘制一条是最好的选择,这样玩家能够看到每一个面板。我们将使用标准舞台精灵:
class Sprites {
public:
// ...
int stageMiddle = 2;
int stageLeftBorder = 3;
int stageRightBorder = 4;
}Sprites;
auto skins = defineSkins<class Sprites>({
// ...
{ SkinSpriteName.StageMiddle, Sprites.stageMiddle },
{ SkinSpriteName.StageLeftBorder, Sprites.stageLeftBorder },
{ SkinSpriteName.StageRightBorder, Sprites.stageRightBorder }
});
绘制
绘制面板就是简单地循环面板数量并对每个面板进行绘制:
class Stage: public Archetype {
// ...
SonolusApi renderPanels() {
FUNCBEGIN
FOR (i, 0, panel.count, 1) {
var x = i * panel.w * screen.h / 20;
var b = -1 * panel.h / 2, t = panel.h / 2;
var l1 = x - 3.5 * screen.h / 20 + screen.l, l2 = x - 3 * screen.h / 20 + screen.l;
var r1 = x + 3.5 * screen.h / 20 + screen.l, r2 = x + 3 * screen.h / 20 + screen.l;
Draw(Sprites.stageMiddle, l2, b, l2, t, r2, t, r2, b, 0, 1);
Draw(Sprites.stageLeftBorder, l1, b, l1, t, l2, t, l2, b, 0, 1);
Draw(Sprites.stageRightBorder, r2, b, r2, t, r1, t, r1, b, 0, 1);
}
return VOID;
}
SonolusApi render() {
FUNCBEGIN
renderPanels();
return VOID;
}
};