本章依然以中文功夫男为实例来看投技的编写,投技的基本原理是将对方拉入自己的状态,从而达到控制对方动作的目的,我们依然来看中文功夫男的投技如何写的。
下图中红框部分是功夫男的投技构成,需要用到四个statedef,其中800是功夫男做出投技的动作、810是抓住对方在扔的状态,820是控制对方被抓住以及在被扔的状态,821是让对方在被扔出去后解除控制的状态,大部分投技都是这个思路。
1、功夫男做出投技的动作
;惯例定义一下动画
[Statedef 800]
type = S
movetype= A
physics = S
juggle = 0
velset = 0,0
ctrl = 0
anim = 800
sprpriority = 2
;定义投技的攻击参数,基本可以照抄。注意,常规手段是无法用hitdef定义投技伤害的,所以这里不写伤害
[State 800, 1]
type = HitDef
Trigger1 = Time = 0 ;动作发生第0帧时发动
attr = S, NT ;属性: 站立,普通投
hitflag = M- ;能击中地面上非受击状态的敌人
priority = 1, Miss ;低优先度,必须为miss或dodge
sparkno = -1 ;没有火花
p1sprpriority = 1 ;务必填1或2,让p1的位图在p2之前
p1facing = 1
p2facing = 1 ;强制让对方面对我方
p1stateno = 810 ;成功的话p1,也就是功夫男转到810号状态
p2stateno = 820 ;成功的话p2,也就是对方转到功夫男的cns里的820号状态
guard.dist = 0 ;这样对方不能转到防御state
fall = 1 ;强制对方落地
;出招结束后回到站立状态
[State 800, 2]
type = ChangeState
Trigger1 = AnimTime = 0
value = 0
ctrl = 1
注意:有的时候(比如KOF的指令投)要求可以打中受击硬直中的敌人,但是不能打中防御硬直中的敌人。这种情况就要写两个hitdef,第一个是当对方不在防御状态时触发,hitflag不带减号,第二个当对方在防御状态时触发,hitflag带减号
2、功夫男抓住对方在扔的状态
[Statedef 810]
type = S
movetype= A
physics = N
anim = 810
poweradd = 0
[State 810, Grab Sound];抓取和扔出去时的声音时的声音,不多做解释了
……
[State 810, Throw Sound]
……
;这段用来将对方拉至相对于自己的坐标位置,这里定义的是第一帧的位置
[State 810, Bind 1]
type = TargetBind
trigger1 = AnimElemTime(2) < 0
pos = 28, 0
;这段用来处理投技发生在屏幕边缘时的情况,会将主角拉离边缘
[State 810, Width 2-11]
type = Width
trigger1 = AnimElemTime(2) >= 0 && AnimElemTime(12) < 0
edge = 60,0
;这段用来将对方拉至相对于自己的坐标位置,这里定义的是第二帧至第5帧的位置
[State 810, Bind 2-4]
type = TargetBind
trigger1 = AnimElemTime(2) >= 0 && AnimElemTime(5) < 0
pos = 58, 0
[State 810, Bind 5];同样是设置对方坐标的,基本就是把每帧对手还在被抓取期间所在的位置调整好,不多解释了
……
[State 810, Bind 6]
……
[State 810, Bind 7]
……
;投技于第11帧造成78点伤害,如果不希望是固定伤害,可以写公式
[State 810, Hurt 11]
type = TargetLifeAdd
trigger1 = AnimElem = 11
value = -78
;将对方扔出去后,让对方跳转到821号状态
[State 810, Throw 11]
type = TargetState
trigger1 = AnimElem = 11
value = 821
;如果角色使用的是过肩摔,那么需要加上下面这两段
[State 810, holdfwd - Turn 6] ;角色自身在第6张图时转向
type = Turn
trigger1 = AnimElem = 6
[State 810, holdfwd - Turn Target 6] ;让对手在角色第6张图转向
type = TargetFacing
trigger1 = AnimElem = 6
value = -1
;招式结束归位,不多解释
[State 810, State End]
……
3、控制对方被抓住以及在被扔的状态
;照抄,但不关联动画,因为这个状态是给对手用的
[Statedef 820]
type = A
movetype= H
physics = N
velset = 0,0
;一定要用ChangeAnim2,这样对手会读取功夫男的820号动作的每一帧坐标,然后配上对方820号动作的图片。如果使用ChangeAnim的话,对手会读取自己的820号动作坐标。
[State 820, 1]
type = ChangeAnim2
Trigger1 = Time = 0
value = 820
;功夫男如果出于某种原因中途离开了投的state,这个控制器能保证对方不被卡在这个state里。
[State 820, 2]
type = SelfState
trigger1 = !gethitvar(isbound)
value = 5050
4、控制对方被丢出去时的状态
;在这个state里对方在空中落下直到着地。此时,SelfState控制器让对方回到自己cns的state里。
[Statedef 821]
type = A
movetype= H
physics = N
velset = 2.8,-7
poweradd = 40 ;被投的一方加40气
[State 821, 1] ;丢出去后的重力加速度
type = VelAdd
Trigger1 = 1
y = .4
;在接近地面时受身(使用ChangeState),如果不希望被投的一方可中途受身则可以不写这段
[State 821, 2]
type = ChangeState
triggerall = Vel Y > 0
triggerall = Pos Y >= -20
triggerall = alive
triggerall = CanRecover
trigger1 = Command = "recovery"
value = 5200 ;HITFALL_RECOVER
;在空中受身(使用SelfState),如果不希望被投的一方可中途受身则可以不写这段
[State 821, 3]
type = SelfState
triggerall = Vel Y > 0
triggerall = alive
triggerall = CanRecover
trigger1 = Command = "recovery"
value = 5210 ;HITFALL_AIRRECOVER
;着地,让对方回到5100号状态,5100号状态在common1.cns里是倒地的状态,所以人物的基础动作编号要按照规定的来
[State 821, 4]
type = SelfState
trigger1 = Vel Y > 0
trigger1 = Pos Y >= 0
value = 5100