いちばんやさしいゲームの作り方

文系の人でも、数理学がわからない人でもゲームプログラミングをマスターできるブログ

画像ファイルの内容をウィンドウに描画するためには、次のステップを踏みます。

  • 描画先のデバイスコンテキストハンドルを取得する
  • 描画先と互換性のあるデバイスコンテキストを作成する
  • 画像ファイルを読み込む
  • 画像ファイルから読み込んだ内容を作成したデバイスコンテキストに適用する
  • BitBlt() 関数を使う

まずは図解をご覧ください。

以下、ソースコードとともにひとつずつ詳細を解説します。

描画先のデバイスコンテキストハンドルを取得する

まず、描画先のデバイスコンテキストハンドルを用意します。 WM_PAINT 内であれば BeginPaint() 関数の戻り値として取得できます。 WM_PAINT 以外の場所の場合は GetDC() 関数を使います。詳しくは「ゲーム画面の描画に必要なデバイスコンテキストハンドルを取得する」を参照ください。

// WM_PAINT 内
HDC destHDC = BeginPaint(hWnd, &ps);
// WM_PAINT 外
HDC destHDC = GetDC(hWnd);

描画先と互換性のあるデバイスコンテキストを作成する

描画先のデバイスコンテキストハンドルを取得することができたら、そのハンドルが示すデバイスコンテキストと互換性のあるデバイスコンテキストを作成します。このデバイスコンテキストは画像ファイルの読み込み先になります。あるデバイスコンテキストと互換性のあるデバイスコンテキストを作成するためには CreateCompatibleDC() 関数を使います。

// destHDC と互換性のあるデバイスコンテキストを作成し、ハンドルを返す
HDC srcHDC = CreateCompatibleDC(destHDC);

画像ファイルを読み込む

描画先と、画像ファイルの読み込み先のデバイスコンテキストができたら、画像ファイルを読み込みます。画像ファイルを読み込むためには LoadImage() 関数を使います。画像ファイルの置き場所については「画像ファイルを LoadImage() 関数で読み込めるようにする」を参照してください。

// 画像ファイルを読み込む
HBITMAP bitmap = (HBITMAP)LoadImage(NULL,
                                    TEXT("madoka.bmp"), // 読み込むファイル名
                                    IMAGE_BITMAP,
                                    0, 0,
                                    LR_LOADFROMFILE);

画像ファイルから読み込んだ内容を作成したデバイスコンテキストに適用する

画像が読み込めたら、先ほど CreateCompatibleDC() 関数で作ったデバイスコンテキストへ、画像ファイルの内容を適用します。画像ファイルの内容をデバイスコンテキストへ適用するためには SelectObject() 関数を使います。

// srcHDC に bitmap を適用する
SelectObject(srcHDC, bitmap);

BitBlt() 関数を使う

デバイスコンテキストに画像ファイルの内容が適用できたら完了です。あとは、画像の読み込み先( srcHDC )から描画先( destHDC )へデータを転送することにより、自分の好きなようにグラフィックを表示することができるようになります。グラフィックデータを転送するためには BitBlt() 関数を使います。詳しくは「ビットマップをブロック転送する」を参照してください。

// 画像を転送する
BitBlt(destHDC,  // 描画先( HDC )
       320, 240, // 描画先の左上座標
       32, 32,   // 転送する幅
       srcHDC,   // 転送元( HDC )
       120, 100, // 転送元の左上座標
       SRCCOPY); // 転送方式

使ったリソースを解放する

最後に、使ったリソースを解放してシステムへ返します。 GetDC() 関数で取得したデバイスコンテキストハンドルは ReleaseDC() 関数で解放し、 CreateCompatibleDC() 関数で作成したデバイスコンテキストハンドルは DeleteDC() 関数で解放します。詳しくは「 ReleaseDC() と DeleteDC() の違い」を参照ください。

// 使い終わったリソースを解放する
DeleteObject(bitmap);
DeleteDC(srcHDC);
ReleaseDC(hWnd, destHDC);

一連のソース

// WM_PAINT 内
HDC destHDC = BeginPaint(hWnd, &ps);
// WM_PAINT 外
HDC destHDC = GetDC(hWnd);

// destHDC と互換性のあるデバイスコンテキストを作成し、ハンドルを返す
HDC srcHDC = CreateCompatibleDC(destHDC);

// 画像ファイルを読み込む
HBITMAP bitmap = (HBITMAP)LoadImage(NULL,
                                    TEXT("madoka.bmp"), // 読み込むファイル名
                                    IMAGE_BITMAP,
                                    0, 0,
                                    LR_LOADFROMFILE);

// srcHDC に bitmap を適用する
SelectObject(srcHDC, bitmap);

// 画像を転送する
BitBlt(destHDC,  // 描画先( HDC )
       320, 240, // 描画先の左上座標
       32, 32,   // 転送する幅
       srcHDC,   // 転送元( HDC )
       120, 100, // 転送元の左上座標
       SRCCOPY); // 転送方式

// 使い終わったリソースを解放する
DeleteObject(bitmap);
DeleteDC(srcHDC);
ReleaseDC(hWnd, destHDC);

Contributions




Trackback URL

メルマガ登録・解除
 
挫折不可能!初級ゲームプログラミング完全マニュアル
RSS track feedいちばんやさしいゲームの作り方 カウンター
ブログSEO対策:track word あわせて読みたい SEO STATUS