クラスまみれのゲームプログラミング入門

6:文字列処理と"t"

 ひととおりクラスをおさらいしたので、今回からいよいよゲームの土台を作っていくことにします。土台さえしっかりしていれば、この土台を基盤にパズルゲームだろうがロールプレイングゲームだろうが、楽~に開発することができるようになります。

 すべてが音だけで進行するセガサターン「風のリグレット」のような、よっぽど特殊なゲームでない限り、ゲームには処理結果を表示する画面が不可欠です。マックOSやウィンドウズのような環境では、それらの描画はすべてウィンドウ上で行われます。そこでまず手始めに、ウィンドウを表示するプログラムを作成することにします。

 では、新規にWin32プロジェクトを作成したら、以下のコードを記入しましょう。

winmain.cpp
#include <tchar.h>
#include <windows.h>

int APIENTRY _tWinMain
(HINSTANCE hInstance, HINSTANCE hPrevInstance,
 LPTSTR lpszCmdLine, int nCmdShow)
{
	return 0;
}

 GUIを利用する(逆に言えばコマンドラインを利用しない)ウィンドウズ用のアプリケーションソフトは、すべてWinMain関数がはじめに呼び出されます。この関数に宣言は<windows.h>内で記述されています。……と、普通のウィンドウズ開発の解説書にはそう書かれていますが、上のプログラムはそんな解説書のコードとは若干異なっています。「_tWinMain」の「_t」は何を意味するのでしょうか。

 ウィンドウズOSでは2通りの文字処理方法があります。ひとつは1バイト毎に1文字を代入した配列(つまりchar[])を利用する方法、もうひとつは2バイト毎に1文字を代入した配列(つまりwchar_t[])を利用する方法です。前者はANSI、後者はUnicodeと呼ばれています

 Unicode対応のOSでは、ANSI文字列は、内部では一度Unicodeに変換されていますので、そんな手間をかけるならはじめからUnicodeで処理できるようにすればいいじゃないかというのが、人間の常というものです。しかし、UnicodeはWindows 2000以降のOSしかサポートされていません。その違いを吸収するのがこの「T」というわけです。

 一般の解説書に書かれているコードはANSIコード専用の関数で構築されています。専用である以上、Unicodeプログラムでは当然使えません。そこで、WinMainの代わりに「_tWinMain」としておくことで、プログラムのコンパイル時に必要に応じて、ANSI専用関数「WinMain」か、Unicode専用関数「wWinMain」に置換できるようにしておくのです。こうすれば、それぞれのOSの処理にふさわしいアクションを起こさせることができるようになります。ちなみにVisual C++ 2005では、特に指定しない限りUnicodeモードでのコンパイルになります。

 他にも、ANSI専用命令の関数や宣言が数多くあります。以下はその一例です。なお、共通の宣言を記述する際には<tchar.h>が必要となりますので、お忘れのないように。


ANSIUnicode共通(コンパイル時に適時変換)
charwchar_tTCHAR
strcpywcscpy_tcscpy
LPSTR(=char*)LPWSTR(=wchar_t*)LPTSTR(=TCHAR*)
"文字列"L"文字列"_T("文字列")


 シフトJISでは漢字などの文字はchar型では収まりきれないため、2バイト分の領域を使用するわけですが、1バイト分の領域しか使わない英数字と組み合わせた文字列になると、その対処方法は非常にやっかいなものになります。当プログラミング講座では、<tchar.h>を用いた混合スタイルを利用しますが、面倒であれば文字列処理に断然有利なUnicode専用命令のみで記述して、Unicodeモードでコンパイルすることをおすすめします(Windows Me以前のOSでは実行できなくなりますが)。