人生エクソダス

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

MUGEN小話 2 自分と相手の高さと攻撃判定の相関

2020-01-12 18:58:43 | MUGEN

 p2bodydist yがp2dist yと変わらないとかpos yとはじゃあどう違うのか、とか、空中にいる相手と攻撃判定の相関のはかり方がわからない。これがまた自分が空中に居る時と自分が地上にいる時でいろいろ変わってよくわからない。かと言ってすごい拾うの上手なAIの記述を見ても変数代入・ヘルパーとんでもなくててんで理解できない。
 これで合ってれば良いなあという期待を込めた記述として記述のひな形を書き残す。

 まず大前提として、p2bodydist y=p2dist y。bodydist xの場合キャラ幅を含めているのでdist xと内容が変わるがdist yに関しては一緒。
 さらに、敵がのけぞり中かそうでないかで変わるvel x、vel y、yaccel。
 enemy(var(xx)),movetype!=h(敵のけぞり中じゃない)のときは、enemy(var(xx)),vel x、enemy(var(xx)),vel y、enemy(var(xx)),const(movement.yaccel)
 enemy(var(xx)),movetype=h(敵のけぞり中)のときは、enemy(var(xx)),gethitvar(xvel)、enemy(var(xx)),gethitvar(yvel)、enemy(var(xx)),gethitvar(yaccel)
 これをtriggerで記入する時に注意しないといけない。それか変数にして別に記入しておくか。


[地対空] 攻撃発生10F・判定Y座標上限-89の場合
   p2dist y+enemy(var(xx)),vel y*5 >= -89*const(size.yscale)

 -89というのは攻撃判定のy座標の上限。相手の浮いてる時間を厳密にenemy,const(movement.Yaccel)使うのを面倒くさがって10F目に攻撃判定が出るので、さすがに等速で浮かないでしょということでvel y*5(5F分)くらいにしてみる。

 蜂百合氏のAIでは、↑のenemy(var(xx),vel y*5にあたる部分をfvar(11)として、ステコンの中で代入させている。
Triggerall =1 || fvar(11) := Ifelse( enemy(var(20)),MoveType!=H ,enemy(var(20)),const(Movement.Yaccel) ,playerid(var(8)),GetHitVar(Yaccel) )
Triggerall =1 || fvar(11) := Floor(( enemy(var(20)),Vel Y * fvar(10) ) + ( Fvar(11)*( (fvar(10)*(fvar(10)-1))/2) ))
Triggerall =1 || fvar(11) := fvar(11) * (enemy(var(20)),StateType = A)
 がトリガーに入っていて直に代入されている。
 このfvar(10)というのは攻撃発生フレームで、↑の例を使えば10ということになる。で、この記述のすごいところは、相手が空中(statetype=a)のときは1が代入されるのでそのままfvar(11)としてこの行より上の部分で計算された値が代入されるが、相手が空中でなかったら0、つまりfvar(11)自体を計算しない。
 fvar(10)を代入してfvar(11)を出しているので、たぶん落下加速度を勘案した正確なy座標を出せるのだろうと思う。
 1||としているのは、うっかり計算結果が0になってしまったらステコン自体読み込んでくれないので、とりま進めていく為にnull代入では必要な工程。


[空対地] 攻撃発生10F・判定Y座標上限-89の場合
  p2dist y+ifelse(enemy(var(xx)),statetype=S ,enemy(var(xx)),Const(Size.head.pos.Y) ,enemy(var(xx)),Const(Size.Mid.Pos.Y)
)>= -82*const(size.yscale)+vel y*5

 -82というのは攻撃判定のy座標の上限。ifelseを使って、相手が立ちならhead.posしゃがみならmid.posを参照するようにY座標割り出す記述を蜂百合氏のAIからぱくる。適当に、10F目に攻撃判定が出るのでvel y*5(5F分)―さすがに等速で浮かないでしょということで*10ではなく*5にしてみる。
 立ち屈みの判別がめんどくさい・相手を飛び越える高さでざっくり決めるということなら+enemy(var(xx)),const(size.head.pos.y)などを-enemy(var(XX)),const(height)にすればいいかもしれない。いずれにしても相手の座標を引いた結果攻撃判定の座標になるように設定。


[空対空] p2dist y+0.5*const(movement.yaccel)*16+(vel y+0.5*enemy(var(20)),vel y)*4 >= (-61-8)*const(size.yscale)+const(size.height)

 OG子 OGヲ氏のジャンプふっとばしの記述を丸パクして、helperで動作全管理してるキャラからのなのでroot,とついてる部分を全部削除。4F目に攻撃判定が出るので4*4の*16をmovement.yaccelに掛けて、自分の空中での移動速度vel yと相手の空中での移動速度enemy,vel yを4F分掛ける。丸パクなので0.5をどうして掛けているか分からなかったが、要は1+2+3+4=(4*(4+1))/2であり、いちいちmovement.yaccelのシグマを足して長い式にしなくても2乗÷2で同じ値を求められるのだ。攻撃判定はY軸から見れば最大も最小もマイナスなのでキャラ高さのsize.heightを足して調節。
 (-61-8)の-8は、このステート攻撃判定前にanimelemno(xx)=zzでvelsetが入っていてそこから先はY座標が動かないから。攻撃判定が出るまでvelsetがなければ別に引く必要はない。velsetが有る場合は、掛けるフレーム数をanimelemno(xx)=zzまでのものにして、「それ以降から攻撃判定前までのフレーム数*velsetで指定された移動速度」を別途に引いている。-8はこの場合velset y=4で判定まで2Fだったため。

 これで想定どおり動くかはわからない。だからAI制作は大変だ。



最新の画像もっと見る

コメントを投稿