C# OpenTKで壁よけゲームをつくります。自機を操作して壁の穴をくぐり抜けるという単純なゲームです。

とりあえず大枠から。0.05秒で0.1だけ自機が前方に移動します。壁は動きません。自機を後方3.0から眺めた様子を表示します。この段階では自機も壁も表示されません。

まず自機の位置を示すプロパティを作成します。自機の座標を変更するとどこから自機を眺めるのかも変更しないといけないので当時にその処理もおこなっています。

SetSight()メソッド内で視点を自機の手前3.0に設定し、再描画をしています。

さて、このままでは自機も壁も描画されません。そこで自機を描画します。自機と言っても飛行機のような形状ではなく、ただの正方形の板です。いまは仮の状態です。あとでもっとちゃんとしたものに作り直します。

Draw(float x, float y, float z, int rx, int ry, int rz)メソッドの引数は自機が存在するxyz座標とxyz軸を中心にどれだけ回転しているかです。いまは自機の傾きは考えていませんが、後にこれについても考えます。

自機だけではなく壁もつくります。

壁の中心はXY座標が0の地点です。Wallクラスのコンストラクタの引数は幅、高さ、穴の中心のX座標とY座標、穴の幅と高さ、スタート地点からの距離と色です。

幅、高さ、穴の中心のX座標とY座標、穴の幅と高さ、スタート地点からの距離と色は一度決まってしまうと変更されることはないので読み取りだけ可能なプロパティにしています。

では実際に描画してみましょう。プログラムが開始されたらCreateWalls()メソッドで壁をつくります。Timer.Tickイベントが発生したら自機を前(Z座標を0.1減らす)に移動させます。すると自機の表示位置は変わらず、壁がこちらに向かってくるように見えます。

自機を壁から回避させます。上下左右のキーを押すと自機が上下左右に移動します。キーをおすとすぐに反応するようにキーが押されるとDoesMoveUpなどのフラグがtrueに変わり、離すとfalseになります。フラグがtrueになっている方向に移動します。

XプロパティやYプロパティが変更されるとSetSight()メソッドが呼び出されて視点の設定が変更されるので、壁の位置がかわって見えます。自機に追随して視点が変わるので自機の描画位置はかわりません。

最後に描画の処理を示します。