ゴールは近いぞ
OpenGLで作るiPhone SDKゲームプログラミング - 5章
衝突判定と衝突応答
第5章では、第4章で作成したレースゲームの基盤を改良して、衝突ロジックを組み込みました。また、マトリクス変換を使って、ユーザー視点を車の向きに合わせて、画面全体を拡大表示することによって、以前より臨場感が増しています。やったね!
・衝突判定
車を円(座標+半径)として扱い、障害物までの距離が、車の半径以内かどうかで調べる。画面の外枠と、タイヤバリアに対して衝突判定を行う。
・衝突応答
こちらでやりました。
視点マトリクス変換
-(void)renderMain { CpGameFacilitator& game = *_game; CpTextureObjectsDrawer drawer; // ゲーム時間を1コマ進める game.Update(); // 視点マトリクス変換を行う -------------- glPushMatrix(); glRotatef(-game.GetCar().GetAngle() + 90.0f, 0.0f, 0.0f, 1.0f); glScalef(3.0f, 3.0f, 1.0f); glTranslatef(-game.GetCar().GetPosX(), -game.GetCar().GetPosY(), 0.0f); // コースを描画する _bg.Draw(_courseTexture.raw); // チェックポイントを描画する glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); game.SetCheckPointsToDrawer(drawer).Draw(_checkPointTexture.raw); glDisable(GL_BLEND); // タイヤバリアを描画する glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); game.SetTyreBarriersToDrawer(drawer).Draw(_tyreBarrierTexture.raw); glDisable(GL_BLEND); // 車の軌道を描画する glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE); game.SetParticleToDrawer(drawer).Draw(_particleTexture.raw); glDisable(GL_BLEND); // 車を描画する glPushMatrix(); glTranslatef(game.GetCar().GetPosX(), game.GetCar().GetPosY(), 0.0f); glRotatef(game.GetCar().GetAngle(), 0.0f, 0.0f, 1.0f); glScalef(game.GetCar().GetSize(), game.GetCar().GetSize(), 1.0f); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); game.GetCar().Draw([_carTexture raw]); glDisable(GL_BLEND); glPopMatrix(); // 視点マトリクス変換はここまで ------------------- glPopMatrix(); // ピットボードを画面に表示する _pitboard.Draw(_pitboardTexture.raw); game.SetNumbersToDrawer(drawer).Draw(_numberTexture.raw); }
この章は、OpenGLの機能という意味では、目新しいものはありませんでした。
むしろ、車のスピードや衝突応答の大きさ、慣性力の自然衰退などのパラメータをうまく調整するのが大変でした。
次回はいよいよ最終章、3D化です。