いよいよコーディングです
この連載では、過去2回(第1回、第2回)にわたって画面設計を行ってきました。C++Builderのビジュアル設計環境を利用することで、1行もコードを書かずにゲームの外観を完成させることができました。
これから2回に分けて、ゲームのためのコードを記述していきましょう。コードの記述も、コンポーネントのイベントに対応するイベントハンドラとして定義できるので効率的です。イベントの感知や、イベントに対応させるコードの呼び出しなどは、フレームワークがやってくれるので、本当に必要な機能だけをコーディングするだけでいいのです。
ラケットを動かす
OnKeyDownイベントでキーボードの押下を検出する
では、はじめにゲームのための基本的なコードを記述していきましょう。最初に行うのはラケットを動かすコードの作成です。ラケットは左右の矢印キーで移動させます。
フォームのOnKeyDownイベントは、キーボードを押すと発生します。このフォームのOnKeyDownイベントが発生するのは、フォームにフォーカスがある時だけです。
OnKeyDownと同じようなイベントとしてOnKeyPressがありますが、OnKeyPressは単一の文字キーの入力に応答します。矢印キーのような特殊なキーやシフト状態を検出したいときは、OnKeyDownを使用します。
OnKeyDownイベントハンドラの引数には、WORD型のKeyがあります。Keyは仮想コードを表します。矢印キーに対しては、以下のように定義されています。
仮想キー | 値 | 説明 |
VK_LEFT | 0x26 | ← |
VK_UP | 0x27 | ↑ |
VK_RIGHT | 0x28 | → |
VK_DOWN | 0x29 | ↓ |
ラケットを動かすコード
ここでは左右の矢印キーを使用するので、VK_LEFTとVK_RIGHTを用います。次が、OnKeyDownイベントハンドラのコードです。
void __fastcall TGameForm::FormKeyDown(TObject *Sender, WORD &Key, System::WideChar &KeyChar, TShiftState Shift) { const delta = 8; //ラケットの移動距離 switch(Key) { case VK_LEFT: // 0以上なら左に移動 if (Racket->Position->X - delta >= 0) Racket->Position->X = Racket->Position->X - delta; break; case VK_RIGHT: // コート幅以内なら右に移動 if (Racket->Position->X + Racket->Width + delta <= Court->Width) Racket->Position->X = Racket->Position->X + delta; break; }
ラケットを移動させるコードに注目してください。ラケットの位置を表すプロパティは、FireMonkeyではPositionです。VCLでは、Left、Topで位置を指定することができましたが、FireMonkeyの場合、PositionのサブプロパティX、Yを用いるので、Racket->Position->X のような記述になります。
このコードは、構造ペイン上でGameFormを選択し、オブジェクトインスペクタで「イベント」タブをクリック。OnKeyDownイベントの値列をダブルクリックして表示されたメソッドに対して記述します。
プログラムを実行して、左右の矢印キーを押してみましょう。ラケットが動きますね。