・概要
「傾斜床」は、所謂「坂」のことを指す。
傾斜床は、画面上では「斜めの直線」として表現されているが、実際は、「矩形」として扱われている 。
傾斜床には「右上がり」「右下がり」の2種類がある。ここでは、「傾斜床(右上がり)」のMCを90[°]回転させたものを「傾斜床(右下がり)」として定義している。恐らく、一般的な方法ではないが、記述を統一するために、このような方法を採用した。
↓「傾斜床(右上がり)」のMC、「傾斜床(右下がり)」のMC。
ASのファイル:zero_hit_sloped_floor_sub.txt
if ( landform._rotation ==0 ) { sloped_floor_type=1 } //傾斜床の種類(1:右上がり,-1:右下がり)
else { sloped_floor_type=-1 }
・「if(landform._rotation==0){sloped_floor_type=1}」:回転させていない場合は傾斜床(右上がり)と定義される。
・「else{sloped_floor_type=-1}」:回転させた場合は傾斜床(右下がり)と定義される。
ちなみに、「sloped_floor_type」を用いることで、記述の簡略化が可能になると思われるが、解説がややこしくなると思われるので、実行していない。
・傾斜床(右上がり)との接触判定
・・概要
前提となる条件は、以下の通りとなる。
・
ゼロの場合は、床貫通判定がない場合に、判定を取得する 。床貫通判定に関しては、
貫通可能な床 を参照。
ASのファイル:zero_hit_sloped_floor.txt
if ( MC_hit_landform! ="zero" or ( MC_hit_landform=="zero" and zero_through_floor==0 ) ) { //ゼロの場合・床貫通判定がない場合,判定を取得する
︙
}
・・地形めり込み量の最大値(1)
「地形めり込み量の最大値」は、基本的には床と同様だが、移動量(x方向)を考慮した補正 を行っている点が異なる。
↓地形めり込み量の最大値の補正。直感的な説明だが、
傾斜床(右上がり)に向かって移動した場合、その移動量に応じて、地形めり込み量も大きくなる 。
・①:「MC_dx」。移動量(x方向)。
・②:「Math.abs(MC_dx*landform_gradient)」:
「移動量(x方向)」×「傾斜床(右上がり)の勾配」の絶対値 。
ASのファイル:zero_hit_sloped_floor_sub.txt
hit_y_max_down=initial_hit_y_max_down //地形めり込み量の最大値
if ( sloped_floor_type==1 ) {
if ( MC_dx> =0 ) { hit_y_max_down+=Math .abs ( MC_dx* landform_gradient) } //移動量(x方向)を考慮した補正
︙
}
・「hit_y_max_down=initial_hit_y_max_down」:「地形めり込み量の最大値」に、「地形めり込み量の最大値(初期値)」を代入する。全ての傾斜床で、傾斜床の勾配が同一であるとは限らないため、ループ毎に、「地形めり込み量の最大値」をリセットする必要がある 。
・「if(MC_dx>=0)」:移動量(x方向)が0以上の場合 。
・「hit_y_max_down+=Math.abs(MC_dx*landform_gradient)」:「地形めり込み量の最大値」に、「移動量(x方向)」×「傾斜床(右上がり)の勾配」の絶対値を加算する 。
・・地形めり込み量の最大値(2)
傾斜床(右上がり)に対して、右側から
エアダッシュ をした場合、位置関係によっては、接触判定が付加され、
ダッシュ に移行する場合がある。
↓傾斜床(右上がり)に対して、右側から
エアダッシュ をした場合。
接触判定 を付加させないために、地形めり込み量の最大値を減少させる必要がある。
ASのファイル:zero_hit_sloped_floor_sub.txt
else if ( _root .zero_action =="air_dash" ) { hit_y_max_down-=Math .abs ( MC_dx* landform_gradient) } //移動量(x方向)を考慮した補正(エアダッシュ)
・・地形めり込み量(1)
ゼロのx方向の位置が、傾斜床(右上がり)の左右の端の位置の間にある場合の「地形めり込み量」 は、以下の図の通りとなる。
↓地形めり込み量。
・①:「this.getBounds(_root.board).yMax」。ゼロのhitrectの下端の位置。
・②:
ゼロのx方向の位置に対応する、傾斜床(右上がり)の高さの位置 。下の図において算出している。
・③:「hit_y_sloped_floor」。①-②。
↓地形めり込み量。
・①:「landform_xmin」。
・②:「_parent._x」。ゼロのx方向の位置。
・③:②-①。
・④:③×「landform_gradient」。
・⑤:「landform_ymax」。
・⑥:
ゼロのx方向の位置に対応する、傾斜床(右上がり)の高さの位置 。⑤-④。
以上を纏めると、以下の記述の式となる。
ASのファイル:zero_hit_sloped_floor_sub.txt
if ( _parent ._x> =landform_xmin and _parent ._x< =landform_xmax) { //x方向の位置が左右の端の位置の間にある場合
if ( sloped_floor_type==1 ) { hit_y_sloped_floor=this .getBounds ( _root .board ) .yMax -( landform_ymax-landform_gradient* ( _parent ._x-landform_xmin) ) } //地形めり込み量
︙
}
・・地形めり込み量(2)
ゼロのx方向の位置が、傾斜床(右上がり)の右端の位置から外れた場合は、床と同様の処理を行う 。
床 も参照。
ASのファイル:zero_hit_sloped_floor_sub.txt
else if ( ( sloped_floor_type==1 and _parent ._x> landform_xmax) or ( sloped_floor_type==-1 and _parent ._x< landform_xmin) ) { //x方向の位置が右端の位置から外れた場合(傾斜床(右上がり)),x方向の位置が左端の位置から外れた場合(傾斜床(右下がり))
hit_y_sloped_floor=this .getBounds ( _root .board ) .yMax -landform_ymin //地形めり込み量
}
・・地形めり込み量(3)
ゼロのx方向の位置が、傾斜床(右上がり)の左端の位置から外れた場合は、処理を行わない 。
ASのファイル:zero_hit_sloped_floor_sub.txt
else { continue } //ループをスキップ
左端の箇所は、床・傾斜床を配置することで補う。
↓床を配置した例。
↓傾斜床(右上がり)を配置した例。
・・接触判定、位置調整
地形めり込み量が「0以上、最大値以下」の場合は、接触判定を付加し、位置調整を行う 。
↓x方向の位置が、傾斜床(右上がり)の左右の端の位置の間にある場合。
↓x方向の位置が、傾斜床(右上がり)の右端の位置から外れた場合。
ASのファイル:zero_hit_sloped_floor_sub.txt
if ( hit_y_sloped_floor> =0 and hit_y_sloped_floor< =hit_y_max_down) { //地形めり込み量が最大値以下の場合
hit_sloped_floor=i //接触判定
_parent ._y-=hit_y_sloped_floor //位置調整
︙
}
・傾斜床(右下がり)との接触判定
・・概要
「・傾斜床(右上がり)との
接触判定 」とほぼ同様の処理となるので、詳細な解説は省略する。符号や不等号の向きが変わる箇所があることに注意。
・・地形めり込み量
ゼロのx方向の位置が、傾斜床(右下がり)の左右の端の位置の間にある場合の「地形めり込み量」は、以下の図の通りとなる。
↓地形めり込み量。
・①:「this.getBounds(_root.board).yMax」。ゼロのhitrectの下端の位置。
・②:
ゼロのx方向の位置に対応する、傾斜床(右下がり)の高さの位置 。下の図において算出している。
・③:「hit_y_sloped_floor」。①-②。
↓地形めり込み量。
・①:「landform_xmin」。
・②:「_parent._x」。ゼロのx方向の位置。
・③:②-①。
・④:③×「landform_gradient」。
・⑤:「landform_ymin」。
・⑥:
ゼロのx方向の位置に対応する、傾斜床(右下がり)の高さの位置 。④+⑤。
以上を纏めると、以下の記述の式となる。
ASのファイル:zero_hit_sloped_floor_sub.txt
else { hit_y_sloped_floor=this .getBounds ( _root .board ) .yMax -( landform_ymin+landform_gradient* ( _parent ._x-landform_xmin) ) } //地形めり込み量
・地形に挟まれることによる即死判定(床)
地形めり込み量が0以上の場合は、地形に挟まれることによる即死判定(床)を付加する 。
ASのファイル:zero_hit_sloped_floor_sub.txt
if ( hit_y_sloped_floor> =0 ) { caught_floor=i} //地形に挟まれることによる即死判定
・2つの傾斜床との接触判定
・・概要
(専用の処理を構築していない場合)「2つの傾斜床との接触判定」を同時に行うと、2つ目の傾斜床を貫通する場合がある 。
以下に、極端な勾配の傾斜床の例を示す。
↓2つ目の傾斜床を貫通する。
貫通する理由は、以下の図の通りとなる。
↓貫通する理由。
・①:1つ目の傾斜床(極端な勾配の傾斜床)。インスタンス名は「sloped_floor_2」。
・②:2つ目の傾斜床。インスタンス名は「sloped_floor_1」。
・③:「sloped_floor_2」による位置調整を行う前のゼロのhitrect。
・④:「sloped_floor_2」による位置調整を行った後のゼロのhitrect。
ループの順序の関係上、「sloped_floor_1」による位置調整は行われない 。つまり、
次のフレームでは、予め「sloped_floor_1」にめり込んだ状態となっている 。これにより、
次のフレームでは、「地形めり込み量」が「地形めり込み量の最大値」より大きくなり、貫通することになる 。
ここでは、ループの処理を2回行うことで対処している 。そうすることで、「sloped_floor_2」による位置調整の後で、「sloped_floor_1」による位置調整が行われることになる。
以下に、例を示す。2回目のループにおいては、「1」から「hit_sloped_floor」の前の値まで、判定を取得することになる。
ASのファイル:zero_hit_sloped_floor.txt
hit_sloped_floor=0 //判定をリセットしておく
if ( MC_hit_landform! ="zero" or ( MC_hit_landform=="zero" and zero_through_floor==0 ) ) { //ゼロの場合・床貫通判定がない場合,判定を取得する
for ( i=1 ;i< =_root .i_sloped_floor ;i++) {
#include "zero_AS/hit_landform/zero_hit_sloped_floor_sub.txt"
}
}
if ( hit_sloped_floor! =0 ) { //接触判定がある場合
for ( i=1 ;i< hit_sloped_floor;i++) {
#include "zero_AS/hit_landform/zero_hit_sloped_floor_sub.txt"
}
︙
}
↓2つ目の傾斜床を貫通しない。
・バスターと傾斜床との接触判定
・・概要
「バスターと傾斜床との接触判定」の場合は、「地形めり込み量」を算出する位置の基準を変更する 。
ここでは、傾斜床(右上がり)との
接触判定 を例にする。
・・バスターと傾斜床との接触判定(1)
大半のバスターは、x方向は「バスターの右端」、y方向は「バスターの中心」の位置を基準にしている 。
↓「フルチャージバスター」「伸縮バーナー(非チャージ)」の例。
ASのファイル:hit_sloped_floor.txt
if ( buster_hit_landform==1 ) { hit_y_sloped_floor=_parent ._y-( landform_ymax-landform_gradient* ( this .getBounds ( _root .board ) .xMax -landform_xmin) ) } //バスター(1)
ゼロにおける式を、以下のように変更している。
・「_parent._x」→「this.getBounds(_root.board).xMax」。
・「this.getBounds(_root.board).yMax」→「_parent._y」。
・・バスターと傾斜床との接触判定(2)
一部のバスターは、x方向は「バスターの右端」、y方向は「バスターの下端」の位置を基準にしている 。
↓「ベクトルレーザー(チャージ)」の例。厳密には、
バスター の先端でのみ判定を取得しなければならないが、ここでは
バスター 全体で判定を取得している。
ASのファイル:hit_sloped_floor.txt
else if ( buster_hit_landform==2 ) { hit_y_sloped_floor=this .getBounds ( _root .board ) .yMax -( landform_ymax-landform_gradient* ( this .getBounds ( _root .board ) .xMax -landform_xmin) ) } //バスター(2)
ゼロにおける式を、以下のように変更している。
・「_parent._x」→「this.getBounds(_root.board).xMax」。
最終更新:2020年12月19日 08:50