ゴールは近いぞ

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化です。