最終更新 2003 10/01
サンプルのダウンロード → API_Bitmap4.lzh(56k)
全ソースコード
BitBlt 関数
CreateCompatibleDC 関数
LoadImage 関数
SelectObject 関数
DeleteObject 関数
DeleteDC 関数
対応しているバージョン
95, 98, Me, NT4.0以降, CE1.0以降, 2000, XP
必要なライブラリとヘッダ
wingdi.h
gdi32.lib
|
ゲームの場合は一度にいくつもの絵をメモリに読み込んでおく必要があります。
たとえば、キャラクターの絵、背景の絵、敵キャラの絵というように、別の
種類の絵が複数必要です。
これを効率よく管理するには、ビットマップを読み込むときに必要な HDC と
HBITMAP の変数を配列にするのが良いと思います。
上のサンプルでは memDC[] と hBit[] にあたります。
このとき注意することは、たとえば、最初に memDC[1] と hBit[1] に
キャラクターの絵を読み込んで、必要がなくなったからといって、そのまま
別の絵を memDC[1] と hBit[1] に読み込まないことです。
一度使った変数に別の絵を読み込むときは、必ず先に変数の値を削除します。
そうしないとリソースメモリが解放されずに、減ったままの状態になります。
これを何回も繰り返すと、どんどん使用できるメモリが減っていって
最後にはフリーズするという未来が待ってます。
g_memDC の値の削除は DeleteDC() 関数で行い、g_hBit の値の削除は
DeleteObject() 関数で行います。
上のサンプルでは DeleteScreen() という関数を作って勝手に
やってくれるようにしています。
それから g_memDC と g_hBit はプログラムを終了する前に必ず値を
削除しましょう。
これも忘れるとメモリリーク(リソースメモリが解放されずに残る)の
原因になります。
配列変数を宣言するときには、ちょっとしたコツがあります。
上のサンプルのように、配列の要素数に #define した値を使います。
#define MAX 3
int hairetu[ MAX ];
特にゲームの場合は実際にゲームを動かすまで配列のサイズが
特定できない場合が多いので、配列の要素数を #define で定義して
おきます。
こうするとあとで要素数を変えたいと思ったときに、#define した部分を
いじればすぐに変更ができます。
上のサンプルでは一度に読み込めるビットマップの数を3と
設定していますが、もしあとで5つ必要になったら
#define BMP_SCREEN 5
と変更すれば、他にはどこもいじる必要はありません。
|