2011年08月03日

C#とDXライブラリでゲーム制作 8回目

画面に表示するオブジェクト類の定義

ゲーム画面に表示する必要があるモノを考えます。まず「背景」、それから○や×などのデータ…これは「フィールド」と呼ぶことにします。それからどこに○×を書くかを選択するための「カーソル」、最後にプレイヤーに対する「メッセージ」。これだけあれば十分でしょうか。

他にも「スコア」とか「アバター」とかを表示することも考えられますが、その辺りは後で拡張するということにして、今回は止めておきます。

これらのオブジェクト類は、それぞれ個別のクラスを作成しておき、クラスのメンバとして宣言しておくことにします。

        // 背景
        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

良かったらクリックしてください
にほんブログ村 IT技術ブログ プログラム・プログラマーへ  人気ブログランキングへ

posted by among at 21:00 | Comment(0) | TrackBack(0) | ゲーム制作

2011年07月31日

C#とDXライブラリでゲーム制作 7回目

キーボード押下状態の取得

DXライブラリでキーボード押下状態を取得するためには、GetHitKeyStateAllを使います。(CheckHitKeyを使うこともできますが、“CheckHitKey 関数はとても無駄の多い関数”なので、GetHitKeyStateAllを使うようにします)

基本的には下記のように使います。

// キーボード押下状態を保存するバッファの宣言
Byte[] keyStateBuf = new byte[256];

// キーボード押下状態の読み込み
DX.GetHitKeyStateAll(out keyStateBuf[0]);

// 押下状態の判定(例:リターンキーが押されたか?)
if ( keyStateBuf[ DX.KEY_INPUT_RETURN ] == 1 )
{
    // リターンキーが押された
}

しかし、この方法ではリターンキーを押しっぱなしにすると、常に「リターンキーが押された」と判定してしまいます。場面によってはリターンキーが押された瞬間だけ処理をしたいこともありますね。例えばテトリスのような落ちモノパズルを考えてみてください。左右の移動や落下についてはカーソルキーが押されている間動き続けても良いでしょうが、回転についてはボタンを押した瞬間だけ処理をするようにしないと、ボタンを押し続けている間、回転し続けることになります。これではゲームになりません。

対処方法として、キーボード押下状態を保存するバッファを2つ持ち、順番に切り替えて状態を取得します。そして、「直前は放されていた」「今回は押されている」の条件を満たしたときだけ「キーが入力された」と判断します。

// キーボード押下状態を保存するバッファ
byte[,] keyStateBuf = new byte[2, 256];

// バッファのフレーム(どちら側が有効か)
int keyStateBufNo = 0;

〜キーボード押下状態を読み込むとき〜

// フレームを切り替える
keyStateBufNo ^= 1;

// 今のフレームにキーボード押下状態を読み込む
DX.GetHitKeyStateAll(out keyStateBuf[keyStateBufNo, 0]);

〜キーボード押下状態の判定のとき〜

// 今のフレーム:押されている AND 前のフレーム:放されている のとき true
if ( (keyStateBuf[ KeyStateBufNo, DX.KEY_INPUT_RETURN ] == 1) &&
    (keyStateBuf[ KeyStateBufNo ^ 1, DX.KEY_INPUT_RETURN ] == 0))
{
    // 入力されたと判断
}

キーボードの入力処理は毎フレーム実行する必要がありますし、キーボード押下状態の判定は演算処理で度々使うことになるため、クラス化しておくことにします。

InputController.cs

良かったらクリックしてください
にほんブログ村 IT技術ブログ プログラム・プログラマーへ  人気ブログランキングへ

posted by among at 20:00 | Comment(0) | TrackBack(0) | ゲーム制作

2011年07月30日

C#とDXライブラリでゲーム制作 6回目

ダブルバッファリングによる描画処理

描画処理の基本は「画面の消去」「画面の描画」のくり返しになりますが、実際に毎フレーム「消去」「描画」を実行すると、画面のちらつきが発生します。このちらつきを消すために「ダブルバッファリング」という手法があります。

DXライブラリでは「ダブルバッファリング」を簡単に扱えるようになっています。

// 描画先を裏画面に設定する
DX.SetDrawScreen(DX.DX_SCREEN_BACK);

// 画面に描かれているものを一回全部消す
DX.ClsDrawScreen();

// ここで描画処理をさせる
Draw();

// 裏画面の内容を面画面に反映される
DX.ScreenFlip();

このように実行します。

実際に画面へ描画するのはDraw()の中で行います。

良かったらクリックしてください
にほんブログ村 IT技術ブログ プログラム・プログラマーへ  人気ブログランキングへ

posted by among at 21:00 | Comment(0) | TrackBack(0) | ゲーム制作