プログラミングの練習(Hit and Blow) #01 mainあたり

もうゲームを作りかけては手に負えなくなって放置するっていうループに飽き飽きしてきたので、再入門のつもりで簡単なプログラムを作ってみようと思います。自分以外の人には参考にならないかもしれませんが、いちおう作業記録をブログに載せていきます。

開発環境はVC2008EEとDXライブラリ。念のため補足すると、DXライブラリというのはDirectXのことではなくて、DirectXをラッピングしたライブラリのひとつです。C言語HSP並みに楽にDirectXを扱えるので初心者には重宝します。作るのはHit and Blowです。初心に帰りすぎですね。個人的にはHit and Blowと聞くと女神転生シリーズを思い出します。

早速VCでプロジェクトを作って、DXライブラリを使えるように準備します。ついでにプロジェクトの設定でコンパイラの警告レベルを4にするのも忘れません。

ところで今回はオブジェクト指向とやらは一切忘れて、C言語的な設計にしていこうと思います。というのも、今までC++で作ろうとしたプログラムは一気に複雑になって自分の手に負えなくなってしまっていたからです……。もうスマートさは捨てて、自分の身の丈に合ったコードを書いていこうかと。HSPを使っていたころは稚拙でも無理やりプログラムを完成させていたので、その気概を思い出していきたい。

早速プログラムを書いていきます。以下、書きながら思ったことをつらつらと書いていきます。コード片しか載せないので変数定義とかが無かったりしますがご了承ください。以下はAppMain.cppの内容です(mainがあるファイルは一番上に来てほしいので、Aで始まるこの名前にしています)。

//Debugビルド(コンソールが出る)の場合はこちらから
int main()
{
	init();
	gameMain();
	term();

	return EXIT_SUCCESS;
}

//Releaseビルドの場合はこちらから
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
	return main();
}

なぜかmainとWinMain両方あります。WinMainでは単にmainを呼び出しているだけなので、やることは実質同じです。この上で、プロジェクトのプロパティの[リンカ]→[システム]→[サブシステム]をDebugビルドでは「コンソール」に、Releaseビルドでは「Windows」にしておきます。こうすることにより、Debugビルドの時だけゲーム画面とは別におなじみのDOS窓が開きます! printfでいろいろ表示できるのでデバッグに便利。ちなみにこの方法はSelene 1.0系に付属のチュートリアルで知りました。まあTRACEマクロを使えばこんな面倒なことはしなくていいわけですが、単なる好みでDOS窓を選びました。

最初からやけに細かい小技ですが、これは講座とかではなく作業記録ですので、今後もこんな感じで続いていくものと思われます。ご了承ください。

あ、あと、WinMainの引数の変数名がないのは、「引数は関数の本体部で 1 度も参照されません。」っていうwarningを消すためです(参考:「引数が関数内で使用されないことを示す」「プログラムのエントリーポイント」)。ちなみに警告レベル3だとこの警告は出ません。

mainの中のinit、termは(主にDXライブラリの)初期化処理・終了処理です。gameMainの中に実際のゲームの処理を書いていく予定。mainはシンプルなほうがいいってよく聞くのでこんな感じにしました。

次はinitとtermの中身を。

void init()
{
	//デバッグビルドならデフォルトでデバッグモードをON
#ifdef _DEBUG
	bDebugMode = true;
#endif

	//Debugビルドなら常にウインドウモード、
	//Releaseビルドならフルスクリーンかウインドウか選べる
	bWindowMode = false;
	if (bDebugMode) {
		ChangeWindowMode(TRUE);
		bWindowMode = true;
	} else {
		if (MessageBox(NULL, "フルスクリーンモードにしますか?",
		    applicationTitle.c_str(), MB_YESNO) == IDNO)
		{
			ChangeWindowMode(TRUE);
			bWindowMode = true;
		}
	}

	//ウインドウタイトルを設定
	SetMainWindowText(applicationTitle.c_str());

	// DXライブラリ初期化処理
	if (DxLib_Init() == -1) exit(EXIT_FAILURE);
}

void term()
{
	// DXライブラリ使用の終了処理
	DxLib_End();
}

起動時にプレイヤーがフルスクリーンにするかどうか選べるようにしてたフリーゲームがあって、便利なので真似したのですが、どのゲームだったか忘れてしまいました。

こんな感じでだらだらと報告を書いていこうと思います。飽きっぽい私でも、さすがにHit and Blowくらいなら完成させられる、はず。