Ikemen_go新文件zss
.ZSS(ikemen_go的新文件)
————已经校正过部分错误11,29
翻译者:雨没有眼泪
转载已授权
文章首发地址(可获得更好阅读体验):https://www.bilibili.com/read/cv11729411
官方原英文文档地址:https://github.com/Windblade-GR01/Ikemen-GO/wiki/ZSS
IKEMEN GO中加入的ZSS(Zantei State Script)是一种状态描述格式,可以代替CNS使用。基本结构与CNS相同,但语法明显不同。
几乎所有的 CNS 描述都可以用 ZSS 代替,局部变量和函数可以作为 CNS 没有的特性。ZSS 可能对以下人员有用:
感觉CNS格式是多余的
想要压缩或重用代码
不喜欢多次描述复杂的过程
有编程经验(有没有其实不重要)
在 ZSS 中,用"#"注释代码行而不是";"
------------------------------------------------- ------------------------------
common1.cns.zss 可以作为示例。对比一下原来的common1.cns,可以帮助你理解如何正确使用它。
如果您使用 Notepad++,请考虑安装ZSS 语法荧光笔。
这里有一份简短的手册,供了解 MUGEN CNS 的人使用。
#ZSS 语言:https://github.com/Windblade-GR01/Ikemen-GO/wiki/ZSS
#Notepad++ 的#ZSS 语法荧光笔:https://github.com/K4thos/zss_npp
# 如何使用ZSS
# 您可能会注意到“;” 字符现在替换为“#”字符。
#这是因为 ”;” 现在用于分隔 sctrls 中的参数而不是注释
--------------------------------------------- ------------------------------
加载 ZSS
指定在人物def文件中引入带有".zss"后缀zss的文件
人物可以混合 CNS 和 ZSS 代码,只要它们位于单独的文件中,同一个文件不能出现CNS和ZSS两种代码格式
描述 ZSS 的文件扩展名固定为 .zss。
例子:
st1 = kfm.zss
如果引用的文件丢失但存在相同的文件名并附加的 .zss 扩展名,也可以加载 zss 文件。
示例:文件名
common1.cns.zss
示例:def 文件中的描述。(在[Files]下)
stcommon = common1.cns
图片示例
--------------------------------------------- ------------------------------
ZSS怎么写
Statedef 定义
ZSS 由一系列 Statedef 组成,很像 CNS。
Statedef 定义及其所有选项(参数)都写在[]括号内。
示例:CNS
[Statedef 0]
type= S ;行为状态
physics= S;物理状态
sprpriority= 0;图层状态
示例: ZSS
[Statedef 0; type: S; physics: S; sprpriority: 0;]
要指定值,请写入":"而不是"="。
写入多个参数时,使用";"分隔它们。
上面的例子也可以写成如下(缩进无关紧要)
[Statedef 0;
type: S;
physics: S;
sprpriority: 0;]
在 Statedef 下定义编写状态代码。
--------------------------------------------- ------------------------------
状态控制器
State controller name {parameter name: value}
;#状态控制器名称{参数:值}
之后出现状态控制器名称这个词会使用:sctrl代替
ZSS 中的状态控制器以与 CNS 类似的格式编写,但触发器不是 sctrl 定义的一部分。
示例: CNS
[State 展示样品]
type= PosAdd;控制器类型位置加
trigger1= 1;触发器
x= 10;参数:值
示例: ZSS
PosAdd{x: 10}
写入多个参数时,使用;分隔它们。
示例:CNS
[state 示例样本]
type= PosAdd
trigger1 = 1
x = 10
y = -10
示例:ZSS
PosAdd { x : 10 ; y : - 10 }
#替代展示,换行
PosAdd{x: 10 ;
y: - 10 ; }
在没有参数的状态控制器上{}留空
示例:ZSS
Turn{}#转向
示例:CNS
[State 0, 转向]
type = Turn
trigger1 = 1
--------------------------------------------- ------------------------------
if语句
在到目前为止的示例中,周围区域没有写入任何内容,因此每帧都执行 Statedef。
ZSS 使用if语句而不是 CNS 触发器。
#用法与典型编程语言中的“if”语句大致相同。
"if" conditional statement {code to be executed}
“if”条件语句{要执行的代码}
示例:CNS
[State 展示样品]
type = PosAdd
trigger1 = time = 0
x = 10
示例:ZSS
if time=0 { PosAdd{ x : 10} }
if使用与 CNS 触发器相同的条件语句。
If 代码添加在条件语句之后,并包含在{}. {}只有在if满足条件时才执行其中的代码。
当你想放置多个条件时,你可以这样写:
示例: CNS
[State 展示样品]
type= PosAdd
triggerall = time = 0
trigger1 = stateType = S
trigger2 = stateType = C
trigger3 = stateType= L
x = 10
示例: ZSS
if time = 0 {
if stateType = S || stateType = C || stateType = L {
PosAdd{x: 10}
}
}
您可以将if语句放入if语句中以编写更复杂的条件。
一个if语句测试它的条件并相应地执行它的{-part 或它的else-part。else 部分是可选的。
当您编写嵌套 ifs 时,您还可以将两者if和else在同一行中(所谓的elseif语句)
;===========这句话需要学过代码的人理解
示例: CNS
[State 展示样品]
type= PosAdd
triggerall = time= 0
trigger1 = stateType= S
y = -50
[State 展示样品]
type= VelAdd
triggerall = time = 0
trigger1 = stateType = A
y = 0.1
[State 展示样品]
type= PosSet
triggerall = time = 0
trigger1 = stateType != S
trigger1 = stateType != A
y = -20
示例: ZSS
if time= 0 {
if stateType = S {
PosAdd{y: -50}
} else if stateType = A {
VelAdd{y: 0.1}
} else {
PosSet{y: -20}
}
}
--------------------------------------------- ------------------------------
ignoreHitPause 和 Persistent
使用IgnoreigHitPause无视命中暂停。
使用Persistent用于指定执行帧之间的间隔。
应受 IgnoreHitPause 和 Persistent 影响的代码需要包含在 {} 中。
它们可以单独使用,也可以作为if语句的一部分(之前键入if)
与 CNS 不同的是 IgnoreHitPause 不是一个单独的 sctrl 参数(除了 Explod,它允许任意设置此参数)
示例:CNS
[State 展示样品]
type = PosAdd
trigger1 = 1
x = 10
ignorehitpause = 1
示例:ZSS
IgnoreHitPause {
PosAdd { x : 10 }
}
示例: CNS
[State 展示样品]
type = PosAdd
trigger1 = 1
x = 10
persistent = 5
示例: CNS
Persistent(5) {
PosAdd{x: 10}
}
可以同时指定 IgnoreHitPause 和 Persistent。如果您指定多个,请将if语句放在最后。
示例:CNS
[State 展示样品]
type = PosAdd
trigger1 = Time = 0
x = 10
ignorehitpause = 1
persistent = 5
示例:ZSS
IgnoreHitPause Persistent ( 5 ) if time = 0 {
PosAdd { x : 10 }
}
--------------------------------------------- ------------------------------
关于 Var
在 ZSS 中,诸如 Varset 之类的简单 Var 操作已过时。
相反,使用:=
它来操作 Var看起来像一个可以用 CNS 触发器编写的赋值表达式。
示例: CNS
[State Sample]
type = VarSet
trigger1 = 1
Var(59) = 1
示例: ZSS
Var(59) := 1
示例: CNS
[State 展示样品]
type = VarAdd
trigger1 = 1
Var(59) = 1
示例: ZSS
Var(59) := Var(59) + 1;
添加;在赋值表达式的末尾。
如果要将 Var 分配给另一个字符,请指定重定向到该字符。
示例:CNS
[State 展示样品]
type = ParentVarSet
trigger1 = 1
Var(59) = 1
示例: ZSS
Parent, Var(59) := 1;
--------------------------------------------- ------------------------------
局部变量(ikemen_go新内容,需要懂编程,不懂也无所谓)
只能在定义的状态内使用且不影响其他状态的变量。
最多可设置 256 个。
主要用于传递状态中的一次性变量或以数字方式传递函数。
局部变量声明
写成这样的形式:在最后
let < variable name > = value;
let < 变量名 > = 值;
让变量的值等于
以;结束。
例子
let randomValue100 = Random%100;
意思为让随机变量100等于一个随机0-999除以100取余的值,最后结果大概是1-100之间的随机数
如果以后要更改此值,请以完全相同的方式编写。
#初次赋值
let randomValue100 = Random%100;
#再次赋值
let randomValue100 = Random%300;
请记住,所有将值放入局部变量的描述都是这种格式。
引用局部变量
用途:$ Variable name
$变量名
引用上面例子中声明的变量。
$randomValue100
--------------------------------------------- ------------------------------
Functions;(方法)
一个函数是一组进程。
一个函数,它允许您调用和执行您之前在与 Statedef 不同的位置编写的工作,从状态内部调用。
不用写一个要多次使用的流程,可以把流程抽象成函数的形式,只写调用语句。
在 CNS 中,要实现的功能越复杂,代码就越复杂。但是,在ZSS中,这可以通过使用函数在一定程度上解决。
方法定义
用: Function FunctionName()
Function 方法名()
类似于 Statedef 定义。
示例:在 KO 期间播放语音的功能。
[Function PlayKOSound()]
PlaySnd{value: 11,0}
如果需要,您还可以编写参数和返回值。
[Function FunctionName(argumentName) return valueName]
示例:返回出ret这个变量的值
[Function FunctionName(1) return ret]
省略
let ret = 1;
调用函数
call FunctionName();
call 方法名()
调用: 只有写在调用状态上面的函数才能被调用,所以要注意调用的顺序
示例:调用上面编写的 PlayKOSound() 函数:
call PlayKOSound ();
您还可以使用call FunctionName(argument);
以下方法包含参数: 有关详细信息,请参见下文。
函数参数
函数可以接收参数并对其进行处理。这可用于编写输入不同的进程。
参数列在括号内,并用逗号分隔。
示例:以参数中指定的音量播放声音。
[Function PlayKOSound(VoiceVolume)]
PlaySnd{
value: 11,0;
volumeScale: $VoiceVolume;
}
要调用它,我们使用:
call PlayKOSound(200);以200这个声音,默认是100
call PlayKOSound(50);以50这个声音
可以使用多个参数。
示例:上述功能还具有设置频率的能力。
[Function PlayKOSound(VoiceVolume, Frequency)]
PlaySnd{
value: 11,0;
volumeScale: $VoiceVolume;
freqMul: $Frequency;
}
函数返回值
函数可以将值返回给调用者。返回值可以通过写在函数定义之后来指定。返回值可以分配给变量。
带有返回参数的函数示例:
[Function IshelperID() ret]
let ret = 0;
if ishelper(1) {
let ret = 1;
} else if ishelper(2) {
let ret = 2;
} else if ishelper(3) {
let ret = 3;
} else if ishelper(4) {
let ret = 4;
} else if ishelper(5) {
let ret = 5;
}
在这种情况下,指定了返回值ret的[Function IshelperID () ret]
,例如像这样可以检索这个值:
let helperIdValue = call IshelperID();