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




2014年10月より個人の方を対象に、Study C無料提供を開始しました。
C言語を勉強中の方は、学習・教育に最適なC言語インタープリタのStudy Cを使ってみてください(個人の方は無料です)。
大学・高専・高校などの教育機関での採用実績も多数あるロングセラー商品Study Cが、個人向けに無料提供を始めました。
インタープリタの手軽さに加え、ゲームや3Dタートルグラフィックで楽しく勉強したりと、C言語の学習を協力にサポートします。
ブロック崩しゲーム 3Dツリー クリスマスツリー
また、このようなボタンの用意されているページでは、掲載しているプログラムをStudy Cに直接ロードし実行したりすることができます。
Study Cにロードする Study Cにロードし編集する Study Cにロードし実行する
Study C無料利用についての詳細は、このページを参照してください。



1.main作成ウィザード


第12回講座のマスクパターンを使用したビットマップ表示は、その準備やプログラムが少し煩雑だったのではないかと思います。 Study C Ver2では第14回講座の手順で元のビットマップを用意しておけばマスクパターンを簡単に用意することができます。 この章では、第14回講座で作成したマスクパターンを使用するので、 まだマスクパターンを作成してない方は第14回講座のビットマップファイルのマスクパターン作成の手順に従って作成しておいてください。
最初に、Study C Ver2の機能を使ってビットマップを表示するプログラムを作ってみます。 Study C Ver2を起動し右側のmain作成ウィザードボタンmain作成ウィザードボタンを押してください。 次のダイアログボックスが表示されます。
main作成ウィザード1

ここで、ゲーム(G)の項目を選択して次へ(N)ボタンを押します。 次のダイアログボックスでは、次の手順でセットしていきます。
(1)X方向サイズ(X)、Y方向サイズ(Y)をそれぞれ256にセットします。
(2)ビットマップを表示(B)をチェックします。
(3)ビットマップファイル(B)の入力と、その参照(R)ボタンが有効になるので、参照(R)ボタンを押します。
(4)ファイル選択用のダイアログボックスでplane.bmpファイルを選択します。
(5)次へ(N)ボタンを押します。
main作成ウィザード2

次のダイアログボックス(main作成ウィザード3)が表示されますが、この項目は何も変更しないので、そのまま次へ(N)ボタンを押します。
main作成ウィザード3

次のダイアログボックス(main作成ウィザード4)が表示され、作成されたプログラムが表示されます。また、下部には説明などが表示されます。
main作成ウィザード4

ここで完了ボタンを押すとエディタに作成したプログラムがセットされます。
#include <graph.h>

main()
{
	HBITMAP	hbmp;

	hbmp = gl_loadbitmap("C:\\StudyC\\RES\\plane.bmp");
	if(hbmp == NULL){
		printf("ビットマップファイルが存在しないか読み込めません.\n");
		exit(0);
	}
	gl_openwin(-1, -1, 256, 256, 0);

	/* ここに処理を記述していってください。*/
	gl_drawbitmap(hbmp, 104, 102, 48, 51, 0, 0);
	gl_refresh();

	gl_freebitmap(hbmp);
}

このプログラムをそのまま実行してみます。 コマンドモードに戻りrunコマンドや実行ボタンなどでプログラムを実行してみましょう。
実行結果1

次に、このプログラムに背景の描画を追加します。エディットモードに戻り次のようにプログラムを修正します(赤字の部分を追加します)。
#include <graph.h>

main()
{
	HBITMAP	hbmp, hbmp_base;

	hbmp = gl_loadbitmap("C:\\StudyC\\RES\\plane.bmp");
	hbmp_base = gl_loadbitmap("c:\\windows\\シャボン.bmp");
	if(hbmp == NULL || hbmp_base == 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, 104, 102, 48, 51, 0, 0);
	gl_refresh();

	gl_freebitmap(hbmp_base);
	gl_freebitmap(hbmp);
}

注)XP以外のOSでは、シャボン.bmpの部分をwindowsディレクトリ下の適当なファイル(雲.bmpなど)に変更する必要があります。

