・概要
一応、上記の参考サイトの情報に基づいて、「矩形同士の接触判定」に関する処理(サブルーチン)を記述したが、検証した結果、hitTestのほうが負荷が軽かったので、実際は使用していない。
ASのファイル:hittest.txt
︙(省略)
・複数のhitrectにより構成されたMCの接触判定(1)
・・概要
ここでは、「単一の
hitrectにより構成されたMC(「MC_A」)」と「複数の
hitrectにより構成されたMC(「MC_B」)」との接触判定に関して解説する。
接触判定は、「大まかな接触判定」と「細かい接触判定」の2段階に分けて行われている。以下の項目で、それぞれの段階に関して解説する。
・・大まかな接触判定
「MC_A」と「MC_B」との接触判定を取得する。これが、大まかな接触判定となる。
↓大まかな接触判定がない場合。①と②が接触していない。
図における①~②の意味は、以降の図も同様である。
・①:「MC_A」。
・②(破線で囲まれた箇所):「MC_B」。
↓大まかな接触判定がある場合。①と②が接触している。
ASのファイル:hittest_synthesis_1.txt
if(MC_A.hitTest(MC_B)){ //大まかな接触判定
︙
}
・・細かい接触判定
「大まかな接触判定」がある場合は、細かい接触判定を取得する。
↓細かい接触判定がある場合(1)。①と③が接触している。
図における③~⑤の意味は、以降の図も同様である。
・③:「MC_B_hitrect+
1」。MC_Bを構成しているhitrectのうちの一つ(以降も同様)。
・④:「MC_B_hitrect+
2」。
・⑤:「MC_B_hitrect+
3」。
↓細かい接触判定がある場合(2)。①と④・⑤が接触している。実際は、ループの順序通りに、④との接触判定が優先される。
ASのファイル:hittest_synthesis_1.txt
for(i_MC_B=1;i_MC_B<=10;i_MC_B++){ //MC_Bに関するループ
if(MC_B[MC_B_hitrect+i_MC_B]==undifined){break} //存在しない場合,ループを離脱
if(MC_A.hitTest(MC_B[MC_B_hitrect+i_MC_B])){ //細かい接触判定
hittest=1 //接触判定
break //細かい接触判定がある場合,細かい接触判定のループを離脱
}
}
・「if(MC_B[MC_B_hitrect+i_MC_B]==undifined){break}」:「該当するhitrect」が存在しない場合、ループを離脱する。上の図の例では、「i_MC_B=4」のhitrectが存在しないため、「i_MC_B=4」となった場合にループを離脱する。
・・例
バスターと敵との接触判定を取得する場合の例を示す。
ASのファイル:zero_buster_normal_semicharge_fullcharge.txt
for(i=1;i<=_root.i_enemy;i++){ //敵との接触判定用のループ
MC_A=this
MC_B=_root.board["enemy_"+i]["enemy_hitrect"]["enemy_hitrect_synthesis"];MC_B_hitrect="enemy_hitrect_"
#include "zero_AS/hittest_synthesis_1.txt"
if(hittest==1){
︙
}
}
・「this」:バスターのhitrect。
・「_root.board["enemy_"+i]["enemy_hitrect"]["enemy_hitrect_synthesis"]」:敵のhitrectの統合体。
・複数のhitrectにより構成されたMCの接触判定(2)
・・概要
「複数の
hitrectにより構成されたMC(「MC_A」)」と「複数の
hitrectにより構成されたMC(「MC_B」)」との接触判定に関して解説する。
これは、「・複数の
hitrectにより構成されたMCの接触判定(1)」の応用となる。
・・大まかな接触判定
「・複数の
hitrectにより構成されたMCの接触判定(1)」と同様の処理を行っている。
ASのファイル:hittest_synthesis_2.txt
if(MC_A.hitTest(MC_B)){ //大まかな接触判定
︙
}
・・細かい接触判定
ASのファイル:hittest_synthesis_2.txt
for(i_MC_A=1;i_MC_A<=10;i_MC_A++){ //MC_Aに関するループ
if(MC_A[MC_A_hitrect+i_MC_A]==undifined){break} //存在しない場合,ループを離脱
for(i_MC_B=1;i_MC_B<=10;i_MC_B++){ //MC_Bに関するループ
if(MC_B[MC_B_hitrect+i_MC_B]==undifined){break} //存在しない場合,ループを離脱
if(MC_A[MC_A_hitrect+i_MC_A].hitTest(MC_B[MC_B_hitrect+i_MC_B])){ //細かい接触判定
hittest=1 //接触判定
break //細かい接触判定がある場合,細かい接触判定のループを離脱
}
}
}
・・例
セイバーと敵との接触判定を取得する場合の例を示す。
ASのファイル:zero_saber_body.txt
for(i=1;i<=_root.i_enemy;i++){ //敵との接触判定用のループ
MC_A=this.zero_saber_hitrect_synthesis;MC_A_hitrect="zero_saber_hitrect_"
MC_B=_root.board["enemy_"+i]["enemy_hitrect"]["enemy_hitrect_synthesis"];MC_B_hitrect="enemy_hitrect_"
#include "zero_AS/hittest_synthesis_2.txt"
if(hittest==1){
︙
}
}
・「this.zero_saber_hitrect_synthesis」:セイバーのhitrectの統合体。
・「_root.board["enemy_"+i]["enemy_hitrect"]["enemy_hitrect_synthesis"]」:敵のhitrectの統合体。
↓「
セイバーと敵との大まかな接触判定」がある場合。「
セイバーと敵との細かい接触判定」はない。
最終更新:2020年12月19日 11:18