BSprite で BMP 画像を表示する

短い動きが何度も繰り返される場合の一区切りの動作のことをスプライト(SPRITE)と言います。
ゲームプログラムの世界では、アニメーションに使用する一枚の画像もスプライトと呼んでいます。
最初に BMP ファイルをそのまま描画する Basic Sprite Object Class の原型を作成します。

前田稔(Maeda Minoru)の超初心者のプログラム入門

Main Program の説明

  1. #include と #define と Global Area の定義です。
    Object Class のヘッダファイル BSprite.h を include して下さい。
    *App は Basic Sprite Object Class の定義です。
    File[] は BMP 画像ファイルの定義です。
        /****************************************************/
        /*★ Basic Sprite Object Class のテスト   前田 稔 ★*/
        /****************************************************/
        #define     NAME    "BSprite Class"
        #include    <windows.h>
        #include    "BSprite.h"
        #define     SAFE_DELETE(p)  { if (p) { delete (p);     (p)=NULL; } }
    
        BSprite     *App= NULL;     //Basic Sprite Object Class
        char        File[MAX_PATH]= "花札5_2.bmp";
        
  2. WM_CREATE: で BSprite Object Class を生成して画像ファイルをロードします。
        switch(msg)
        {   case WM_CREATE:
                App= new BSprite(hWnd);
                App->Load(File);
                break;
        
  3. WM_PAINT: で App->Show() で画像を描画します。
            case WM_PAINT:
                hdc= BeginPaint(hWnd, &ps);
                App->Show();
                EndPaint(hWnd, &ps);
                break;
        
  4. WM_DESTROY: で BSprite Object Class を開放して、プログラムを終了します。
    Main Program はこれだけです。非常に簡単でしょう。 \(^o^)/
            case WM_DESTROY:
                SAFE_DELETE(App);
                PostQuitMessage(0);
                return 0L;
        

BSprite Object Class の説明

Object の基礎は TextOut Object Class を作成する を参照して下さい。
  1. BSprite Object Class のヘッダファイル(BSprite.h) です。
    hWnd はメインウインドウのハンドルです。
    hBmp と hBmpDC は BMP 画像を描画するための領域です。
    Width と Height が画像の幅と高さです。
    szFile[] にはオープンしたファイル名を格納します。
    Load() が BMP 画像を入力して描画の準備をするメンバ関数(メソッド)です。
    Show() が BMP 画像を描画するメンバ関数(メソッド)です。
        //★ Basic Sprite Object Header   前田 稔 ★
        #define     SAFE_DELDC(p)   { if (p) { DeleteDC (p);   (p)=NULL; } }
        #define     SAFE_DELOBJ(p)  { if (p) { DeleteObject(p); (p)=NULL; } }
    
        class BSprite
        { protected:
            HWND        hWnd;               //Window Handle
            HBITMAP     hBmp;               //画像の HBITMAP
            HDC         hBmpDC;             //画像の HDC
    
          public:
            long        Width;              //画像の幅
            long        Height;             //画像の高さ
            char        szFile[MAX_PATH];   //オープンするファイル名(パス付き)
    
            BSprite(HWND hWnd);             //Constructor
            ~BSprite();                     //Destructor
            HRESULT     Load(LPSTR szBitmap);
            HRESULT     Show();
        };
        
  2. BSprite Object Class のプログラムファイル(BSprite.cpp) です。
    Windows.h と BSprite.h を include して下さい。
    コンストラクタでは Object Class を初期化します。
    デストラクタでは Object Class で使用した領域を開放します。
        //★ Basic Sprite Object Class   前田 稔 ★
        #include <Windows.h>
        #include "BSprite.h"
    
        // BSprite Object Class 関数
        // コンストラクタ(オブジェクトの初期化)
        BSprite::BSprite(HWND hwnd)
        {   hWnd= hwnd;
            hBmp= NULL;
            hBmpDC= NULL;
            szFile[0]= '\0';
        }
    
        // デストラクタ(オブジェクトの終了)
        BSprite::~BSprite()
        {   SAFE_DELDC(hBmpDC);
            SAFE_DELOBJ(hBmp);
        }
        
  3. Load() は BMP 画像を入力して描画の準備をするメンバ関数(メソッド)です。
    hBmp と hBmpDC に画像を描画するための情報を設定して下さい。
        // Load Sprite Image
        HRESULT  BSprite::Load(LPSTR szBitmap)
        {   HDC         hdc;
            BITMAP      bmp;
    
            SAFE_DELDC(hBmpDC);
            SAFE_DELOBJ(hBmp);
    
            // ビットファイルからの読み込み
            hBmp= (HBITMAP)LoadImage(NULL,szBitmap,IMAGE_BITMAP,0,0,
                                     LR_LOADFROMFILE|LR_CREATEDIBSECTION);
            if (hBmp==NULL)
            {   MessageBox(hWnd,szBitmap,"Load BMP Error",MB_OK);
                return FALSE;
            }
    
            hdc= GetDC(hWnd);
            hBmpDC= CreateCompatibleDC(hdc);
            SelectObject(hBmpDC, hBmp);
            GetObject(hBmp,sizeof(BITMAP),&bmp);
            Width = bmp.bmWidth;
            Height = bmp.bmHeight;
            ReleaseDC(hWnd,hdc);
            return TRUE;
        }
        
  4. Show は 0,0 の座標に hBmpDC の画像を描画するメンバ関数です。
        // 画像全体を描画する
        HRESULT  BSprite::Show()
        {   HDC     hdc;
            if (hBmpDC==NULL)   return FALSE;
            hdc= GetDC(hWnd);
            BitBlt(hdc,0,0,Width,Height,hBmpDC,0,0,SRCCOPY);
            ReleaseDC(hWnd,hdc);
            return TRUE;
        }
        

プロジェクトの作成

  1. Visual Studio を起動します。
  2. [ファイル/新規作成/プロジェクト]から[Visual C++/Win32]を選択します。
    場所にプロジェクトを作成するフォルダーを設定します。
    プロジェクト名に BasicSprite とタイプして[OK]をクリックします。
    [次へ]をクリックします。
    空のプロジェクトを選択して[完了]をクリックするとプロジェクトのフォルダーが作成されます。
  3. [プロジェクト/新しい項目の追加/コード/C++ファイル]を選びます。
    ファイル名に Main.cpp をタイプして[追加]をクリックします。
    Main.cpp にソースコードをタイプします。
  4. [プロジェクト/クラスの追加/C++/C++クラス]を選ぶと汎用C++クラスウイザードが表示されます。
    クラス名に BSprite とタイプすると、BSprite.cpp と BSprite.h がプロジェクトに追加されます。
  5. BSprite.cpp と BSprite.h にソースコードをタイプします。
  6. [プロジェクト/BasicSprite のプロパティ/構成プロパティ/全般/文字セット/マルチバイト文字セットを使用する]を選びます。
  7. [デバッグ/デバッグ開始]を選ぶとコンパイルされて、エラーが無ければ実行されます。

【演習】

  1. BSprite Object Class を作成して、プログラムを完成させて下さい。
    Object Class の全てのソースコードを掲載しているので、コピーして組み立てるだけです。
  2. 描画する座標を指定する Show(long x, long y) メンバ関数を追加して下さい。
  3. 矢印キーで画像を動かしてみましょう。
    キー入力の詳細は F12 & ESC キーでプログラムを終了する を参照して下さい。

超初心者のプログラム入門(Win32API C++)