12-1でも説明したが、画像データをリソースとして持つと、ゲーム開始時にすべてのリソースをメイン・メモリに読み込むため、リソースの量が多い場合は読み込みに相当の時間がかかるだけでなく、メイン・メモリの容量も多く使ってしまう。
![]()
そこで、画像データをリソースとしては持たず、必要なときにディスクから直接読み込むようにプログラムすることにより、
プログラム実行時に読み込むデータ量を減らすことを考える。![]()
※大量の画像や音を利用するゲームの場合、この方法で開発したほうがよい。
今までは、DirectDrawラッパー関数であるDDLoadBitmap関数を使い。リソースから画像データを読み込み、オフスクリーン・サーフェイスを生成してきた。
《今までの作り方(DirectDraw初期化処理)》
LPDIRECTDRAWSURFACE7 g_pDDSStart = NULL; // スタート画像用サーフェイス
static char szStartBmp[] = "STARTBMP"; // スタート画像リソース名
g_pDDSStart = DDLoadBitmap(g_pDD, szStartBmp, 0, 0);
if (g_pDDSStart == NULL)
return InitFail(hWnd, hRet, "DDLoadBitmap StartBmp FAILED");DDLoadBitmap関数の2つ目の引数にリソース名を文字列(文字配列)で指定することにより、該当するリソースからビットマップデータを読み込み、オフスクリーン・サーフェイスを作成している。
実は、DDLoadBitmap関数の2つ目の引数にはリソース名ではなく
ファイル名を指定できる。この関数は実行されると、まず与えられた文字列のリソースを探し、見つかればそのデータを利用してオフスクリーン・サーフェイスを生成し、見つからなければ、与えられた文字列のファイルを探してオフスクリーン・サーフェイスを生成するという機能を持つ。《DDLoadBitmap関数の中身(抜粋)》
//----------------------------------------------------------------------------- // Name: DDLoadBitmap() // Desc: Create a DirectDrawSurface from a bitmap resource. //----------------------------------------------------------------------------- extern "C" IDirectDrawSurface7* DDLoadBitmap(IDirectDraw7 * pdd, LPCSTR szBitmap, int dx, int dy) { HBITMAP hbm; BITMAP bm; DDSURFACEDESC2 ddsd; IDirectDrawSurface7 *pdds; // // Try to load the bitmap as a resource, if that fails, try it as a file // hbm = (HBITMAP) LoadImage(GetModuleHandle(NULL), szBitmap, IMAGE_BITMAP, dx, dy, LR_CREATEDIBSECTION); if (hbm == NULL) hbm = (HBITMAP) LoadImage(NULL, szBitmap, IMAGE_BITMAP, dx, dy, LR_LOADFROMFILE | LR_CREATEDIBSECTION); if (hbm == NULL) return NULL; // // Get size of the bitmap // ・ ・ ・つまり、
リソース名ではなくファイル名を宣言すれば、リソースからではなくファイルから読み込むわけである。
前にも説明したが、画像ファイルや音ファイルをリソースとして管理する場合、実行可能ファイル(exeファイル)にすべて組み込まれるため、配布は実行可能ファイル1つでよい。しかし、リソースではなくファイルから直接読み込む場合、実行可能ファイルには組み込まれないため、実行可能ファイルとは別に用意しなければならない。
また、ファイル名にパスを指定しない場合は、実行可能ファイルを配置したフォルダに画像などの各ファイルを置かなければならない。
配布の際は注意しよう。
11章2のプログラムを修正する。プロジェクトからすべてのリソースを削除し、画像データはファイルから読み込むようプログラムを修正しなさい。
プログラム改造前と改造後で、実行可能ファイルのサイズの違いを確認すること。