【C++】『ゲームプログラマになる前に覚えておきたい技術』をハックする(訂正あり)

この書籍が出版されたのは6年前で、サンプルコードの開発環境は少し古いものとなっている。

たとえ最新の環境じゃないとしても、できればサンプルにあわせて自分の開発環境のバージョンを下げることはしたくない。

ちなみに当方、64bitのWindows7で、VisualStudio 2013という開発環境である。

そこで、サンプルが提供している GameLib を使用せず、その代用品を自作することにした。

サンプルでは、Framework::updateのメンバメソッドをオーバーライドして、その中でメンバー変数で持っているビデオメモリの配列(unsigned* vram)を直接書き換えることで、画面を描画するという仕組みだったので、同じ仕組みで動くものを自作したわけだ。

記念すべき最初のC++だけで作ったゲーム。動画を貼り付けておこう。

『倉庫番』ってたしかこんな感じだったよね。

タイトルも、クリア演出もない、まことに原始的なゲームだけれども、何気にマップデータをテキストファイルで管理してたりする。

お決まりのウィンドウ作成部分のコードは『入門ゲームプログラミング』から拝借。

原理は簡単で、ウィンドウハンドラが取れれば、デバイスコンテキストが取得可能になる。

HDC hdc = GetDC(hwnd);

デバイスコンテキストが取得できれば、バックバッファ用のビットマップ画像と、そのビットマップ画像を描画するためのデバイスコンテキストが取得できる。

BitmapDC = CreateCompatibleDC(hdc);
Bitmap = CreateCompatibleBitmap(hdc, GAME_WIDTH, GAME_HEIGHT);

あとは、あらかじめ用意したビデオメモリ配列をループでまわして、このビットマップ画像の該当する箇所にドットを打ち込んでいく。

//【訂正前】以下のコードは超遅いため【訂正後】のコードを参照
//for (int y = 0; y < GAME_HEIGHT; ++y) {
//	for (int x = 0; x < GAME_WIDTH; ++x) {
//		unsigned data = pVmem[y * GAME_WIDTH + x];
//		unsigned char r = data >> 16;
//		unsigned char g = data >> 8;
//		unsigned char b = data >> 0;
//		//点を打つ
//		SetPixel(BitmapDC, x, y, RGB(r, g, b));
//	}
//}
//【訂正後】ビットマップに直接配列を流し込む
SetBitmapBits(Bitmap, GAME_WIDTH * GAME_HEIGHT * 2, pVmem);

仕上げに、そうやって描いたビットマップ画像をデバイスコンテキストに転送しやれば、ダブルバッファの仕組みで画面を描画することが出来る。

//バックバッファを画面に転送する
HDC hdc = GetDC(hwnd);
BitBlt(hdc, 0, 0, GAME_WIDTH, GAME_HEIGHT, BitmapDC, 0, 0, SRCCOPY);
ReleaseDC(hwnd, hdc);

この自作のGameLibスタブで何章まで進めるかわからないけれども、これで本書の続きに戻れる。

4年前

2 コメント

コメントを残す

メールアドレスが公開されることはありません。