「座標」の編集履歴(バックアップ)一覧に戻る

座標 - (2013/02/06 (水) 17:25:55) のソース

----
:※解説修正情報※|
●&font(12,b){2013-02-06:検証途中だが一応追記}
●&font(12,b){2013-02-05:壁際に対するキャラ幅の1.0とwinの管理の違いを追記}

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

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

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

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

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

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

:■同一のX座標の場合|
-''※Win版と1.0版では処理が異なる模様''
-Win版では''常に1P側は左側、2P側は右側へ押し出す''。
-1.0版では''違いに向きが異なる場合は互いに後ろへ下がるように押し出される''
--向きが同一の場合''※再確認求む※''
---地上対空中の場合''空中側が、後ろ側へ下がるように押し出される''らしい
---空中同士では''向きにかかわらず1P側が右側へ押し出される''とのこと
//初期検証:ワープスター氏
//一応日付:2013-02-06

:■画面端に対するキャラ幅|
-''※Win版と1.0版では処理が異なる模様''
画面端に対しては基本的にキャラ幅は0だが、
[[SC-/Width]]で増減できる他、Statetypeによっても自動で増減する。
-StateType=S,StateType=Cでは0。[[○○EdgeDist>T-/BackEdgeDist]]=[[○○EdgeBodyDist>T-/BackEdgeBodyDist]]
-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]]の実行が必要。
//検証:ワープスター氏
//一応日付:2013-02-06

:■自動振り向き判定・処理|
-相手側が後ろにいて一定条件を満たす場合、ステート開始時点で?振り向きを行う。
--※例外として[[SC-/ChangeState]]でも判定が行われ条件を満たせば自動振り向きをする。
-自動振り向き判定の条件
--P2Dist X<0、StateType=SかC、Ctrl=1、AssertSpecialのNoAutoTurnが無い。
-自動振り向きの処理
--Turn(振り向き)が行われ、振り向きアニメがあれば表示アニメをそれにする。
--振り向きアニメはStatetype=S時5番、C時6番を使用する。
----
:■P2BodyDist Xの基準|
-「''キャラの前のキャラ幅の位置''」から&br()「''相手の基準座標基準で自分側のキャラ幅''」までの距離
--もちろん前側が正数(プラス)、後ろ側なら負数(マイナス)。
-もし相手の自分側のキャラ幅が異常に広く&br()自分の後ろ側へ飛び出ているは大きなマイナスになる。
--仕様の関係上相手に飛び越えられた際の座標の変遷は複雑怪奇である。
----
*■Lv3-複合処理による座標感知

#region(''■P2BodyDistを利用しない、リダイレクトによるBodyDis感知'')
-情報:「ADIのMUGENメモ」の距離計算のメモから
**P2BodyDist Xを利用しない、リダイレクトBodyDist X感知
#aa(){{
 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 );
}}
:やっていること|
-[[リダイレクト]][[T-/Pos X]][[T-/StateType]][[T-/Cpnst()]]を駆使して[[T-/Var()]]に代入。
-それぞれの違いはリダイレクトだけ。
:注意点|
-P2BodyDistとは異なり&b(){[[SC-/Width]]によるキャラ幅調整を認識できない}

#endregion

#region(''■ステージ端感知の方法・素案'')
**■ステージ端感知の方法・素案
[[SC-/Helper]]と[[SC-/Projectile]]で感知は可能。
Projectileには「ステージ端を設定値分超えると消える」という性質があり、
それをHelperと組み合わせて、ステージの端を感知することができる。

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

----