API (Application Program Interface) VB6 | |
画像のコピー U |
背景画像と合成(スプライト処理)
背景となる画像Aの上を別の画像Bが移動するときなど、画像Bの図形以外の部分が透けて見えるようにする処理をスプライト処理という。背景画像との合成処理が必要になる。
これまではBitBlt関数やStretchBlt関数で画像をコピーまたは部分コピーを行ってきたが、これらの関数にはコピー元の画像とコピー先の画像を合成してコピーすることができる。ここでは、合成の機能を使ってスプライト処理を行う。
新規フォームを用意して、ピクチャボックス3つ(Picture1,Picture2,Picture3)を配置する。
Form1のプロパティ
Picture 花見.bmp ScaleMode 3 - ピクセル
Picture1〜3 共通のプロパティ
Appearance 0 - フラット AutoRedraw True BorderStyle 0 - なし ScaleMode 3 - ピクセル Visible False
Picture2のプロパティ
Pictureプロパティで画像を設定してからAutoSizeプロパティをTrueにするとピクチャボックスのサイズは画像に合わされる。画像は48×32ピクセルのサイズとする。
AutoSize True Picture ufo2a.bmp
Download : ufo2a.bmp (31KB) ←右クリックして「対象をファイルに保存(A)...」を選択する。保存場所はプログラムと同じフォルダとする。
Picture3のプロパティ
Pictureプロパティで画像を設定してからAutoSizeプロパティをTrueにするとピクチャボックスのサイズは画像に合わされる。画像は48×32ピクセルのサイズとする。
AutoSize True Picture ufo2b.bmp
Download : ufo2b.bmp (31KB) ←右クリックして「対象をファイルに保存(A)...」を選択する。保存場所はプログラムと同じフォルダとする。
実行して、フォームをクリックすると花見の画像の上にUFOの画像が表示されるようにする。プログラムは次の通りである。
標準モジュールを追加してAPI関数BitBltの宣言と3つの定数(SRCCOPY, SRCPAINT, SRCAND)を記述する。
APIビューアを使ってもよいし、キーボードから入力してもよい。ただし、英大文字・小文字は区別されるので注意して入力すること。
・プログラムリスト1
Option Explicit Private Sub Form_Load() Dim dmy As Long Form1.Show '#1 Picture1のサイズをフォームに合わせる。 Picture1.Width = Form1.ScaleWidth Picture1.Height = Form1.ScaleHeight '#2 Formの画像を退避 dmy = BitBlt(Picture1.hdc, 0, 0, Form1.ScaleWidth, Form1.ScaleHeight, _ Form1.hdc, 0, 0, SRCCOPY) End Sub
#1 Form1の画像をPicture1に退避させる。Picture1のサイズをForm1のサイズに合わせる。
#2 BitBlt関数の最後にあるSRCCOPYはコピー元をそのままコピーする指定である。
実行しても何も変わらない。
・プログラムリスト2
Option Explicit Private Sub Form_Click() 'フォームをクリックしたときの処理を追加 Dim x As Long, y As Long, w As Long, h As Long Dim dmy as long x = 10 'コピー先の座標 y = 10 w = Picture2.Width 'コピー元のサイズ h = Picture2.Height '#1 Form1とマスク画像(picture3)をORで合成 dmy = BitBlt(Form1.hdc, x, y, w, h, Picture3.hdc, 0, 0, SRCPAINT) '#2 フォームの再描画 Form1.Refresh End Sub Private Sub Form_Load() Dim dmy As Long Form1.Show 'Picture1のサイズをフォームに合わせる。 Picture1.Width = Form1.ScaleWidth Picture1.Height = Form1.ScaleHeight 'Formの画像を退避 dmy = BitBlt(Picture1.hdc, 0, 0, Form1.ScaleWidth, Form1.ScaleHeight, _ Form1.hdc, 0, 0, SRCCOPY) End Sub
#1 BitBlt関数の最後にあるSRCPAINTはコピー元(白黒のUFO)とコピー先(フォームの花見)の画像をOR演算で合成する。合成画像はフォーム(コピー先)に設定される。
黒部分は0であり1とOR演算すると1、0とOR演算すると0、というように黒部分は無視されるかたちとなる。
白部分は1であり1とOR演算すると1、0とOR演算すると1、というように白部分が優先されるかたちとなる。
#2 Refreshメソッドは強制的に再描画する。ここでは合成画像を表示するためにフォーム(Form1)を再描画している。
実行してフォームをクリックすると、白黒UFOの白部分だけが表示される。黒部分、つまりUFOの背景には花見の画像が合成されている。
このような画像(白黒UFO)をマスク画像という。
・プログラムリスト3
Private Sub Form_Click() Dim x As Long, y As Long, w As Long, h As Long Dim dmy as long Dim x As Long, y As Long, w As Long, h As Long Dim dmy as long x = 10 'コピー先の座標 y = 10 w = Picture2.Width 'コピー元のサイズ h = Picture2.Height 'Form1とマスク画像(picture3)をORで合成 dmy = BitBlt(Form1.hdc, x, y, w, h, Picture3.hdc, 0, 0, SRCPAINT) '#1 Form1と元画像(picture2)をANDで合成 dmy = BitBlt(Form1.hdc, x, y, w, h, Picture2.hdc, 0, 0, SRCAND) '←追加 'フォームの再描画 Form1.Refresh End Sub
#1 BitBlt関数の最後にあるSRCANDはコピー元(UFO)とコピー先(花見と白黒UFOの合成)の画像をAND演算で合成する。
白部分は1であり1とAND演算すると1、0とAND演算すると0、というように元のデータが優先されるかたちとなる。
実行してフォームをクリックすると、UFOが表示される。UFOの背景は透けて見える形となっている。
UFOの座標を移動させて合成するときは、フォームの画像を元に戻す必要がある。すなわち、退避しておいたPicture1の画像データをフォーム(Form1)にコピーして初期化する。
画像合成(スプライト)処理のまとめ
画像のコピー U | |
Copyright © 2002 Hiroshi Masuda |