C++ DirectX11 ゲームプログラミング プログラミング

ゼロから始めるDirectX11ゲームプログラミング入門 #7「ソースを整理する」

ハッカドールMMDデータ © 2015 DeNA Co.,Ltd.

ゲーム用にウィンドウを設定する

DirectXを初期化する時、解像度を1280x720にしてるので、最終的にウィンドウに表示される画像は1280x720です。しかし、現在のウィンドウのサイズはぴったり1280x720にはなっていないし、さらにサイズを自由に変更できてしまいます。このままでは変に横長にも縦長にも出来てしまいます。

ウィンドウのサイズをきっちり設定して、サイズも固定しましょう。

WS_OVERLAPPEDWINDOW - WS_THICKFRAME

WS_OVERLAPPEDWINDOWからWS_THICKFRAMEのフラグを除外することで、ウィンドウのサイズをマウスで変更できなくなります。

// ウィンドウのクライアントサイズを設定
RECT rcWnd, rcClient;
GetWindowRect(hWnd, &rcWnd);
GetClientRect(hWnd, &rcClient);
int newWidth = (rcWnd.right - rcWnd.left) - (rcClient.right - rcClient.left) + 1280;
int newHeight = (rcWnd.bottom - rcWnd.top) - (rcClient.bottom - rcClient.top) + 720;
SetWindowPos(hWnd, NULL, 0, 0, newWidth, newHeight, SWP_NOMOVE | SWP_NOZORDER);

ここでウィンドウのクライアント(画像が表示される範囲)のサイズを設定しています。SetWindowPos関数でウィンドウ全体のサイズは設定できるのですが、クライアントのサイズのみを設定できる関数はありません。なので、計算でウィンドウのサイズ=余白 + クライアントサイズを求め設定しています。

メニューを消す

ウィンドウの上にある、ファイル(F)ヘルプ(H)は不要なので消しましょう。

wcex.lpszMenuNameにNULLを入れるだけで、メニューは表示されなくなります。

2D描画機能をDirect3Dクラスへまとめる

いまGameSystemクラスのExecute関数で、その場で頂点データを作って、頂点バッファも作って、描画に必要なものをいろいろセットして、そして描画と、非常に煩雑な書き方になっています。画像1枚表示するだけで一苦労なので、もっと簡単に記述が出来た方がいいですね。今回はDirect3Dクラスのメンバとして、簡単に2D描画ができる関数を作って便利にしましょう。

大半がGameSystemクラスのExecuteに書いていた内容を、若干名前を変更したりして持ってきてるだけです。

ChangeMode_2D関数

この関数を実行することで、2D描画に必要なものを作成したり、それらをデバイスコンテキストにセットしたりします。2D描画を行う前には最低でも1度この関数を実行することになります。

四角形用 頂点バッファ作成(初回のみ)

頂点バッファを毎フレーム作成するのはパフォーマンスに多大な悪影響がでるので、最初に1度だけ作成して、それを使いまわせるようにしましょう。

vbDesc.Usage = D3D11_USAGE_DYNAMIC; と vbDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; を指定することで動的バッファとなり、使いまわせるバッファになります。

また、初回のChangeMode_2D関数を実行したときだけ作成されるように、ifで判定もしています。

サンプラーステートを作成しセットする

以前説明したように、サンプラーステートとはテクスチャから色を取得できる道具のようなものです。いままでは何もセットしていなくても動いていましたが、本来はしっかりセットしておく必要があります(実際に出力ウィンドウに警告が出まくっています)。

Draw2D関数

指定した座標(x, y)とサイズ(幅、高)で、テクスチャを2D描画する関数です。あらかじめ作成しておいた頂点バッファに頂点データを書き込み、描画コマンドを発行(描画を実行)しています。

使用する

では実際に使用しましょう。GameSystemクラスのExecute関数の内容で、四角形を描画していることろを全部けし、以下のようにします。Draw2D関数を実行するだけで、簡単に何枚でも描画できるようになりました。

とてもシンプルに書けるようになりましたね!

-C++, DirectX11, ゲームプログラミング, プログラミング
-, , , , ,