2009年06月24日

第0x04回 オセロ製作の第一歩

前回までの内容で、ウィンドウに描画するところまで解説しました。
せっかくのゲームプログラミングの解説なのに、
Win32APIの解説だけでは眠くなってしまいますので、
ここまでのまとめとして、オセロの骨組みを作成してみたいと思います。

まずは、オセロ盤、駒を表示し、盤をクリックすると駒が置かれるという
シンプルなものを作ってみましょう。
それでは、早速サンプルです。


(ソースコードのみ)
WinMain.h
WinMain.cpp
Board.h
Board.cpp

(プロジェクトファイル)
sample004.zip

class Board

オセロの盤はBoardというクラスに処理をまとめました。
これにより、ゲームに関することはこの部分を修正していくという流れに
なります。
クラスの構造を説明します。
// WM_PAINTメッセージハンドラ
void OnPaint( HWND hWnd );
// WM_LBUTTONDOWNメッセージハンドラ
void OnLButtonDown( HWND hWnd , int x , int y );
// WM_RBUTTONDOWNメッセージハンドラ
void OnRButtonDown( HWND hWnd , int x , int y );

これら3つのメンバ関数は、メッセージを処理するための関数です。
これは、メッセージのコールバック関数より呼ばれ、
引数として、そのメッセージに関連することを渡しています。
このように、メッセージ処理を委譲し、処理させる関数を
メッセージハンドラと呼びます。
今後、オセロゲームに関連するメッセージ処理は、
このメッセージハンドラに記述します。
// 置かれている石の状態
STONE_KIND m_nStone[ MASS_NUM_X ][ MASS_NUM_Y ];

これは、置かれている石の状態を示すフラグです。
2次元配列で、各マスに対応しています。
配列の中身は次の値をとります。
// 石の状態
enum STONE_KIND
{
None = 0 , // 置かれていない
Black = 1 , // 黒
White = 2 , // 白(※1)
};

Noneは、石が置かれていない状態、
BlackとWhiteは、それぞれ石が置かれている状態になります。
石を追加する場合や変更する場合、この配列のフラグを
置き換えるだけにし、描画のタイミングで石の表示状態を
一気に更新するようにします。

実際の描画処理はBoard::OnPaint()関数に記述されています。
このように、描画処理を一箇所にまとめておくと、
プログラムの見通しがよくなり、修正が簡易になります。

Board::OnLButtonDown()関数の中に入っている
以下の関数に注目してください。
InvalidateRect( hWnd , NULL , FALSE );

これは明示的にWM_PAINTメッセージを呼び出す関数です。
第1引数は、メッセージを送るウィンドウハンドルを指定します。
第2引数は、再描画する範囲をRECT型(矩形)で指定します。
NULLを指定する場合には、全体が範囲になります。
第3引数は、背景を再描画するかをTRUEもしくはFALSEで
指定します。
ウィンドウの背景描画には、ウィンドウを作成したときに指定した
次のブラシが使用されます。
wcl.hbrBackground = (HBRUSH)GetStockObject( WHITE_BRUSH );

今回は盤を塗りつぶすため、無駄な処理を省くためにFALSEを
指定しています。

以上で、オセロのベースの部分ができました。
今後、このベースを発展させて、ゲームを作成していきたいと
思います。


(※1)
enumの最後の,(カンマ)は本来必要ないのですが、
ここではあえて含めています。
これはC言語の仕様として合法です。
こうすることにより、今後値が追加されたとしても
カンマを忘れずにすみます。



ラベル:ふわ猫
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバック
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。