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