原型和实体
在本章中,您将会学习到:
- 原型的概念
- 编写第一个原型
- 实体的概念
原型
原型是一种由引擎定义的实体的抽象概念。
在本章中,我们的引擎将会有以下四种原型: Initialization
, InputManager
, Stage
以及 Note
。其中,Initialization
负责对关卡进行初始化; InputManager
负责管理用户输入; Stage
原型负责管理用户与舞台的交互以及舞台渲染; 最后,Hote
负责管理用户与音符的交互以及音符的渲染。
注意到一种原型代表着许多实体的抽象概念。比如说,在一个关卡中可能有 100
个音符,它们在某些地方有所不同(比如生成时间不同或者击打时间不同),但它们都属于 Note
原型。
在面向对象的编程语言中,一种原型由类来表示。
使用 Sonolus.h,一种原型由 C++ 类来表示,例如 Stage
类的代码如下:
class Stage: public Archetype {
public:
static constexpr const char* name = "Stage"; // 设置原型名
bool hasInput = false;
SonolusApi spawnOrder() { return 1; }
SonolusApi shouldSpawn() {
return EntityInfoArray[0].get(2) == EntityState.Despawned;
}
SonolusApi updateParallel() {
FUNCBEGIN
Debuglog(times.now);
return VOID;
}
};
实体
实体是由关卡定义的原型的示例。
不同的关卡可能使用相同的引擎,不同的玩法是由不同的实体定义的。举个例子,一个关卡可能有一个 Initialization
实体,一个 Stage
实体,以及 50 个 Note
实体; 而另一个关卡除了有 100 个 Note
实体外,与前一个关卡几乎相同。
在面向对象的编程语言中,一个实体是类的一个实例。
Sonolus.h 与官方提供的 Sonolus.js 相比,不仅能够编写引擎,而且还能够创建测试关卡,以及引擎所需的全部资源(粒子效果除外),这些都会在后面的章节中一一讲到。