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

1.png


 # 如何使用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


2.png

                                                             图片示例

--------------------------------------------- ------------------------------


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(); 

暂无评论
根据相关规定,发布评论前必须绑定手机前往绑定
你,确定要这么做吗?
正在处理中...