.ZSS(ikemen_ugo的新文件)
雨没有眼泪
IKEMEN GO中加入的ZSS(Zantei State Script)是一种状态描述格式,可以代替CNS使用。基本结构与CNS相同,但语法明显不同。
几乎所有的 CNS 描述都可以用 ZSS 代替,局部变量和函数可以作为 CNS 没有的特性。ZSS 可能对以下人员有用:
-
感觉CNS格式是多余的。
-
想要压缩或重用代码。
-
不喜欢多次描述复杂的过程。
-
有编程经验。
-
在 ZSS 中,用于
#
注释代码行而不是;
————————————————- ——————————
common1.cns.zss 可以作为示例。对比一下原来的common1.cns,可以帮助你理解如何正确使用它。
如果您使用 Notepad++,请考虑安装ZSS 语法荧光笔。
这里有一份简短的手册,供了解 MUGEN CNS 的人使用。
——————————————— ——————————
# 评论在ZSS
# 您可能会注意到“;” 字符现在替换为“#”字符。
#这是因为 ”;” 现在用于分隔 sctrls 中的参数而不是注释
——————————————— ——————————
加载 ZSS
指定在字符 def 文件中键入 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 参数定义总是以;
上面的例子也可以写成如下(缩进无关紧要)
[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}
}
}
——————————————— ——————————
gnoreHitPause 和 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 分配给另一个字符,请指定重定向到该字符。示例:中枢神经系统
[State 展示样品]
type = ParentVarSet
trigger1 = 1
Var(59) = 1
示例: ZSS
Parent, Var(59) := 1;
——————————————— ——————————
局部变量(ikemen_go新内容,需要懂编程,不懂也无所谓)
只能在定义的状态内使用且不影响其他状态的变量。
最多可设置 256 个。
主要用于传递状态中的一次性变量或以数字方式传递函数。
局部变量声明
写成这样的形式:在最后let < variable name > = value;
让 < 变量名 > = 值;
让变量的值等于
以;结束
。
例子
let randomValue100 = Random%100;
意思为让随机变量100等于一个随机0-999除以100取余的值
如果以后要更改此值,请以完全相同的方式编写。
请记住,所有将值放入局部变量的描述都是这种格式。
引用局部变量
用途:$ Variable name
$变量名
引用上面例子中声明的变量。
$ randomValue100
——————————————— ——————————
Functions;(方法)
一个函数是一组进程。
一个函数,它允许您调用和执行您之前在与 Statedef 不同的位置编写的工作,从状态内部调用。
不用写一个要多次使用的流程,可以把流程抽象成函数的形式,只写调用语句。
在 CNS 中,要实现的功能越复杂,代码就越复杂。但是,在ZSS中,这可以通过使用函数在一定程度上解决。
方法定义
用: Function FunctionName()
Function 方法名()
类似于 Statedef 定义。
示例:在 KO 期间播放语音的功能。
[Function PlayKOSound()]
PlaySnd{value: 11,0}
如果需要,您还可以编写参数和返回值。
[Function FunctionName(argumentName) return valueName]
调用函数
call FunctionName();
call 方法名
写成: 只有写在调用状态上面的函数才能被调用,所以要注意调用的顺序。
示例:调用上面编写的 PlayKOSound() 函数:call PlayKOSound ();
您还可以使用call FunctionName(argument);
以下方法包含参数: 有关详细信息,请参见下文。
函数参数
函数可以接收参数并对其进行处理。这可用于编写输入不同的进程。
参数列在括号内,并用逗号分隔。
示例:以参数中指定的音量播放声音。
[Function PlayKOSound(VoiceVolume)]
PlaySnd{
value: 11,0;
volumeScale: $VoiceVolume;
}
-
函数将接收到的参数视为局部变量。
要调用它,我们使用:call PlayKOSound(200);
或call PlayKOSound(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();