サンプルコードのダウンロード

では、まずサンプルコードをダウンロードし、解凍してください。
私はVisual C++6.0でコンパイルしているので、お持ちの方はVisual C++でプロジェクトファイルを開いてください(「ddraw_13.dsw」をダブルクリックすれば開けます)。
圧縮ファイルに含まれる「ddraw_13.exe」をダブルクリックし、実行してみてください。
どうでしょう?画面が切り替わり、フルスクリーン化し、1ドットの荒いタイル(謎)がスクロールしていると思います。

というわけで、今回は低解像度(MODE X)モードを使ってみたいと思います。

ModeX

DirectDrawでは320×240、320×200と言った低解像度のディスプレイモードをサポートしています。
こういった特殊(?)なディスプレイモードを使用する場合には、ModeXとよばれるものを使用しなければなりません。
「ModeX」が一体何を意味するかは謎として、とにかく320×240モードを使用したい場合にはModeXの設定をすればいいのです(ォ。

使い道として、秒間60枚くらいは画面更新をしたいゲーム(ハデなアクションや格闘)、3D等で描画時間を少しでも減らせるように低解像度にするといった事が考えられます。
ただ、私が試したところ、ModeXを使用すると、一部の環境で不都合が生じる事があります。
そんな時はコントロールパネルのDirectXのアイコンをダブルクリックし、DirectDrawの項目の中の「Use ModeX for 320 for X(?)」みたいな感じのチェックを外してみてください。
たぶん正常に動作すると思います。

では実際にプログラムするにはどうしたら良いでしょう。コードを見てみましょう。

BOOL StartDirectDraw(HWND hw){

	<略>

	//協調レベル設定
	if(lpDD->SetCooperativeLevel(hw,DDSCL_FULLSCREEN | DDSCL_EXCLUSIVE | DDSCL_ALLOWMODEX)!=DD_OK)
		return FALSE;

	//解像度設定
	if(lpDD->SetDisplayMode(320,240,8)!=DD_OK)
		return FALSE;	

自作関数「StartDirectDraw」内の協調レベル設定部分の引数に、「DDSCL_ALLOWMODEX」を追加してやります。
これで、DirectDrawがModeXを使用するように設定出来ました。
次に、解像度設定で、320×240×8(256)を指定し、この瞬間に画面が切り替わります。
とりあえず、DirectDrawの設定はこれで終わりです(^^;

ただ、ModeXにはいくつか制約があります。
まず、プライマリサーフェイスへデータを転送出来ないという点、次にプライマリサーフェイスのロック、最後にプライマリサーフェイスに対するGetDCの使用です。
要するにプライマリサーフェイスにアクセス出来ないと言う事です。
ですから、普段は複合プライマリサーフェイスを作成してバックバッファからフリップしてフロントバッファに表示させるしか方法がありません。
これらを除けばバックバッファやオフスクリーンサーフェイスの扱いは今まで通り出来ます。

記事検索

アーカイブ