Sonolus中间语言(SIL) - ReiKohaku/Sonolus-wiki-zh_cn GitHub Wiki
Sonolus中间语言
直接使用节点编写脚本非常低效,因为节点提供的抽象方法非常低能。
建议使用更高级的语言编写脚本(或创造自己的语言),然后编译、传输到节点。
Sonolus中间语言(SIL)就是为此而创建的。
它与现代语言相去甚远,因为它的特性很有限。不过,对于编写游戏而言,这个级别的脚本足够了。
编译器
SIL代码存储为纯文本,可以在任何文本编辑器中编辑。 若想要把SIL代码编译为level.json,请使用编译器。
在输入level(JSON)时,不需要提供脚本和节点键值。 相反,它们将会从SIL代码生成并注入。
语言特性
探索语言特性的最好方法就是使用编译器,将输入的SIL代码与输出的节点进行比较。
值
数值将会被编译为值节点。
1
0.5
-3
函数
函数采用**Func(...)**的形式,编译为函数调用节点。
参数在**(...)**内传递,并用空格分隔。
Add(1 2 3)
Multiply(4 5)
Log(6)
别名
可以通过**Alias:...**分配别名并在节点中配置指向。
LevelData:1
*Time:0
Time:Get(LevelData *Time)
PI:3.14159
Sin(Multiply(Time PI))
脚本回调
带有**#n.callback@order**表单的别名将会分配为入口节点中的调用的第n个脚本。Order是可选的,且默认值为0。
true:1
#0.shouldSpawn:true
空白
行以及参数间的空格将被忽略。
#0.updateParallel:Draw(
TextureNote
0 0
0 1
1 1
1 0
NoteZ
NoteAlpha
)
注释
以**//**作为起始的行将被忽略。
// Return true X position of note, taking into account mirror
TrueX:Multiply(
// Returns -1 if mirrored, otherwise 1
If(
OptionMirror
-1
1
)
// ... and multiply with original X position
NoteX
)
示例代码
一个简单的引擎 带有注释。这是学习编写音乐游戏引擎脚本的良好起点。