キャラクター改造のスゝメ 超上級編2
相手が空中にいるときの、重力加速度について


 超上級編1では、地上の相手のX方向の距離について計算する方法を書きましたが、

 今回はコンボ中の相手が空中に居て、自分の当てたHitDefのパラメーターがFall = 1で

 fall.recover = 0もしくはfall.recovertimeが十分大きい値の場合に、

 その落下中のY方向の距離を計算する方法についてまとめてみようと思います。

 間違ったことを書いているかもしれないので誰か突っ込んでくれると有難いです。

 

 結論から先に言うと、現在自分は以下のような記述で対応しています。

 

 ・まずAIの上のほうに下記の記述を加える

[state -3,情報取得];摩擦or重力測定
type = null
triggerall = var(59)&&RoundState=2&&Alive
trigger1 = EnemyNear,StateType=S
trigger1 = fvar(30):=EnemyNear,Const(movement.stand.friction)
trigger2 = EnemyNear,StateType=C
trigger2 = fvar(30):=EnemyNear,Const(movement.crouch.friction)
trigger3 = EnemyNear,StateType=A
trigger3 = fvar(30):=EnemyNear,GetHitVar(yaccel)
persistent = 1
IgNoreHitPause = 1
PauseMoveTime = 9999
SuperMoveTime = 9999
;ここまでは「上級編1」と同じなので、すでにそっちを参考にしてるなら省略しても構いません。

[state -3,情報取得];速度
type = null
triggerall = var(59)&&RoundState=2&&Alive
trigger1 = fvar(34):=EnemyNear,Vel Y&&0
trigger2 = fvar(35):=(P2BodyDist Y+(Const(size.mid.pos.y)))&&0
persistent=1
IgNoreHitPause=1
PauseMoveTime=9999
SuperMoveTime=9999

 

 ・次に、triggerall = P2BodyDist Y = [-120,-80]とかしている部分を、下記のtriggerに入れ替える

  ※例 攻撃判定が出るのがステートの開始から15フレーム目で、縦方向のリーチが120ピクセルの技の場合

triggerall = var(40):=Ceil(fvar(34)+(fvar(30)*1)+(fvar(30)*2)+(fvar(30)*3)+(fvar(30)*4)+(fvar(30)*5)+(fvar(30)*6)+(fvar(30)*7))||1
triggerall = var(40):=var(40)+Ceil((fvar(30)*8)+(fvar(30)*9)+(fvar(30)*10)+(fvar(30)*11)+(fvar(30)*12)+(fvar(30)*13)+(fvar(30)*14))||1
triggerall = fvar(35)+var(40)=[-120,-80]

 

 もし僕の方法を参考にしたいという方が居るなら、この部分をコピー&ペーストして頂ければそれでOK(のはず)です。

 以下に、細かく原理を解説しようと思います。

  ※1 当然ながら、使用しているvar(40)、fvar(34)~fvar(35)が未使用なのを確認してからにしましょう。

  ※2 winmugenは一行に書ける記述が決まっているのでいちいち変数に格納していますが、1.0以降なら必要ないかもしれません。

  ※3 これは、落下中の相手を拾うときの記述なので、上昇中の相手にコンボする場合は、また別途計算が必要になります。


 上級編1でも書いたとおり、MUGENはゲームとはいえど、基本的には速度や距離といったものは高校で習うような物理法則に沿っている

 ・・・はずなのですが、どうも食らい中の相手の落下速度は特殊なようで、

 一般的に落下中の物体のt[sec]後の距離は Y[m] = 1/2gt^2としたいところですが、

 単純に自分のHitDefで設定した『yaccel』の値が毎フレーム落下速度に加算されるだけのようです。

 

 つまりこれをMUGENのtriggerに当てはめると、相手の落下速度Vは『Enemy,Vel Y』、と言い換えることが出来、

 自分の設定したyaccelの値は『Enemy,GetHitVar(yaccel)』で取得することが出来るので

 1フレーム後の相手の落下速度は

Enemy,Vel Y

 2フレーム後の相手の落下速度は

Enemy,Vel Y + Enemy,GetHitvar(yaccel)

 3フレーム後の相手の落下速度は

Enemy,Vel Y + Enemy,GetHitvar(yaccel) + Enemy,GetHitvar(yaccel)

 4フレーム後の相手の落下速度は

Enemy,Vel Y + Enemy,GetHitvar(yaccel) + Enemy,GetHitvar(yaccel) + Enemy,GetHitvar(yaccel)

 と なります。

 

 ※ 某ステートコントローラー一覧というサイトに、「HitDefのyaccelは省略時相手の重力に依存」と書かれていますが

   どうも僕が調べた限りだと省略時は0.35で固定なようです。

   まぁどっちにしろEnemy,GetHitVar(yaccel)で取得出来るので同じことですが。


 まとめると、相手落下中に1フレーム後の相手との縦方向の距離は

P2BodyDist Y + Enemy,Vel Y

 2フレーム後の相手との距離は

P2BodyDist Y + Enemy,Vel Y + Enemy,GetHitVar(yaccel)

 3フレーム後の相手との距離は

P2BodyDist Y + Enemy,Vel Y + Enemy,GetHitVar(yaccel) + Enemy,GetHitVar(yaccel)*2

 4フレーム後の相手との距離は

P2BodyDist Y + Enemy,Vel Y + Enemy,GetHitVar(yaccel) + Enemy,GetHitVar(yaccel)*2 + Enemy,GetHitVar(yaccel)*3

・・・

 

 これをコンボで出したい技の攻撃判定が出るフレームまでやれば、完璧に相手との離れる距離が取得できる(はず)です。

 この計算を変数に格納し分かりやすくしたものが、上記のテンプレートです。


講座TOPへ

TOPへ

inserted by FC2 system