[HMC]年間5250円で独自ドメイン付属、ウィルスチェックありのレンタルサーバ!
Last update : 2000/09/24
DirectDraw基礎 第14回
長方形塗りつぶし・垂直基線待ちをする
サンプルコードのダウンロード
  では、まずサンプルコードをダウンロードし、解凍して下さい。 私はVisual C++6.0でコンパイルしているので、をお持ちの方は Visual C++でプロジェクトファイルを開いて下さい(「ddraw_14.dsw」をダブルクリックすれば開けます)。 圧縮ファイルに含まれる「ddraw_14.exe」をダブルクリックし、実行してみて下さい。どうでしょう?画面が切り替わり、フルスクリーン化し、 でかいスライムが2匹表示されていると思います(左のが垂直帰線待ち無し、右のが垂直帰線待ち有り)。
  というわけで、今回は意図的に垂直帰線待ちをする方法を紹介します。
垂直帰線おさらい
  以前フリップの所でも触れましたが、もう一度説明しておきます。 ディスプレイは小さな電子銃からでる電子ビームを走査して、ビデオメモリの内容を 連続的に反映しています。電子ビームは、左上から始まり、右へ進み、一番右まで行ったら 一つ下へ下がり、一番左まで行き、また右へ進みます。それらを繰り返し、最後に右下端まで行ったら、 一気に左上端に戻ります。この「右下端から左端上」に戻る間の事を「垂直帰線」とか言います。
  で、フリップはこの垂直帰線中に行っているため、画面はちらつきません。しかし フリップ以外でフロントバッファにBltFastか何かで転送したい場合、垂直帰線中では無いため、 画面がちらつく場合があります。そこで垂直帰線待ちをして、ちらつきを無くそうというわけです(謎

ただ、この垂直帰線中に処理しきれない場合はやっぱりちらつきますので(^^;
というわけでコードの解説
今回も順番に解説していきます。

まず、先に「長方形塗りつぶし」をする自作関数「Boxfill」を説明しましょうかね。
サーフェイスのメンバ関数「Blt」については以前「
DirectDraw基礎 第9回」 でやっているので、構文等はそちらを参照して下さい。今回は、サーフェイスの一部を一色で塗りつぶし たいので、 Blt関数の最初の引数にRECT構造体のアドレスを引き渡してやります。(RECT構造体の解説は「DirectDraw基礎 第8回」 でやりました。)ってもう説明する事無いですね(汗

では次は、今回の本題「垂直基線待ち」をする自作関数「VsyncWait」の説明〜。
見ても解る通りDirectDrawオブジェクト(lpDD)がメンバ関数である「WaitForVerticalBlank」を呼び出します。
構文は以下の通りです。

書式HRESULT WaitForVerticalBlank( DWORD dwFlags, HANDLE hEvent );
dwFlags以下のどれかを指定します。
DDWAITVB_BLOCKBEGIN垂直帰線が開始するまで待つ
DDWAITVB_BLOCKBEGINEVENT垂直帰線が開始したらイベントを起動するらしいが、現在はサポートしてないらしい。
DDWAITVB_END垂直帰線が終了するまで待つ
hEventサポートされていないので、とりあえずNULL
戻り値成功するとDD_OKが返ってくるらしい。


そんでもって、これらを使用した今回のメインコードはこれ。

ただひたすら「同じ場所に書いたり消したり」するだけで、右のスライムは垂直帰線待ちをし、 垂直帰線待ちがどういう働きをするかが一目で解るようなプログラムになっているのである。えっへん(゚o゜)\ばき☆