※解説修正情報※
2015-10-03:PossetPosAddの点を修正
2013-02-07:P2BodyDistはWidthを感知できないみたい
2013-02-06:検証途中だが一応追記
2013-02-05:壁際に対するキャラ幅の1.0とwinの管理の違いを追記


■座標と画面幅、キャラ幅他について

処理上の画面の大きさは
win版なら横「0~319」の320、縦「0,239」の240の320x240
Hires仕様だとウィンドウサイズのみ二倍の640x480となって、
試合画面は拡大して表示を行なっている。また1.0版では基本の大きさが異なる。

■試合のステージの大きさ
  • ステージ側の詳しい話はFile-/ステージDefファイルを参照。
  • 画面の横サイズは320だがステージの横幅の基本は0~320の321となっている。
    • そこに対してステージ設定のカメラの横移動限度と画面端の広さで横幅は決定される。
      • カメラの横移動限度はそのまま「画面カメラが動ける距離」のこと。
      • 画面端の広さは「表示されている画面での画面端の幅」のこと。
        • 1画面で左右に動ける距離は「321-画面端の幅×2(前後)」
        • 画面端の幅は基本15のため、画面内の移動できる横幅は「291」くらい。
        • ステージ自体の大きさは基本321+カメラの動ける量-画面端の幅である。
          • カメラの移動が0で画面端が広い場合、1画面より狭いステージになる。
  • なおX=320の座標に到達した場合、座標点は画面外に出ている。
    • キャラとしては基準座標の1点は考慮外のため幅の基本は320-αと考えて良い。
  • 画面上へは上限がほぼ無い。
  • キャラのスタート位置は、ステージで設定された数値である。
  • SC-/Screenboundによりキャラをカメラ制御をしない設定にすると
    • 本来の画面端より外側に出ることができる。
      • 外にいる状態でカメラ制御をOFFにしない場合、画面内まで引き戻される。
    • なおカメラ制御はステージ側で「スクロール位置」が設定されており
      • その外側にいると、Screenbound設定が解除された際に
        スクロール位置まで引き戻されるとのこと。

■ステージ端と画面端の違い
  • 端にはステージの端と画面端の二種類がある。
    • 基本的には同一だが、特殊な状況に置いては一致しない。
  • 画面の端はT-/BackEdgeDist他で感知可能だが、
    • ステージ端までの距離は自ら計測しないと分からない。
  • 基本的に画面の端へ近づけばステージ端までカメラは動くが
    • 反対の端にカメラ制御をするキャラいる場合、カメラは止まってしまう。
    • カメラ制御をしないキャラの場合はカメラに影響を与えない。
  • 特殊※倒れ状態(5110ステート?)ではカメラの動きに制限を加える模様?
    • 倒れた相手の反対へ移動してカメラを動かすと
      倒れた相手から左端なら5、右端なら4までの地点でカメラが止まる。
      • 切り捨ての関係上、右端が4となっているだけかもしれない。
    • 押し出し判定などで押しこめばそれよりも壁際に行くことはできるが。


■キャラと座標
座標の正負方向は
  • 画面基準
    • 横方向:右方向が正数(プラス)・左方向が負数(マイナス)
    • 縦方向:上側が負数(マイナス)、下側が正数(プラス)
  • キャラ基準
    • 横方向:向いている方向が正数(プラス)・後ろ側が負数(マイナス)
    • 縦方向:上側が負数(マイナス)、下側が正数(プラス)。
      • キャラの横の基準は「画面基準*Facing」でもある。
  • なおキャラの座標は小数単位まで計算されている
    • ×ただしPosSet,PosAddなど''Pos系で小数数値を指定することはできない
      • 小数数値も指定できる。
    • Vel、速度による移動や押し出し判定によって小数単位の移動が行われる。

■キャラの大きさ
キャラは基本的に基準点を地面とし上側に表示される。
また基準点から前後にキャラ幅が伸び、押し出し判定他の基準とする。

■キャラ同士の押し出し判定
キャラのFile-/CNSファイルSC-/Width変更で決定される「キャラ幅」と
キャラのアニメに設定されたくらい判定を基準・条件として押し出し判定を行う。
  • 押し出しをするタイミングキャラ処理の後・攻撃判定の前みたい?
  • SC-/PlayerPushの値が0の場合は押し出し判定を行わない。
    • プレイヤーキャラはデフォルトで1、Helperはデフォルトで0。
      • ただしHelperTypeがPlayerのHelperはデフォルトで1。
    • また味方同士(パートナー・Helper含む)とも押し出し判定は行わない。
  • 条件:互いのキャラ幅が重なっている状態で、くらい判定同士も重なっている
    • 互いの座標の方向へ、キャラ幅を基準とした押し出しを行う。
      • 押し出し距離については検証不足だが、
        基本的に「キャラ幅の外まで」と思っていい。
  • なおStatetype=Sの場合
    • CNSファイルで設定されたHeight*-1より高い相手と押し出し判定を行わない。

