在官方声明中,M.U.G.E.N的主程序不得用于商业用途,但未限制人物等民间制作的资源的使用

(九)投技

本章依然以中文功夫男为实例来看投技的编写投技的基本原理是将对方拉入自己的状态从而达到控制对方动作的目的我们依然来看中文功夫男的投技如何写的。

下图中红框部分是功夫男的投技构成需要用到四个statedef,其中800是功夫男做出投技的动作、810是抓住对方在扔的状态,820是控制对方被抓住以及在被扔的状态,821是让对方在被扔出去后解除控制的状态,大部分投技都是这个思路。

blob.png

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 


你,确定要这么做吗?
正在处理中...