ここではこんなゲームをつくります。

『ラリーX』は、1980年11月にナムコ (後のバンダイナムコアミューズメント) から稼働されたアーケード用固定画面アクションゲームです。青い車(マイカー)を操作し、追ってくる敵(レッドカー)やランダムに置かれた岩を避けながら、迷路状のステージ上にある旗(フラッグ)で示された10箇所のチェックポイントを通過するとステージクリアになります。

以下は本物のラリーX(ニュー ラリーX)です。

Rally-Xのようなゲームを作るためにここではC#とOpenTKを使います。まずはForm1クラスのコンストラクタとイベントハンドラを示します。

まず道路をつくります。マップがどうなっているかわからないので適当です。

ブロックをつなげて道路をつくります。これはブロックの位置情報を管理するためのクラスです。

これを複数あつめて道路をつくります。GetRoadBlocks()メソッドは道路をつくるブロックを取得するメソッドです。1回呼び出して結果を保存しておきます。RoadBlocksプロパティをつかえばいつでも取得できるようにします。

RoadBlocksプロパティでブロックのリストを取得して描画します。DrawBlockメソッドはブロックの位置から描画すべき座標を求め、実際に描画するメソッドです。

描画するためには視界の設定をする必要があります。視界はマイカーの座標と同じです。そのためマイカーは常に中央に描画されることになります。

カメラの位置(=マイカーの位置)はプロパティで管理します。そして変更されたら視界の設定も変更します。

キーが押されたら移動する方向を変えます。ただし方向転換ができる場合でなければ変更できないようにします(車は道路しか走れないので)。

まず現在どの方向を向いているのかを管理するフィールド変数をつくります。

方向転換をしたとして次に進める場所がないのであれば方向転換することはできません。以下は各方向に方向転換できるかどうかを調べるメソッドです。

これは方向キーが押されたときに呼び出されるメソッドです。もし方向転換できないのであれば現在の方向は変更しないでフィールド変数 NextDirectを変更します。そして実際に変更できるようになってから方向転換するようにします。

タイマーをつかってTimer.Tickイベントが発生したら現在設定されている方向または予約されている方向で進むことができる方向にマイカーを移動させます。そして最後にglControl1.Refresh()メソッドを呼び出して画面を再描画します。

再描画されるときの処理を示します。道路を描画してそのあとマイカーを描画します。最後にglControl1.SwapBuffers()メソッドを実行します。

DrawMyCar()メソッドはマイカーを描画するメソッドです。位置と進行方向に合わせて適切に描画する必要があります。

DrawCarZero(Color color)メソッドは、色を指定し、原点を中心に車を描画するメソッドです。