ビットマップのスプライト表示

ゲームなどで画像を使う場合、キャラクターと背景を扱うため
背景ごとにキャラクターと重ね合わせた画像を大量に用意してもいいのですが
普通は容量などを考えるので、一般的に背景とキャラは分けて用意し
キャラは背景に関係なく、常に同じ状態で表示される、というのでしょうか?
いわゆるスプライト処理をすることになっていますよね。
そこで、昔はキャラのマスク画像を用意して云々というのをやっていましたが、
WindowsCEのGDIには便利な関数があります。

TransparentImage

「多重起動の防止」のソースをスケルトンとして使います。
ウィンドウプロシージャ内に以下の内容を追加していきましょう。

     //デバイスコンテキスト・仮想DC
     HDC hdc, hdcMem;
     PAINTSTRUCT paint ;
     //読み込むビットマップ
     HBITMAP hBitmap;
     //透過色
     COLORREF TranspColor;

画面上のデバイスコンテキストとビットマップ、
ビットマップ用のメモリデバイスコンテキストのハンドルを
格納するための変数を宣言します。
また、スプライト処理のための透過色を格納する変数を宣言します。

               //デバイスコンテキストを取得
               hdc = BeginPaint(hwnd, &paint);

               //ビットマップを読み込む
               hBitmap = SHLoadDIBitmap(_T("\\My Documents\\bmp.bmp"));
               //仮想デバイスコンテキストを作成
               hdcMem = CreateCompatibleDC(NULL);
               //仮想デバイスコンテキストにビットマップを設定
               SelectObject(hdcMem, hBitmap);

               //仮想DCからDCへ透過コピー
               TranspColor=GetPixel(hdcMem,0,0);
               TransparentImage(hdc,104,80,32,32,hdcMem,0,0,32,32,TranspColor);
               TranspColor=GetPixel(hdcMem,5,5);
               TransparentImage(hdc,88,120,64,64,hdcMem,0,0,32,32,TranspColor);

               //仮想デバイスコンテキストを削除
               DeleteDC(hdcMem);
               //ビットマップを削除
               DeleteObject(hBitmap);

               //デバイスコンテキストを解放
               EndPaint(hwnd, &paint);
               return 0 ;

SHLoadDIBitmap関数でビットマップをメモリに読み込みます。
ファイルを読み込む時は絶対パスを指定しなくてはなりません。
このプログラムでも前回と同じく、微妙な画像だーーー!このビットマップを
MyDocumentsディレクトリに置いて、使っています。
いつも通りメモリDCを作成し、selectobjectでビットマップをメモリDCに設定します。

GetPixelで座標(0,0)の色を取得し、それを透過色として設定し
TransparentImage関数で(幅32、高さ32)の画像を原寸大コピーします。
またGetPixelで、今度は(5,5)の色を取得し、それを透過色として設定し
TransparentImage関数で(幅32,高さ32)の画像を
(幅64,高さ64)で拡大コピーします。

※この関数では、描画元はビットマップからでも直接コピーできるようなのですが
 汎用性のため、あえてメモリDCを使っています。

描画が終わったら、メモリDCを削除した後ビットマップを削除します。
では実行してみましょう。

ビットマップをスプライト表示って怖いよーT_T

ワーイ!白い部分が透過・・・・って
ゲーーーーーーー、象の超人!
白い部分が残っています!これはどうしたことでしょうか?
はい。答えはビットマップファイルの絵を描いている時に
間違って白と限りなく似た色を使ってしまっていたんですね。
ただ表示するだけなら全然分からないので、前回では気付くことがありませんでした。
パレットをいじると、たまにこういう変なポカをやってしまいます^^;
みなさんも画像を作るときは気をつけましょう。

BOOL TransparentImage(HDC hdcDest, LONG DstX, LONG DstY, LONG DstCx, LONG DstCy,
                HANDLE hSrc, LONG SrcX, LONG SrcY, LONG SrcCx, LONG SrcCy,
                COLORREF TransparentColor);

第一引数 hdcDest には、コピー先のデバイスコンテキストのハンドルを指定します
第二・三引数 DstX, DstY には、コピー先の長方形の左上隅のx・y座標を指定します
第四・五引数 DstCx, DstCy には、コピー先の長方形の幅・高さを指定します
第六引数 hSrc には、コピー元のデバイスコンテキストかビットマップのハンドルを指定します
第七・八引数 SrcX, SrcY には、コピー元の長方形の左上隅のx・y座標を指定します
第九・十引数 SrcCx, SrcCy には、コピー元の長方形の幅・高さを指定します
第十一引数 TransparentColor には、透過する色を指定します

戻り値 成功ならTRUEが、失敗ならFALSEが返ります。

ソースの表示

2005/6/4


戻る