■同一のX座標の場合
  • ※Win版と1.0版では処理が異なる模様
  • Win版では常に1P側は左側、2P側は右側へ押し出す
  • 1.0版では違いに向きが異なる場合は互いに後ろへ下がるように押し出される
    • 向きが同一の場合※再確認求む※
      • 地上対空中の場合空中側が、後ろ側へ下がるように押し出されるらしい
      • 空中同士では向きにかかわらず1P側が右側へ押し出されるとのこと

■画面端に対するキャラ幅
  • ※Win版と1.0版では処理が異なる模様
画面端に対しては基本的にキャラ幅は0だが、
SC-/Widthで増減できる他、Statetypeによっても自動で増減する。
  • StateType=S,StateType=Cでは0。○○EdgeDist=○○EdgeBodyDist
  • StateType=Aは壁に対して+1の幅が発生する。○○EdgeDist+1=○○EdgeBodyDist
  • StateType=Lは壁に対して+2の幅が発生する。○○EdgeDist+2=○○EdgeBodyDist
    • ただしこの壁に対する幅は1.0版だと無視される模様。詳しくは後記
Win版では空中では倒れよりも壁際に近づけ、立ち屈みよりは近づけないということ。
  • 具体例:壁際にいる相手に対して空中(+1)から裏回ろうとする場合
    • 相手が立ち屈み(0)である場合、空中(+1)の方が壁から遠いため裏回りにくい。
    • 相手が倒れ(+2)である場合、空中(+1)の方が壁に近いため裏回りやすい。
    • 相手も空中(+1)の場合、座標が重なった場合の押し出し判定を適応する。
という具合。SC-/Widthを実行することで調整は可能。
○○EdgeBodyDistはその時点での壁際に対する近づける距離を返す。
  • ※1.0版について
    • 1.0版でも上記のBodyDist,Distの差は発生するが壁からの押し出しには影響しない
    • そのためステコンを使わずにBodyDistが負数になる地点まで壁際に接近できる。
    • その関係上、倒れ時でも空中でも立ち状態と同じ地点まで近づける
    • そして1.0版の向きを基準とする押し出し処理の関係上
      • 壁際倒れなどに対して飛び越えて裏回ることなどが難しくなっている
      • Win版の処理を再現するには各自でSC-/Widthの実行が必要。

■自動振り向き判定・処理
  • 相手側が後ろにいて一定条件を満たす場合、ステート開始時点で?振り向きを行う。
    • ※例外としてSC-/ChangeStateでも判定が行われ条件を満たせば自動振り向きをする。
  • 自動振り向き判定の条件
    • P2Dist X<0、StateType=SかC、Ctrl=1、AssertSpecialのNoAutoTurnが無い。
  • 自動振り向きの処理
    • Turn(振り向き)が行われ、振り向きアニメがあれば表示アニメをそれにする。
    • 振り向きアニメはStatetype=S時5番、C時6番を使用する。


■P2BodyDist Xの基準
  • キャラの前のキャラ幅の位置」から
    相手の基準座標基準で自分側のキャラ幅」までの距離
    • もちろん前側が正数(プラス)、後ろ側なら負数(マイナス)。
  • もし相手の自分側のキャラ幅が異常に広く
    自分の後ろ側へ飛び出ているは大きなマイナスになる。
    • 仕様の関係上相手に飛び越えられた際の座標の変遷は複雑怪奇である。


■Lv3-複合処理による座標感知


+■P2Distなどを利用しない、リダイレクトによるDist算出

P2Distなどを利用しないリダイレクトDistの算出

  • ( リダイレクト,Pos X - Pos X )で基本距離を算出できる。
  • ただしそのままだと右向き時の数値のため*Facingも加えること
Floor( リダイレクト,Pos X - Pos X ) *facing;X距離
Floor( リダイレクト,Pos Y - Pos Y );Y距離

P2BodyDist Xを利用しない、リダイレクトBodyDist Xの算出

  • 情報:「ADIのMUGENメモ」の距離計算のメモから・微調整版

 P2BodyDistの数値を、P2BodyDistを使わずに計算する方法。
 Varを2個以上使います。例では30~35を使用
 ※基準座標で欲しければ相手までの距離の部分のみ使用する。

