画像を切り出す

画像を切り出して Sprite を一枚ずつ描画します。

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

Main Program の説明

  1. WM_CREATE: では Sprite の並び情報(横と縦の枚数)を指定して画像をロードします。
    今回使用した BMP 画像は、5列2行に10枚のカードが並んでいます。

        switch(msg)
        {   case WM_CREATE:
                App= new BSprite(hWnd);
                App->Load(File,5,2);
                break;
        
  2. WM_PAINT: では Sprite の番号を指定して描画するコードを追加して下さい。
            case WM_PAINT:
                hdc= BeginPaint(hWnd, &ps);
                App->Show();           //画像全体を X=0, Y=0 から描画
                App->Show(0,200);      //画像全体を X=0, Y=200 から描画
                App->Show(0,300,50);   //松のカードを X=300, Y=50 から描画 
                App->Show(1,400,50);   //梅のカードを X=400, Y=50 から描画 
                App->Show(2,500,50);   //桜のカードを X=500, Y=50 から描画 
                EndPaint(hWnd, &ps);
                break;
        

BSprite Object Class の説明

  1. BSprite Object Class のヘッダファイル(BSprite.h) です。
    Sprite の枚数とサイズを格納する領域を定義します。
    Load(LPSTR szBitmap, long WN=1, long HN=1) が Sprite を切り出して描画するメンバ関数です。
    今までのように App->Load(File) と書いて、WN, HN を省略したときは1が設定されます。
    最初に定義した Load(LPSTR szBitmap) は、不要になったので削除して下さい。
        //★ Basic Sprite Object Header   前田 稔 ★
                :
        class BSprite
        { protected:
                :
            long        WNum;               //横方向の Sprite 枚数
            long        HNum;               //縦方向の Sprite 枚数
            long        SWidth;             //Sprite の幅
            long        SHeight;            //Sprite の高さ
            long        xp,yp;              //座標を計算する作業領域
    
          public:
            long        Width;              //画像の幅
            long        Height;             //画像の高さ
            char        szFile[MAX_PATH];   //オープンするファイル名(パス付き)
    
            BSprite(HWND hWnd);             //Constructor
            ~BSprite();                     //Destructor
            HRESULT     Load(LPSTR szBitmap, long WN=1, long HN=1);
            HRESULT     Show();
            HRESULT     Show(long n, long x, long y);
       };
        
  2. BSprite Object Class のプログラムファイル(BSprite.cpp) です。
    Load() 関数では Sprite の枚数がパラメータとして渡されます。
    画像をロードして Sprite の描画に必要な情報を設定して下さい。
        HRESULT  BSprite::Load(LPSTR szBitmap, long WN, long HN)
        {   HDC         hdc;
               :
        }
        
    次の情報を格納して下さい。
    Width 画像全体の幅
    Height 画像全体の高さ
    WNum 横方向の枚数(WN)
    HNum 縦方向の枚数(HN)
    SWidth Sprite の幅
    SHeight Sprite の高さ
  3. Show(long n, long x, long y) 関数を追加して下さい。
    n が Sprite の番号で、x,y が描画する座標です。
        // 画像の番号を指定して BSprite を描画する
        HRESULT  BSprite::Show(long n, long x, long y)
        {   HDC     hdc;
               :
        }
        

【ヒント】

画像を切り出す場合の BitBlt(hdc,dx,dy,dw,dh,hsdc,sx,sy,SRCCOPY); の説明です。
一般的にコピー先はウインドウ(画面)で、コピー元はメモリ上に格納した画像領域を指します。
引数 説明
hdc コピー先の Device Handle
dx コピー先の左上X座標
dy コピー先の左上Y座標
dw コピー先(コピー元)の幅
dh コピー先(コピー元)の高さ
dsdc コピー元の Device Handle
sx コピー元の左上X座標
sy コピー元の左上Y座標
SRCCOPYラスターオペレーション

【演習】

  1. BSprite Object Class の Load() 関数を修正して下さい。
        HRESULT     Load(LPSTR szBitmap);                        //古い形式
        HRESULT     Load(LPSTR szBitmap, long WN=1, long HN=1);  //新しい形式
        
  2. Show(long n, long x, long y) 関数を追加してプログラムを完成させて下さい。
    n がゼロから始まる Sprite の番号で、x, y が描画する座標です。
  3. 次の順に考えると簡単でしょう。
    1. 横に6枚並べた画像
      横に並べた画像では sx の値が「Sprite の番号 * Sprite の幅」になります。
    2. 縦に4枚並べた画像
      縦に並べた画像では sy の値が「Sprite の番号 * Sprite の高さ」になります。
    3. 5列2行に並べた画像
      sx の値は「(Sprite の番号を5で割った余り) * Sprite の幅」になります。
      sy の値は「0~4」まではゼロに、「5~9」までは Sprite の高さになります。

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