・概要

 このゲームでは、様々な種類の地形を用いているが、その「出現・消滅」の処理を共通化している
 地形には、「手動で地形の番号を設定する地形」「自動で地形の番号が設定される地形」の2つのタイプがある。

 「出現」に関する処理の基礎に関しては、「出現」に関する処理を参照。
 「ループの終値」の意味に関しては、基礎の「・頻出する表現(AS)」の「・・ループの終値」を参照。

・地形のMCの構造

 地形のMCの構造は、以下の通りとなる。

地形のMC(「手動で地形の番号を設定する地形」の場合、このMCのインスタンス名を「_」+「地形の番号」に設定しておく。例えば、地形の番号が「3」の場合は「_3」となる。
┗地形のhitrect(ここにASを記述する。このMCのインスタンス名を「地形の種類」に設定しておく。例えば、「床」の場合は「floor」。)

↓「床」のMC。

 「地形の特性」「地形無効」「地形移動」の情報に関しては、地形のMCに記述しておく。以下は、「床」のMCの例となる。

↓「地形の特性」「地形移動」の情報が記述された床。

ASのファイル:なし
 
onClipEvent(load){
	through_floor=1	//貫通可能な床
	buster_through=1	//バスター貫通
	ice_floor=1	//氷の床
	conveyor=2	//コンベア
 
	number_landform_movement=2	//地形移動
}
 
 この例の場合は、「貫通可能な床」「バスター貫通」「氷の床」「コンベア」の特性が付加される。また、「コンベアの番号」は「2」となり、「地形移動の番号」は「2」となる。

 該当する地形との接触判定がある場合は、「地形の特性」関連の処理が行われる。以下は、「床」の記述の例となる。

ASのファイル:zero_hit_floor.txt
 
if(hit_floor!=0){	//接触判定がある場合,地形の特性関連の処理
	landform=_root.board["floor_"+hit_floor]	//参照先を変数に保存
	#include "zero_AS/hit_landform/landform_property.txt"
}
 

 「地形の特性」関連の接触判定を付加する地形は、ループの順序の関係上、「同時に接触する可能性がある、同種類の地形」よりも「地形の番号」を大きくする必要がある

↓壁の例。ベースとなっている壁の下部に、「氷の壁」との接触判定を付加するための壁を重ねて配置している。

 「氷の壁」との接触判定を付加するための壁の「地形の番号」は、ベースとなっている壁の「地形の番号」よりも大きく設定している。小さく設定した場合は、ループの順序の関係上、ベースとなっている壁との接触判定が優先されることになり、「氷の壁」との接触判定が付加されないことになる。

・手動で地形の番号を設定する地形

・・概要

 「手動で地形の番号を設定する地形」は、予め、手動で地形の番号を設定している地形である

 このタイプの地形は、地形無効地形移動に関わる。これらに関しては、地形の番号(インスタンス名)が固定されていたほうが、処理しやすくなる

・・loadの処理

・・・地形の種類

 地形の種類をインスタンス名から取得する。例えば、「床」の場合は、「floor」となる。

ASのファイル:landform_appearance_hitrect_manual.txt
 
	landform_name=this._name	//地形の種類をインスタンス名から取得
 

・・・地形の出現判定の処理

 地形の出現判定の処理に関する記述は、以下の通りとなる。

ASのファイル:landform_appearance_hitrect_manual.txt
 
	for(i=1;i<=_root.i_landform_max;i++){
		if(_parent._name=="_"+i){	//親のMCのインスタンス名から地形の番号を取得
			_parent._name=landform_name+"_"+i	//親のMCのインスタンス名を変更する
			initial_name=_parent._name	//初期のインスタンス名
			_root["landform_identify_"+landform_name][i-1]=1	//地形の出現判定用の配列を埋める
			if(_root["i_"+landform_name]<i){_root["i_"+landform_name]=i}	//ループの終値が出現させた地形の番号よりも小さい場合,補正break	//ループを離脱
		}
	}
 
・「if(_parent._name=="_"+i)」:親のMCのインスタンス名から地形の番号を取得するための条件文。例えば、「_parent._name」が「_3」の場合は、「i」が「3」の場合に、「true」となる。
・「_parent._name=landform_name+"_"+i」:親のMCのインスタンス名を変更する。例えば、「landform_name」が「floor」、「i」が「3」の場合は、「floor_3」となる。この処理により、ゼロなどは、この地形との接触判定の取得が可能となる
・「initial_name=_parent._name」:初期のインスタンス名を保存する。この変数は、「地形無効」「地形移動」で利用される
・「_root["landform_identify_"+landform_name][i-1]=1」:地形の出現判定用の配列を埋める。この処理により、「自動で地形の番号が設定される地形」と、地形の番号が重複することを回避できる
・「if(_root["i_"+landform_name]<i){_root["i_"+landform_name]=i}」:ループの終値が出現させた地形の番号よりも小さい場合、補正する。

・自動で地形の番号が設定される地形

・・概要

 「自動で地形の番号が設定される地形」は、「地形の出現判定用のMC」との接触判定がある場合に、自動で地形の番号が設定される地形である

↓自動で地形の番号が設定される地形(「水」の例)。「地形の出現判定用のMC」は灰色の矩形。「水」のMCの透明度を変化させることで、「出現・消滅」を視覚的に分かりやすくしている。

 このような方式としている理由は、下記の通りとなる。
・ボードに多数の地形が配置されている場合は、ゼロや敵などが「ボードに配置されている全ての地形」と常時、接触判定を取得すると、負荷が極めて大きくなる
・手動で全ての地形の地形の番号を設定する作業は、大きな労力を要する(要は、面倒臭すぎる)。また、設定ミスの危険性が大きくなる。

 「地形の出現判定用のMC」は、「敵・アイテムの出現判定用のMC」よりも大きくしている。そのようにしない場合は、例えば、「出現した敵やアイテムが、床との接触判定を取得できずに落下する」などの不具合が生じる。

・・loadの処理

・・・地形の出現判定

 「・・地形の出現判定用のMCとの接触判定がある場合」「・・地形の出現判定用のMCとの接触判定がない場合」を参照。

ASのファイル:landform_appearance_hitrect_auto.txt
 
	landform_appearance=0	//地形の出現判定
 

・・・初期のインスタンス名、地形の種類

 Flashにおいては、インスタンス名を設定していないMCは、自動的にインスタンス名が設定される(「instance10」「instance25」など)。それが、「初期のインスタンス名」となる。
 「地形の種類をインスタンス名から取得」に関しては、「・手動で地形の番号を設定する地形」の「・・loadの処理」の「・・・地形の種類」と同様。

ASのファイル:landform_appearance_hitrect_auto.txt
 
	initial_name=_parent._name	//初期のインスタンス名
	landform_name=this._name	//地形の種類をインスタンス名から取得
 

・・地形の出現判定用のMCとの接触判定がある場合

・・・前提となる条件

 前提となる条件に関する記述は、以下の通りとなる。

ASのファイル:landform_appearance_hitrect_auto.txt
 
	if(this.hitTest(_root.landform_appearance_hitrect)){	//地形の出現判定用のMCとの接触判定がある場合
		if(landform_appearance==0){	//地形の出現判定がない場合}
	}
 

・・・インスタンス名の変更、「ループの終値(地形)」の補正

ASのファイル:landform_appearance_hitrect_auto.txt
 
			for(i=1;i<=_root.i_landform_max;i++){	//地形の出現用のループ
				if(_root["landform_identify_"+landform_name][i-1]==0){	//地形出現判定用の配列に空きがある場合
					_parent._name=[landform_name+"_"+i]	//親のMCのインスタンス名を変更
					landform_appearance=1	//地形の出現判定
					_root["landform_identify_"+landform_name][i-1]=1	//地形出現判定用の配列を埋める
					if(_root["i_"+landform_name]<i){_root["i_"+landform_name]=i}	//ループの終値が出現させた地形の番号よりも小さい場合,補正
					_parent._alpha=100
					break	//ループを離脱
				}
			}
 
・「_parent._name=[landform_name+"_"+i]」:親のMCのインスタンス名を変更する。例えば、「landform_name」が「"floor"」、「i」が「5」の場合は、親のMCのインスタンス名は「floor_5」となる。この処理により、ゼロなどは、この地形との接触判定の取得が可能となる
・「landform_appearance=1」:地形の出現判定。
・「if(_root["i_"+landform_name]<i){_root["i_"+landform_name]=i}」:ループの終値が出現させた地形の番号よりも小さい場合、補正する。

・・地形の出現判定用のMCとの接触判定がない場合

・・・前提となる条件

 前提となる条件に関する記述は、以下の通りとなる。

ASのファイル:landform_appearance_hitrect_auto.txt
 
	else{	//地形の出現判定用のMCとの接触判定がない場合
		if(landform_appearance==1){	//地形の出現判定がある場合}
	}
 

・・・インスタンス名を戻す

ASのファイル:landform_appearance_hitrect_auto.txt
 
			_parent._name=initial_name	//親のMCのインスタンス名を戻す
			landform_appearance=0	//地形の出現判定をリセット
			_root["landform_identify_"+landform_name][i-1]=0	//地形出現判定用の配列の判定をリセット_parent._alpha=50
 
・「_parent._name=initial_name」:親のMCのインスタンス名を戻すこの処理により、ゼロなどは、この地形との接触判定の取得が不可能となる
・「landform_appearance=0」:地形の出現判定をリセットする。この処理により、再び「・・地形の出現判定用のMCとの接触判定がある場合」の処理を行うことが可能となる。

・・・「ループの終値(地形)」の補正

ASのファイル:landform_appearance_hitrect_auto.txt
 
			for(i=_root["i_"+landform_name];i>=1;i--){
				if(_root["landform_identify_"+landform_name][i-1]==1){	//地形出現判定用の配列が埋まっている場合
					_root["i_"+landform_name]=i	//ループの終値を最大の番号に合わせて補正
					break	//ループを離脱
				}
				if(i==1){_root["i_"+landform_name]=1}	//ループの終値を最大の番号に合わせて補正(i=1の場合)
			}
 
 「_root["landform_identify_"+landform_name]」が埋まっている最大の番号を、「_root["i_"+landform_name]」の値から遡って検索し、「_root["i_"+landform_name]」(「ループの終値(地形)」)を最大の番号に合わせて補正している。

最終更新:2020年12月19日 09:46