看懂common1.cns.zss中的内容(文件位置在data文件夹下)
翻译者:雨没有眼泪
转载已授权
文章首发地址(可获得更好阅读体验):https://www.bilibili.com/read/cv11734193
如果你已经阅读过上一篇文章并且有了一定的自我理解,那么你可以开始本章的阅读了
先是一段公用的ZSS代码(只提取了一小部分进行解释说明,但应该能满足学习需求
#-------------------------------------------------------------------------------
#站立
[Statedef 0; type: S; physics: S; sprpriority: 0;]
if cond(Anim = 5, AnimTime = 0, Anim != 0) {
ChangeAnim{value: 0}
}
if Time = 0{
VelSet{y: 0}
}
if Time = 4 || abs(Vel X) < ifelse(MajorVersion = 1,
Const(movement.stand.friction.threshold), 2) {
VelSet{x: 0}
}
if !Alive{
ChangeState{value: 5050; ctrl: 0}
}
#你可能会看不懂但没关系下面我会尽我的可能帮助你理解
#====================================================================
# 站立
[Statedef 0; type: S; physics: S; sprpriority: 0;]
; 等价于站立
[Statedef 0]
type = S
physics = S
sprpriority = 0
# ChangeAnim(改变动画)
if cond(Anim = 5, AnimTime = 0, Anim != 0) {
ChangeAnim{value: 0}
}
# CNS和ZSS比对和逻辑
if cond(Anim = 5, AnimTime = 0, Anim != 0)
# 是怎么完成trigger1-2的条件的
# cond类似于ifelse
# cond(筛选条件, 条件1, 条件2)
# 当筛选条件为真时,执行条件1。当筛选条件为否,执行条件2
# 逻辑为
# anim = 5 时执行条件1 animtime = 0对应trigger1
# trigger1 = anim = 5 && amintime = 0
# anim != 5 时执行条件2 Anim != 0对应trigger2
# trigger2 = anim != 5 && amin != 0
;等价于CNS
[State 改变动画]
type = ChangeAnim
trigger1 = Anim != 0 && Anim != 5
trigger2 = Anim = 5 && AnimTime = 0 ;改变动作
value = 0
# VelSet(速度设置)
if Time= 0 {
VelSet{y: 0}
}
# CNS和ZSS比对和逻辑
if Time = 0
# 这个就比较简单了
# time = 0时为真执行
#等价于CNS
[State 速度设置]
type = VelSet
trigger1 = Time = 0
y = 0
# VelSet(速度设置)
if Time = 4 || abs(Vel X) < ifelse(MajorVersion = 1,
Const(movement.stand.friction.threshold), 2) {
VelSet{x: 0}
}
# CNS和ZSS比对和逻辑
# ifelse语句不做更多解释,参考上面的cond
;等价于CNS
[State 速度设置] ;如果低速度保持4帧以上则停止移动
type = VelSet
trigger1 =abs(Vel X)<ifelse(MajorVersion = 1,Const(movement.stand.friction.threshold), 2)
trigger2 = Time = 4
x = 0
;---------------------------------------------------------------------------------------------------------
MajorVersion为Ikemen的特有触发器
如果 def 文件中的 mugenversion 为 1.0 或更高,则返回 1。
格式:
MajorVersion
参数:
无
返回类型:
boolean int (1 or 0)
布尔型 int型 1或者0
;---------------------------------------------------------------------------------------------------------
# 内容并不复杂所以不进行解释参考上方的速度设置
if !Alive{
ChangeState{value: 5050; ctrl: 0}
}
#-------------------------------------------------------------------------------
# 站立到蹲下(与站立相同而且内容并不复杂所以不进行解释)
[Statedef 10; type: C; physics: C; anim: 10;]
if Time = 0 {
VelMul{x: .75}
}
if abs(Vel X) < Const(movement.crouch.friction.threshold) {
VelSet{x: 0}
}
if AnimTime = 0 {
ChangeState{value: 11}
}
#-------------------------------------------------------------------------------
# 站立到蹲下(与站立相同而且内容并不复杂所以不进行解释)
[Statedef 11; type: C; physics: C; anim: 11; sprpriority: 0;]
if Anim = 6 && AnimTime = 0 {
ChangeAnim{value: 11}
}
if abs(Vel X) < Const(movement.crouch.friction.threshold) {
VelSet{x: 0}
}
#-------------------------------------------------------------------------------
# 蹲下到站立(与站立相同而且内容并不复杂所以不进行解释)
[Statedef 12; type: S; physics: S; anim: 12;]
if AnimTime = 0 {
ChangeState{value: 0}
}
#-------------------------------------------------------------------------------
# 走路
[Statedef 20; type: S; physics: S; sprpriority: 0;]
if Command = "holdback" {
VelSet{x: Const(velocity.walk.back.x)}
} else if Command = "holdfwd" {
VelSet{x: Const(velocity.walk.fwd.x)}
}
# CNS和ZSS比对和逻辑
# 这里可能涉及到你的知识盲区了,如果你有接触过编程此段代码你可能一下就明白了,但我# 还是会认真说一遍
#if...elseif这是一个编程常用的语句,和mugen中ifelse类似
#上面代码逻辑为
#如果 Command = "holdback" 为真 执行VelSet{x: Const(velocity.walk.back.x)}
#如果 Command = "holdback" 为假
#否则如果 Command = "holdfwd" 真 执行VelSet{x: #Const(velocity.walk.fwd.x)}
#如果都为假那么上面的代码都不会执行
;等价于
[State 示例代码]
type = VelSet
trigger1 = command = "holdfwd"
x = const(velocity.walk.fwd.x)
[State 示例代码]
type = VelSet
trigger1 = command = "holdback"
x = const(velocity.walk.back.x)
#这段不做更多的解释
if Vel X > 0 {
if cond(Anim = 5, AnimTime = 0, Anim != 20) {
ChangeAnim{value: 20}
}
} else if Vel X < 0 {
if cond(Anim = 5, AnimTime = 0, Anim != 21) {
ChangeAnim{value: 21}
}
}