;■Enemynear,リダイレクトの相手座標認識
;※これをタッグに対応させる場合、EnemyNear,をEnemyNear(*Var(*生存相手認識*)*),などに置換してください。
[State adi , var bodydist 1]
Type=null
;X座標
Trigger1 =1||var(31):= Ifelse( (EnemyNear,StateType!= A), Ifelse( (Pos X <= EnemyNear,Pos X ^^ EnemyNear,Facing = 1),(EnemyNear,Const(Size.Ground.Front)),(EnemyNear,Const(Size.Ground.back)) ) , 0 );地上
Trigger1 =1||var(31):= Ifelse( (EnemyNear,StateType = A), Ifelse( (Pos X <= EnemyNear,Pos X ^^ EnemyNear,Facing = 1),(EnemyNear,Const(Size.Air.Front)),(EnemyNear,Const(Size.Air.back)) ) , var(31) ) ;空中
Trigger1 =1||var(30):= Floor( ( Pos X - EnemyNear,Pos X )* Facing * -1) ;相手までの距離
Trigger1 =1||var(30):= var(30) - var(31) * Ifelse(var(30)>0, 1 ,-1) ;キャラ幅加算
Trigger1 =1||var(30):= var(30) - Ifelse( (StateType != A), (Const(Size.Ground.Front)),(Const(Size.Air.Front)) ) ;自分情報
;Y座標
Trigger1 =1||var(31):= Floor( EnemyNear,Pos Y - Pos Y );

;■EnemyNear(1),リダイレクト(二人目用)
;※生存相手を認識させている場合は、EnemyNear(1),をEnemyNear(var(**)+1),に置換処理してください。
[State adi , var bodydist 2]
Type=null
TriggerAll = 1||(var(32):=var(30))||(var(33):=var(31)) ;2人目が居ない場合の数値※適当な数値に変えて良い
TriggerAll = NumEnemy > 1 ;二人以上である
TriggerAll = EnemyNear(0),Alive && EnemyNear(0+1),Alive ;両方生きている。
;X座標
Trigger1 =1||var(33):= Ifelse( (EnemyNear(1),StateType!= A), Ifelse( (Pos X <= EnemyNear(1),Pos X ^^ EnemyNear(1),Facing = 1),(EnemyNear(1),Const(Size.Ground.Front)),(EnemyNear(1),Const(Size.Ground.back)) ) , 0 );地上
Trigger1 =1||var(33):= Ifelse( (EnemyNear(1),StateType = A), Ifelse( (Pos X <= EnemyNear(1),Pos X ^^ EnemyNear(1),Facing = 1),(EnemyNear(1),Const(Size.Air.Front)),(EnemyNear(1),Const(Size.Air.back)) ) , var(33) ) ;空中
Trigger1 =1||var(32):= Floor( ( Pos X - EnemyNear(1),Pos X )* Facing * -1) ;相手までの距離
Trigger1 =1||var(32):= var(32) - var(33) * Ifelse(var(32)>0, 1 ,-1) ;キャラ幅加算
Trigger1 =1||var(32):= var(32) - Ifelse( (StateType != A), (Const(Size.Ground.Front)),(Const(Size.Air.Front)) ) ;自分情報
;Y座標
Trigger1 =1||var(33):= Floor( EnemyNear(1),Pos Y - Pos Y );

;■Partner,リダイレクト(パートナー用)
[State adi , var bodydist 3]
Type=null
TriggerAll = 1||(var(34):=0)||(var(35):=0) ;パートナーが居ない場合の数値※適当な数値に変えて良い
TriggerAll = NumPartner > 0 ;パートナーがいる
TriggerAll = Partner,Alive ;生きている。
;X座標
Trigger1 =1||var(35):= Ifelse( (Partner,StateType!= A), Ifelse( (Pos X <= Partner,Pos X ^^ Partner,Facing = 1),(Partner,Const(Size.Ground.Front)),(Partner,Const(Size.Ground.back)) ) , 0 );地上
Trigger1 =1||var(35):= Ifelse( (Partner,StateType = A), Ifelse( (Pos X <= Partner,Pos X ^^ Partner,Facing = 1),(Partner,Const(Size.Air.Front)),(Partner,Const(Size.Air.back)) ) , var(35) ) ;空中
Trigger1 =1||var(34):= Floor( ( Pos X - Partner,Pos X )* Facing * -1) ;相手までの距離
Trigger1 =1||var(34):= var(34) - var(35) * Ifelse(var(34)>0, 1 ,-1) ;キャラ幅加算
Trigger1 =1||var(34):= var(34) - Ifelse( (StateType != A), (Const(Size.Ground.Front)),(Const(Size.Air.Front)) ) ;自分情報
;Y座標
Trigger1 =1||var(35):= Floor( Partner,Pos Y - Pos Y );
やっていること
注意点
  • SC-/Widthによるキャラ幅調整を認識できない
    • P2BodyDistでも無理だが。

+■相手までの直線距離・素案

■相手までの直線距離・素案

相手までの縦横の距離ではなく直線で結んだ場合の距離を調べたい場合は、
T-/Sin()のページにある三角関数の応用について参照?


+■ステージ端感知の方法・素案

■ステージ端感知の方法・素案

SC-/HelperSC-/Projectileで感知は可能。
Projectileには「ステージ端を設定値分超えると消える」という性質があり、
それをHelperと組み合わせて、ステージの端を感知することができる。

実例としては参考ページ一覧から「ADIのMUGENメモ」様にある
「高速画面端感知システムCNS」が細かい調整だけで使用出来る。
※記述量が多めで複雑なため、下手に使わないこと。