今回はプレイヤーとボスの当たり判定を実装します。当たり判定を行うにはボスの弾の座標を取得する必要があるので、ボスクラスにそれ専用の関数を作ります。index){shot[index].gflag=true;}GetShotPosition関数は指定したindexの弾の座標をポインタ経由で返す関数です。弾の構造体である、E_SHOT構造体のメンバにtypeという弾の種類を表す変数を追加してます。後で弾の種類によって当たり判定の半径を変える必要があるからです。関数自体は単純で、該当の弾のフラグが立っていれば、ポインタに座標と弾の種類を代入し、trueを返すだけです。フラグが立っていなければfalseを返してます。その下の二つの関数は、グレイズ用の関数です。一度グレイズが発生したらその弾はもうグレイズを発生させないようにする必要があります。そのためのフラグ設定用の関数です。後はCONTROLクラス内での当たり判定部分のコードを書くだけです。通常の敵の当たり判定はEnemyCollisionAll関数へ移動し、ボスの当たり判定はBossCollisionAll関数という名前で新たに作るようにします。z=0;z<GRAZE_NUM;++z){if(!graze[z]->GetFlag()){graze[z]->SetFlag(px,py);break;}}//スコアを加算score->SetScore(GRAZE_SCORE,1);score->SetScore(CURRENT_SCORE,20);graze_flag=true;}//次の弾のグレイズをチェックするためフラグを戻す。gflag=false;}if(hflag){//操作キャラのdamageflagを立てるplayer->SetDamageFlag();//弾を消すboss.SetShotFlag(i,false);//プレイヤー消滅音フラグを立てるpdead_flag=true;//一時フラグを元に戻す。hflag=false;//一つでも当たっていたらプレイヤーは消滅するので、//他の弾をチェックする必要ないのでループを抜ける。1:player->SetPower(1);score->SetScore(POWER_SCORE,player->GetPower());//パワーを増やすbreak;}item[i]->Delete();//アイテム取得音をセットitem_flag=true;}}}//ライフは毎回取得score->SetScore(LIFE_SCORE,player->GetLife());仕組み的にはプレイヤーと敵のショットの当たり判定とほぼ一緒です。最初のif文で、プレイヤーが生きてるかチェックし、プレイヤーの座標を取得した後、ボスの弾数分だけループさせてます。次に先ほどのGetShotPosition関数で、ボスの弾の座標と弾の種類を取得した後、switch分に入ってます。typeによって処理を分け、当たり判定用のCircleCollision関数を使ってグレイズと実際に弾がプレイヤーに当たったかどうかの当たり判定を実行しています。グレイズがあればgflagを弾が当たってればhflagを立ててます。その下の処理で、gflagが立っていれば、グレイズ時の処理を行ってます。hflagが立っていれば、プレイヤーに弾がヒットしたときの処理を行ってます。この部分の処理は関数名が違うだけで、通常の敵との当たり判定とまったく一緒なので説明は省略します。最後に一応取得してスコアにセットしています。最後にこのBossCollisionAll関数を呼び出すAll関数は現在以下のようになってます。i=0;i<ITEM_NUM;++i){if(item[i]->GetFlag()){item[i]->All();}}//描画領域を指定SetDrawArea(0,0,640,480);//スコア描画score->All();SoundAll();++g_count;}if(!boss.GetFlag())のelse文の処理を見てください。この部分でBossCollisionAll関数を呼び出しています。ボスが出現しているときしか実行する必要ないですしね。これでボスのショットとプレイヤーの当たり判定を実装することが出来ました。以下の動画のようになります。グレイズとボスのショットがヒットするようになりましたね?次回はプレイヤーのショットとボスとの当たり判定を実装します。メニューレイアウト変更。ブラウザキャッシュのクリアをお願い致します。レイアウト変更に伴いブラウザキャッシュのクリアをお願いします。TOPページのデザインを変更。相互リンクページに、複数サイト追加。C言語学習ページ発展編(1~9章)追加。HTML/CSSリファレンスのページ追加。