SOFTドット絵エディタ「EDGE2」、MIDI音楽編集ソフト「Domino」、楽曲などを配布している個人サイトです。DirectDraw基礎編サンプルコードのダウンロードでは、まずサンプルコードをダウンロードし、解凍してください。C++でプロジェクトファイルを開いてください(「ddraw_03.dsw」をダブルクリックすれば開けます)。圧縮ファイルに含まれる「ddraw_03.exe」をダブルクリックし、実行してみてください。?画面が切り替わり、フルスクリーン化すると思います(何かキーを押すと終了します)。今回は、DirectDrawを使用した画面のフルスクリーン化について解説したいと思います。Windowsプログラミング基礎いくらDirectDrawを使うとは言え、結局はWindows上で動作しています。多少Windowsプログラミングの知識が必要になります。ここでは、「ウィンドウ作成」と「ウィンドウメッセージ」について適当に説明します。NULL);//ウィンドウの表示ShowWindow(hw,nCmdShow);UpdateWindow(hw);続くUNIX(Linux)やMS-DOSのC言語では、一番始めに実行されるのは「main」関数でした。Windowsでは「WinMain」から始まります。表示出来ると覚えてしまった方が良いです。゚)☆O(–;)oばこWindowsには「ウィンドウメッセージ」というものが有り、OSとアプリケーションがコミュニケーションをとるために使用します。ユーザーがアプリケーションのウィンドウを動かそうとした場合、OSはアプリケーションに対し、「ウィンドウが動くぞ」みたいな感じのメッセージを送信します。アプリケーションは、そのメッセージを受信し、なんらかの処理を行うことになります。ここで、もしもアプリケーションがこのメッセージを無視してしまうと、ウィンドウが動かせないという状況が生まれます。やってメッセージを処理するのでしょうか。コードを見てみましょう。DispatchMessage(&msg);}}この処理は、一般的にメッセージループと呼ばれ、OSが送ってくるメッセージをひたすら待ち、メッセージを受信したら、「WndProc」(コールバック)関数が呼ばれるようになっています。WM_KEYDOWN:Quit();break;省略WndProc関数では、このようにメッセージiMessageをswitchによって分岐させ、それぞれ処理しています。何かキーを押した場合、OSが「キーが押されたぞ」みたいな感じのメッセージを送信し、アプリケーションは、メッセージループ処理中、このメッセージを受信し、WndProcを呼び出します。WndProcでは、「キーが押された」というメッセージは「WM_KEYDOWN」というように表されます(マクロ)。この辺はWindows関連のHPに行けば、丁寧に解説されているのでそちらを参照してください。゚)☆O(–;)oばこDirectDraw初期化では、DirectDrawの初期化をします。サンプルコードを見てみましょう。ソースの始めの方で「ddraw.h」をインクルードしてください。これでDirectDrawの関数が使用可能となります(サンプルのプロジェクトでは、既に設定済みです)。順番に解説していきたいと思います。FALSE;ここでは、DirectDrawオブジェクトを作成します。言ってるけど、DirectDrawオブジェクト言われてもよーわからんて。DirectDrawを使うために最初に実行しなきゃいけないらしいです。構文を見てみましょう。);lpGuidDirectDrawオブジェクトを作成するディスプレイデバイスのGUIDを指定します。言ってるけど、よくわからん(爆)。表示したいディスプレイを変更できるらしいのですが、変更する必要が無いのでNULLにしてまう。lplpDDDirectDrawオブジェクトを指すポインタのアドレスを指定します。lpDD;」のアドレスを引き渡します。pInkOuter将来拡張される時に使うらしいので、とりあえずNULL。DirectXの関数にはこういう物が多いが、使う時が来るのか謎。戻り値DirectDrawオブジェクトの作成に成功するとDD_OKが返ってくるらしい。FALSE;ここでは、さきほど作成したDirectDrawオブジェクト(lpDD)とやらを使用して協調レベルを設定しています。してもよくわからん(爆)<協調。いうか私に言語能力が無いだけかも(死。ウィンドウに対する設定をいろいろと変更できるらしい。いうわけで構文いってみよぅ。);hWndアプリケーションのメインウィンドウへのHWNDハンドルを指定します。これはDirectDrawオブジェクトと関連付けるウィンドウです。ここでは、ウィンドウ作成時に使用した「hw」を引き渡します。dwFlags設定する協調レベルを表すDWORD値を指定します。下に指定できる値の一覧を記述します。これらはビット毎のOR演算子(|)を使って組み合わせて使用します。DDSCL_EXCLUSIVE」を指定します。成功するとDD_OKが返ってくるらしい。SetCooperativeLevelに指定できるDWORD値DDSCL_ALLOWREBOOT排他的(フルスクリーン)モード時に、CTRL+ALT+DELの機能の許可。DDSCL_EXCLUSIVE排他的レベルの要求。このフラグは、DDSCL_FULLSCREENフラグと共に用いる必要がある。このフラグを使用すると、他のアプリケーションでこのフラグを使用した時に、エラーが発生するようになるらしい。同時に2つ以上のアプリケーションがフルスクリーン化出来なくするためとか。DDSCL_FULLSCREENフルスクリーン化出来ます。DDSCL_EXCLUSIVEと組み合わせて使用しなければならない。DDSCL_NORMALアプリケーションが、通常のWindowsアプリケーションとして機能することを表す。DDSCL_EXCLUSIVE、またはDDSCL_FULLSCREENフラグと共に用いることはできない。DDSCL_NOWINDOWCHANGESアクティベート時、DirectDrawがアプリケーションウィンドウを最小化したりリストアしたりさせない。FALSE;ここでは、DirectDrawオブジェクト(lpDD)を使用して、ディスプレイの解像度、色数を設定します。);dwWidth画面解像度の横幅を指定します。dwHeight画面解像度の縦幅を指定します。dwBpp使用したい色数をビット数で指定します。Colorとなります。成功するとDD_OKが返ってくるらしい。画面解像度は、適当に指定できるわけではありません。指定できる解像度は、主に640×480、800×600、1024×768と言った一般的な解像度です(謎。ゲームでは、主に640×480×8(256色)を使用します。これよりも広かったり色数が多いと、キャラクターデータを置くビデオメモリが足りなくなったり、画像転送速度に影響したりします。256色モードの時だけは、パレットの変更が出来ます。パレットについては後で説明します。X)と言った特別な解像度も指定出来ますが、これはいろいろと面倒なので後で説明しますパート2(ぉ。FALSE;ここでは、プライマリサーフェイスを作成します。サーフェイスとは、ビデオメモリを意味し、実際に描画を行う場所となります。プライマリサーフェイスは、画面に表示されているビデオメモリを意味します。ここへなんらかの描画を行った瞬間、画面に表示される事になります。一般的には、複数作業用のサーフェイス(オフスクリーンサーフェイスと呼ぶ)を作成し、そこへキャラクターイメージを配置し、それらのデータを一度バックバッファと呼ばれるサーフェイスへ転送し、フリッピングという作業をすると、バックバッファとフロントバッファ(この場合プライマリサーフェイスの事)の内容がそっくりそのまま入れ替わり、画面へ表示される事になります。オフスクリンサーフェイスや、バックバッファを作成する方法は、また後で説明します。ここではとりあえずプライマリサーフェイスだけを作成します。DDSURFACEDESCという構造体を使用して、作成するサーフェイスの情報をここへ詰め込みます。DDSURFACEDESC構造体の主な内容は以下の通りです。dwSizeこの構造体のサイズ(バイト数)dwFlags有効なメンバをDWORD値で指定します。ここで使用したいメンバを指定し、そのメンバへ値を代入するようです。指定できるメンバは下の方に記述してあります。dwHeightサーフェイスの縦幅dwWidthサーフェイスの横幅lPitchメモリの水平行間のピクセル数dwBackBufferCount作成するバックバッファの数ddsCapsサーフェイスの機能を指定します。dwFlagsで指定できる主なメンバは以下の通りです。これらはビット毎のOR演算子(|)を使って組み合わせて使用します。ddsd構造体を使用し、ddsd.dwFlagsにDDSD_CAPSを指定し、ddsd.ddsCaps.dwCaps(何故かメンバの中にまたメンバ)にDDSCAPS_PRIMARYSURFACEを指定します。ここは、丸暗記ですかね(^^;そうしたら、次にサーフェイスを実際に作成するためにCreateSurfaceを呼び出します。この構文は以下の通りです。);lpDDSurfaceDesc要求されたサーフェスを記述するDDSURFACEDESC構造体のアドレス。今回は、先ほど設定したddsdのアドレスを引き渡しています。lplpDDSurface呼び出しが成功した場合、有効なDirectDrawSurfaceポインタによって初期化されるサーフェスへのポインタへのポインタ。lpFront;」のアドレスを引き渡しています。pUnkOuter将来拡張される時に使うらしいので、とりあえずNULL。成功するとDD_OKが返ってくるらしい。DirectDraw後始末コードを見てみましょう。TRUE;}サーフェイスや、DirectDrawオブジェクトはRelease();を実行すると終了する事が出来ます。プライマリサーフェイスなら「lpFront->Release();」となります。ここは、マクロ(define)を使用すると、簡潔に記述する事が出来ます。プログラムを終了したい場合は、必ずこれらを実行しなければなりません。これを忘れてしまうと、Windowsに戻ったとき、パソコンが正常に動作しない可能性があります。blockworks.このサイトについてサイトマップRSSフィード。