舞台
在本章中,您将会学习到:
- 什么是皮肤精灵
- 如何声明皮肤精灵
- 如何绘制判定线
- 如何让判定线响应触摸
皮肤精灵
一般情况下,引擎无法访问玩家选择的皮肤中的任何精灵。为了使用一个精灵,引擎必须通过引用它的名字来声明它。
皮肤精灵的名字只是一个字符串,并且每个皮肤都应该包含已知名字的标准精灵。这些标准精灵允许皮肤被用在多种引擎中,并且引擎应该在期望的自定义精灵不存在时,使用标准精灵进行渲染。
声明
我们的舞台非常简单: 只有一条判定线。由于我们并不使用自定义精灵,因此我们应使用标准判定线精灵:
class Sprites {
public:
int judgeLine = 0;
}Sprites;
auto skins = defineSkins<class Sprites>({
{ SkinSpriteName.JudgmentLine, Sprites.judgeLine }
});
保存后,在 /skins/
中放入对应的精灵图片,并将其命名为 #JUDGMENT_LINE.png
,这样在编译引擎时,Sonolus.h 会自动将判定线图片打包成皮肤上传至服务器。
绘制
在绘制前,让我们先初始化一个 Stage
原型:
class Stage: public Archetype {
public:
static constexpr const char* name = "My Stage";
};
// ...
#ifdef play
using namespace playData;
#include"play/Initialization.cpp"
+ #include"play/Stage.cpp"
#elif tutorial
// ...
// ...
#ifdef play
buffer data, configuration;
build<
// Replace with your archetypes here
Initialization,
+ Stage
>(configuration, data);
// ...
让我们定义,我们设想的判定线的宽度只有音符半径的 1 / 4,其绘制非常简单:
class Stage: public Archetype {
// ...
SonolusApi updateParallel() {
FUNCBEGIN
let l = judgeLine.l;
let r = judgeLine.r;
let t = judgeLine.y + note.radius / 4;
let b = judgeLine.y - note.radius / 4;
Draw(Sprites.judgeLine, l, b, l, t, r, t, r, b, 0, 1);
return VOID;
}
// ...
};
响应触摸
让我们改进我们的判定线,使其能够响应我们的触摸:
class Stage: public Archetype {
// ...
SonolusApi updateParallel() {
FUNCBEGIN
// ...
Draw(Sprites.judgeLine, l, b, l, t, r, t, r, b, 0, If(touches.size(), 1, 0.5));
return VOID;
}
// ...
}