修正後のプログラム実行結果は次のようになります。
実行結果2
このプログラムは、マスクパターンを指定せずにビットマップを表示しているため周りが黒く抜けてしまっています。


2.マスクパターン付きビットマップ表示プログラムの作成


次にmain作成ウィザードを使用してマスクパターン付きビットマップ表示プログラムを作成します。 前回と同様にmain作成ウィザードを起動します。 カレントバッファの内容が編集途中の場合は、内容を破棄して良いか確認するメッセージボックスが表示されます。 セーブする必要がある場合は、カレントバッファの内容を保存しておいてください。

main作成ウィザード1は、前回と同様にゲーム(G)の項目を選択して次へ(N)ボタンを押します。

main作成ウィザード2では、次の手順でセットしていきます(1〜4は前回と同様です)。
(1)X方向サイズ(X)、Y方向サイズ(Y)をそれぞれ256にセットします。
(2)ビットマップを表示(B)をチェックします。
(3)ビットマップファイル(B)の入力と、その参照(R)ボタンが有効になるので、参照(R)ボタンを押します。
(4)ファイル選択用のダイアログボックスでplane.bmpファイルを選択します。
(5)マスクを使用(B)をチェックします。
(6)▼(U)ボタンを押します。
(7)次へ(N)ボタンを押します。
main作成ウィザード2-1
注)あらかじめ、plane-mask.bmpファイルを作成しておく必要があります。作成方法は第14回講座を参照してください。

main作成ウィザード3では何も変更しないで、そのまま次へ(N)ボタンを押します。

main作成ウィザード4が表示され、作成されたプログラムが表示されます。
main作成ウィザード4-1

ここで完了ボタンを押すとエディタに作成したプログラムがセットされます。
#include <graph.h>

main()
{
	HBITMAP	hbmp, hbmp_mask;

	hbmp = gl_loadbitmap("C:\\StudyC\\RES\\plane.bmp");
	if(hbmp == NULL){
		printf("ビットマップファイルが存在しないか読み込めません.\n");
		exit(0);
	}
	hbmp_mask = gl_loadbitmap("C:\\StudyC\\RES\\plane-mask.bmp");
	if(hbmp_mask == NULL){
		printf("マスク用ビットマップファイルが存在しないか読み込めません.\n");
		exit(0);
	}
	gl_openwin(-1, -1, 256, 256, 0);

	/* ここに処理を記述していってください。*/
	gl_maskdrawbitmap(hbmp, hbmp_mask, 104, 102, 48, 51, 0, 0);
	gl_refresh();

	gl_freebitmap(hbmp);
	gl_freebitmap(hbmp_mask);
}

このプログラムを実行すると次のように表示されます。
実行結果3
実行結果は、前のマスクパターン無しの場合と全く同じです。

次に、このプログラムにも前回と同様、背景の描画を追加します。 エディットモードに戻り次のようにプログラムを修正します(赤字の部分を追加します)。
#include <graph.h>

main()
{
	HBITMAP	hbmp, hbmp_mask, hbmp_base;

	hbmp = gl_loadbitmap("C:\\StudyC\\RES\\plane.bmp");
	hbmp_base = gl_loadbitmap("c:\\windows\\シャボン.bmp");
	if(hbmp == NULL || hbmp_base == NULL){
		printf("ビットマップファイルが存在しないか読み込めません.\n");
		exit(0);
	}
	hbmp_mask = gl_loadbitmap("C:\\StudyC\\RES\\plane-mask.bmp");
	if(hbmp_mask == 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, hbmp_mask, 104, 102, 48, 51, 0, 0);
	gl_refresh();

	gl_freebitmap(hbmp_base);
	gl_freebitmap(hbmp);
	gl_freebitmap(hbmp_mask);
}

注)XP以外のOSでは、シャボン.bmpの部分をwindowsディレクトリ下の適当なファイル(雲.bmpなど)に変更する必要があります。

修正後のプログラム実行結果は次のようになります。
実行結果4
前回の実行結果とは異なり、周りの黒い部分が無くなっています。