第二章「実戦!SDLでゲーム作り@〜某宇宙人〜」第八話


さて、自機、ミサイル、敵が出来上がったので、ここらで一度、ゲームらしくしてみましょう。
シューティングやアクションゲームで重要なのは、当たり判定です。
当たり判定とは、二つのキャラクタが、接触したかどうかを調べ、それによって、処理をする。
ゲームをやったことのある人なら誰でもわかりますね。

具体的には、二つのものの座標を使って計算して、計算の結果が条件に一致したら、処理をする。
という流れです。


今回は、新たに当たり判定用のソースを作るので、そこで計算するための座標を呼び出すため、それぞれに
座標取得用の関数を作ります。Get○○()という名前にしました。

また、当たり判定後の処理として、消滅処理Delete○○()も追加しました。

動作速度が気になれば、Main.cppのSDL_Delay(30);の数字をいじってみてください。
動作速度の一律化は次回説明します。





サンプルソース

GameMain.cppにHitCheck();を追加
Game.hの追加ソース

void HitCheck(void); //当たり判定処理 bool HitCheckNormal(int ax,int ay,int bx,int by); //通常当たり判定 int GetMx(int i); //それぞれの座標取得 int GetMy(int i); int GetEx(int i); int GetEy(int i); void DeleteMissile(int i); //ミサイルの消滅 void DeleteEnemy(int i); //敵の消滅

Missile.cppに追加ソース

int GetMx(int i) { return Missile[i].mx; } int GetMy(int i) { if(Missile[i].mGo == 0) //そのミサイルがなければ-1を返す。 {return -1;} return Missile[i].my; } void DeleteMissile(int i) { Missile[i].mGo = 0; //ミサイル消滅 }

Enemy.cppに追加ソース

int GetEx(int i) { return Enemy[i].ex; } int GetEy(int i) { if(Enemy[i].eLive == 0) //その敵が死んでいれば、-1を返す。 {return -1;} return Enemy[i].ey; } void DeleteEnemy(int i) { Enemy[i].eLive = 0; //敵消滅 }

HitCheck.cppのソース

#include "Def.h" void HitCheck() { int mx;int my; int ex;int ey; for(int m=0; m < MISSILE_MAX; m++) { mx=GetMx(m); my=GetMy(m); if(my == -1)continue; //そのミサイルがなければ次へ for(int e=0; e < ENEMY_MAX; e++) { ex=GetEx(e); ey=GetEy(e); if(ey == -1)continue; //その敵がいなければ、次へ。 if(HitCheckNormal(mx,my,ex,ey)) //消滅処理 { DeleteEnemy(e); DeleteMissile(m); break; //消滅したのだから、次のミサイルの処理へ。 } } } } bool HitCheckNormal(int ax,int ay,int bx,int by) //ここで座標の計算をする { if((ax - bx < 16 ) && (ax - bx > -16) && (ay - by < 32) && (ay - by > -16)) {return true;} //それぞれの座標差が条件と一致していれば、trueを返す。 return false; }



〜〜第九話へ〜〜