人生エクソダス

なんてことのない日々のこもごもをつらつらと書き連ねたり連ねなかったりする。

MUGEN小話 7 自分と相手の距離を測る

2020-09-03 16:12:10 | MUGEN

 普通に考えたらp2bodydist xとyでいいだろ、という話。だがこれはかなり大雑把なので、もう少し細かくしたいなら色々考えて記述していくことになる。が結局難しすぎてなんも振れないとなったら本末転倒なのでそこは匙加減になる。


;■P1中心軸からP2接触判定までの距離
[State -1, enemy(var(20))pos x-pos x]
Type = null
; P2距離判定 (P1地上&同一方向)  (P2がめくった時など) 
trigger1 = enemy(var(20)),facing=facing && statetype!=a
trigger1 = fvar(7):= ceil( ((enemy(var(20)),pos x*enemy(var(20)),facing*-1) -(pos x*facing*-1))*-1 )
trigger1 = fvar(7):= fvar(7) -ifelse(enemy(var(20)),statetype=a ,enemy(var(20)),const(size.air.back) ,enemy(var(20)),const(size.ground.back))
; P2距離判定 (P1空中&同一方向)  (P1がめくった時など) 
trigger2 = enemy(var(20)),facing=facing && statetype=a
trigger2 = fvar(7):= ceil( (enemy(var(20)),pos x*enemy(var(20)),facing)+(pos x*facing*-1) )
trigger2 = fvar(7):= fvar(7) -ifelse(enemy(var(20)),statetype=a, enemy(var(20)),const(size.air.front) ,enemy(var(20)),const(size.ground.front))
; P2距離判定 (対面方向)  (通常時) 
trigger3 = enemy(var(20)),facing*-1=facing
trigger3 = fvar(7):= ceil( (enemy(var(20)),pos x*enemy(var(20)),facing*-1)+(pos x*facing*-1) )
trigger3 = fvar(7):= fvar(7) -ifelse(enemy(var(20)),statetype=a, enemy(var(20)),const(size.air.front) ,enemy(var(20)),const(size.ground.front))
ignorehitpause = 1

 これは間桐桜のAIのX座標の距離の測定方法をぱくったやつだが、有効に使えてない気がするので上級者向けなのだろう…。肝は敵が背中を向けている、つまりfacing=enemynear,facing(自分と敵の向きが一緒)のときと普通に面と向かっての移動ではX座標の移動速度が違うということ。シングル戦でも”めくり”の場面ではこうなるだろうが特に考える必要はないものの、タッグ戦では敵が背中を向けているケースは十分考えられるので、そういう相手の移動速度の測り方を考えるならこうなるだろう。


;■相手の摩擦係数
[State -1, friction]
Type = null
trigger1 = enemy(var(20)),statetype=s
trigger1 = fvar(9):= enemy(var(20)),const(movement.stand.friction)
trigger2 = enemy(var(20)),statetype=c || enemy(var(20)),statetype=l
trigger2 = fvar(9):= enemy(var(20)),const(movement.crouch.friction)
trigger3 = enemy(var(20)),statetype=a
trigger3 = fvar(9):= 0
ignorehitpause = 1

;■相手の移動方向・速度
[State -1, Target Vel X]
type = null
trigger1 = 1
trigger1 = fvar(8):=0 ||1
trigger2 = numenemy
trigger2 = fvar(8):= ifelse(enemy(var(20)),movetype=h ,-enemy(var(20)),gethitvar(xvel) ,enemy(var(20)),vel x)* ifelse(facing!=enemy(var(20)),facing ,1 ,-1)
trigger2 = fvar(8):= fvar(8)*fvar(9)
ignorehitpause = 1

 constに立ち・屈み・空中の状態の時のX座標の摩擦係数、つまり時間に比例し減速する値が設けてあり、まあつまり普通は等倍で移動しないよね不自然だよねという話なのでよく考えたら当然だが、これがp2bodydist xで単純に数字を入れるとスカるきっかけにもなる。具体的には「X座標の上限ぎりぎりで技を振ったら、のけぞり距離が長かったりして当たらなかった」という場面だ。いつでも密着状態で技を振るわけではないので、これによって当たる当たらないが変わってくる。面倒ながら相手がのけぞりなのかそうでないのかでX移動速度の測定法が変わる。のけぞり中ならenemy,gethitvar(xvel)、そうでなければenemy,vel xとなる。p2で測る方法がないので式が長くなる。途中の打ち間違いに注意しないとエラーを吐く。ちなみにvel xとgethitvar(xvel)では同じ方向でもプラスマイナスが異なるらしい。

 実は↑式のfvar(8)をenemy,vel xの代わりとして掛け算しても摩擦係数は最初しかかかっていないので実数値より大きくなる。例えば15Fに攻撃判定が出る技のためにfvar(8)*15でX座標を求めても、実際そこまで大きくならない。が参照にはなる。