画面に表示するオブジェクト類の定義
ゲーム画面に表示する必要があるモノを考えます。まず「背景」、それから○や×などのデータ…これは「フィールド」と呼ぶことにします。それからどこに○×を書くかを選択するための「カーソル」、最後にプレイヤーに対する「メッセージ」。これだけあれば十分でしょうか。
他にも「スコア」とか「アバター」とかを表示することも考えられますが、その辺りは後で拡張するということにして、今回は止めておきます。
これらのオブジェクト類は、それぞれ個別のクラスを作成しておき、クラスのメンバとして宣言しておくことにします。
// 背景 Background background = new Background(); // フィールドデータ Field fieldData = new Field(); // カーソル Cursor cursor = new Cursor(); // メッセージ Message message = new Message();
これらのクラスには、必ずDraw関数を用意します。この関数で描画を行うわけです。その他の関数は必要に応じて追加します。
背景クラスの定義
背景クラスは文字通り背景を描画するクラスです。背景の描画の方法は幾つか考えられます。昔のゲーム機の場合はマップチップと呼ばれる小さい画像を組み合わせて描画するのが一般的でしたが、近年のPCゲームでは一枚のCGをそのまま表示する方法が主流でしょう。
今回はテストプログラムなのでDXライブラリのDraw系関数を使って描画します。また、描画以外は何もしないので、関数はDraw()のみです。
将来的な拡張としては、「IDを指定することで背景の画像を切り替える」や「背景がアニメーションする」なども考えられますが、今回はやりません。
Background.csカーソルクラスの定義
カーソルクラスはマス目の選択に使用するカーソルを表示するためのクラスです。これも描画の方法は幾つか考えられますが、カーソルの画像を用意しておき、読み込んで描画するのが一般的でしょう。
今回はテストプログラムなので背景と同じくDXライブラリのDraw系関数を使って描画します。
カーソルの場合は描画以外にも、カーソル位置の管理も行います。このため、メンバ変数にカーソル位置の座標を持たせ、Set、Get、Moveなどの関数を用意します。
また、カーソルのアニメーションも行うようにします。アニメーションをさせるため、毎フレームで呼び出す関数Update()を用意しておきます。
Cursor.csメッセージクラスの定義
メッセージクラスはシステムからプレイヤーに対するメッセージを表示するためのクラスです。これも真面目に実装するのであれば、フォントの種類や色、サイズなどを指定できたり、表示するメッセージの内容にしたがって改行をしたり、色々と考えられます。
今回はテストプログラムなので(こればっかりですが)、フォントの種類や色・サイズは固定、メッセージも一行のみ対応します。
メッセージを画面に描画する前に、描画するためのフォントを用意します。なお、用意しない場合はデフォルトのフォントが使われます。用意したフォントは使い終わったら解放する必要があるため、コンストラクタで初期化、デストラクタで破棄、という構成にします。
あとは、描画するメッセージを設定するためのSet()と、描画するためのDraw()を用意します。
Message.csフィールドクラスの定義
フィールドクラスは、○×を置くフィールドを管理するクラスです。それは単純に、マス目のどこに○×があるかを管理し、○×を描画するだけではなく、勝敗の判定などの機能も持たせます。
フィールドデータは、○、×、の他に、何も置いていない状態を持たせます。マス目は3×3のサイズなので、フィールドデータも3×3の多次元配列として持ちます。データはコンストラクタで初期化し全て何も置いていない状態にします。そして、指定の座標に○×を設定する関数と、指定の座標の○×を取得する関数、お決まりのDraw()を用意します。
さらに、ゲームの勝敗を判定する関数も用意します。これはフィールドクラスに持たせるのではなく、ゲームのMain側に持たせることもできます。どちらも可能ですし、どちらかが正解でどちらかが不正解ということはありません。クラスの目的・考え方や、コーディングスタイル、プログラマの好み…、色々理由はあると思いますが、どちらでも構いません。
勝敗の判定は真面目に考えると大変なので、手抜きで実装します。マス目は3×3で、勝ちパターンも負けパターンも8通りしかないので、単純にif分を8個並べてしまいました。
Field.cs