・概要

 ここでは、主に、ゼロに関して解説する。
 処理の基礎に関しては、地形との接触判定を参照。
 傾斜床(補助)に関しては、傾斜床(補助)を参照。

 「傾斜床」は、所謂「坂」のことを指す。
 傾斜床は、画面上では「斜めの直線」として表現されているが、実際は、「矩形」として扱われている

 傾斜床には「右上がり」「右下がり」の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