C言語ゲームプログラミング 第12回講座
 

Study C Ver2販売開始のお知らせ

 C言語の勉強や教育用に最適です。
 2004/8/23よりStudy C Ver2の販売を開始しました。
 Study C Ver2の新しい機能については
 こちらをご参照ください。

1.背景上にビットマップを重ねて表示
今回は、背景が描かれている画面上にビットマップを描く方法について解説します。 背景となる手頃なビットマップは、c:\windows\ディレクトリ下にあるのでOSの種類に応じてプログラムを変更してください。 XPではシャボン.bmpというファイルがあると思いますが、他のOSはたぶん雲.bmpなどにする必要があると思います。
背景上には次のビットマップを表示するので、

右ボタンメニューの「名前を付けて画像を保存」でダウンロードしてください。

表示するプログラムは、ビットマップ表示のテストに使った物とほとんど同じですが、背景と四角の両方のビットマップをロードし表示しています。
                                                                               
#include <graph.h>

main()
{
	HBITMAP	hbmp_base, hbmp_square;

	//hbmp_base = gl_loadbitmap("c:\\windows\\雲.bmp");
	hbmp_base = gl_loadbitmap("c:\\windows\\シャボン.bmp");
	hbmp_square = gl_loadbitmap("square.bmp");
	if(hbmp_base == NULL || hbmp_square == NULL){
		printf("ビットマップファイルが見つかりません.\n");
		exit(0);
	}
	gl_openwin(-1, -1, 256, 256, 0);
	gl_drawbitmap(hbmp_base, 0, 0, 256, 256, 0, 0);
	gl_drawbitmap(hbmp_square, 128-32, 128-32, 64, 64, 0, 0);
}

このプログラムを実行した結果は次のようになると思います。





2.マスクパターンビットマップを使用しての表示
四角のビットマップのうち黒の部分は背景が描画されるようにしたいのですが、今までに説明した方法では、このようにしか表示することができません。 一部分は背景が透けてみるような描画を行うにはgl_drawbitmap関数ではなく、gl_maskdrawbitmap関数を使用します。 gl_maskdrawbitmap関数には新たにパラメータが1つ追加されています(他のパラメータは同じです)。 新たに追加されたパラメータには、背景を透過させる部分とそうでない部分を区別(マスクパターン)するためのビットマップ(ハンドル)を指定します。 マスクパターンビットマップは、白黒で指定します。白の部分は背景を透過させ黒の部分は背景は使わず前景(描画するビットマップ)を描画します。 次のマスクパターンビットマップを用意したのでいつものように右ボタンメニューの「名前を付けて画像を保存」でダウンロードしてください。

マスクパターンビットマップは、多くの場合描画するビットマップ(この場合square.bmp)を加工することで半自動的に変換することができます。

マスクパターンビットマップをロードしてgl_maskdrawbitmap関数で描画した例は次のようになります。
                                                                               
#include <graph.h>

main()
{
	HBITMAP	hbmp_base, hbmp_square, hbmp_squaremask;

	//hbmp_base = gl_loadbitmap("c:\\windows\\雲.bmp");
	hbmp_base = gl_loadbitmap("c:\\windows\\シャボン.bmp");
	hbmp_square = gl_loadbitmap("square.bmp");
	hbmp_squaremask = gl_loadbitmap("square_bw.bmp");
	if(hbmp_base == NULL || hbmp_square == NULL || hbmp_squaremask == NULL){
		printf("ビットマップファイルが見つかりません.\n");
		exit(0);
	}
	gl_openwin(-1, -1, 256, 256, 0);
	gl_drawbitmap(hbmp_base, 0, 0, 256, 256, 0, 0);
	gl_maskdrawbitmap(hbmp_square, hbmp_squaremask, 128-32, 128-32, 64, 64, 0, 0);
}

このプログラムの実行結果は次のようになります。

これで期待通りに描画されました。
gl_maskdrawbitmap関数の処理内容はおおよそ次のようになります。 (1)マスクパターンビットマップの白を1、黒を0として背景画像に対してAND演算を行います。
(2)マスクパターンビットマップの白に部分の背景は残り、黒の部分の背景は黒(消されます)となります。
(3)描画するビットマップを、背景画像に対してOR演算を行います。

お問い合わせ先 C言語ゲームプログラミングのトップページに戻る Copyright(C) 2003 潟Iーキッド