SOFTドット絵エディタ「EDGE2」、MIDI音楽編集ソフト「Domino」、楽曲などを配布している個人サイトです。DirectDraw基礎編サンプルコードのダウンロードでは、まずサンプルコードをダウンロードし、解凍してください。C++でプロジェクトファイルを開いてください(「ddraw_08.dsw」をダブルクリックすれば開けます)。圧縮ファイルに含まれる「ddraw_08.exe」をダブルクリックし、実行してみてください。?画面が切り替わり、フルスクリーン化し、が作業用サーフェイスに読み込まれ、そこから部分的にバックバッファにデータが転送されていると思います(謎というわけで、今回は作業用サーフェイスを作成し、データ転送をしたいと思います。普段、ゲームを作成する場合は、オフスクリーンサーフェイス(作業用サーフェイス)と呼ばれる目に見えないサーフェイスを作成し、そこへビットマップを読み込み、そこからバックバッファへデータ転送し、フリップし、画面に表示させます・・・というのは何度も書いているので既に解っていると思います。んでは、まずオフスクリーンサーフェイスの作成方法を記しておきます。オフスクリーンサーフェイスの作成は自作関数「StartDirectDraw」に追加してあります。FALSE;DirectDrawオブジェクトのメンバである「CreateSurface」については第3回のプライマリサーフェイス作成時に多少説明しました。追加指定し、サーフェイスの縦幅、横幅を指定出来るようにします。したら、dwWidthとdwHeightに縦幅、横幅を指定(今回はプライマリサーフェイスと同じ640×480)します。ddsCaps.dwCapsにDDSCAPS_OFFSCREENPLAINを指定し、「CreateSurface」を呼び出せば、サーフェイスが作成されます。作成したいサーフェイスのサイズは自由に変更可能ですが、プライマリサーフェイスよりも大きなサーフェイスを作成しようとするとDirectXのバージョンによっては失敗する可能性があるのでやめた方が良いですね。ちなみに、オフスクリーンサーフェイスはビデオメモリに作成されますが、ビデオメモリが足りなくなると、自動的にシステムメモリ内に作成されます。DDSCAPS_SYSTEMMEMORY;を指定してやります。例によって、オフスクリーンサーフェイス(lpWork)は、ビデオメモリだろうがシステムメモリだろうが関係なしに、フロントバッファやバックバッファと同じように扱う事が出来ます(GDIの描画等含む)。サーフェイス間のデータ転送では、オフスクリーンサーフェイスにキャラクターイメージを読み込んだ後、このイメージを他の場所へ転送します。転送するだけでなく、透明色を使用した転送が出来ます。その場合、どの色を透明色にするかをサーフェイス毎に設定しておかなければなりません。透明色の指定方法を以下に記します。ddck={palette_number,palette_number};sf->SetColorKey(DDCKEY_SRCBLT,&ddck);}略//呼び出し//透明色の指定(パレット1番の色を透明色にする)SetTransColor(lpWork,1);まず、DDCOLORKEY構造体のメンバに透明色にしたい色を指定します。DDCOLORKEY構造体は以下のようになっています。DDCOLORKEY;メンバ変数は2つあります。パレット番号のLowValueからHighValueの範囲を透明色とするらしいのですが(未確認)、普段は1色しか透明色として使用しないので、LowもHighも同じ値にします。したら、DirectDrawサーフェイスのメンバである「SetColorKey」を呼び出します。構文は以下の通りです。);dwFlags透明色を指定する場合はDDCKEY_SRCBLTを指定する。これは、転送元サーフェイスの指定した色以外を転送する事を意味する。転送元カラーキーとも言う。他にもDDCKEY_DESTBLTというのがあるが、これは転送先の指定した色の部分にのみ転送する。転送先カラーキーとも言う。こっちは滅多に使用しないので解説省略だぃ(いつか解説するかも)。成功するとDD_OKが返ってくるらしい。今回はパレット1番の紫色(パレット番号は0から始まります)を透明色として使用する事にします。したら、今度はデータ転送です。64,32,32,lpWork,32,0,0);//透明色無しBlt(lpBack,32*5,64,32,32,lpWork,32,0,1);//透明色有りデータ転送をするには、転送先のサーフェースがメンバ関数「BltFast」を呼び出します。「BltFast」の構文は以下の通りです。);dwX,dwY転送先のXおよびY座標lpDDSrcSurface転送元のサーフェイスへのポインタ。言い忘れてたかもしれませんがLPDIRECTDRAWSURFACE型は、これだけでポインタなので&はいりません。lpSrcRect転送元の領域を指定したRECT構造体へのポインタ。RECT構造体については下で詳しく解説しています。dwTrans転送タイプ。DDBLTFAST_NOCOLORKEYは、透明色無しの転送。DDBLTFAST_SRCCOLORKEYは、透明色有り(転送元カラーキーを使用)の転送DDBLTFAST_WAITは、何らかの原因で転送出来ない時に、転送できるまで待つという指定。これらはOR演算(|)で同時に複数指定できます。成功するとDD_OKが返ってくるらしい。BltFastを使用するには、RECTと呼ばれる構造体のメンバに転送元の領域を指定する必要があります。RECT構造体は以下のように定義されています。