汎用的なアニメーションプログラム


Sprite Class を使って汎用的なアニメーションプログラムを作成します。

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

プロジェクトの設定-1

  1. 新規プロジェクト(Anime)を作成して、次のファイルをフォルダーに格納して下さい。
    プロジェクトの作成は Windows プログラムを自動的に作成する を参照して下さい。
    my.h 私有 Object Class Library のヘッダーファイル
    my.lib 私有 Object Class Library のプログラムファイル
    テスト画像Sprite を格子状に並べたテスト用の BMP 画像
    説明の画像
  2. [プロジェクト][既存項目の追加]から my.h をプロジェクトに追加します。
  3. クラスタブを選択して[プロジェクト][プロパティ][リンカ][入力]で追加する依存関係を編集して [my.lib] を追加します。
    設定方法は BMP Object Class で画像を表示する を参照して下さい。
  4. ソースプログラムの先頭を表示して my.h を取り込んで下さい。
        #include    "stdafx.h"
        #include    "Main.h"
        #include    "my.h"
        #define     ID_TIMER    32767
        
  5. 「// グローバル変数 :」の位置までスクロールして下さい。
    次の表示を参考にして、ソースコードを追加して下さい。
        // グローバル変数 :
        HINSTANCE hInst;                                // 現在のインターフェイス
        TCHAR szTitle[MAX_LOADSTRING];                  // タイトル バーのテキスト
        TCHAR szWindowClass[MAX_LOADSTRING];            // メイン ウィンドウ クラス名
        SPRITE          *Sprite= NULL;
        WORD            no= 0;
        
  6. WndProc() に WM_CREATE: を追加します。
    次の表示を参考にして、ソースコードを追加して下さい。
    "美人16.bmp" にはテスト用の画像ファイル名を、4,4 には横と縦の Sprite の個数を指定して下さい。
        LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
        {       :
                :
            case WM_CREATE:
                Sprite= new SPRITE(hWnd);
                Sprite->Load("美人16.bmp",4,4);
                Sprite->Adjust();
                SetTimer(hWnd,ID_TIMER,200,NULL);
                break;
        
  7. WM_PAINT: を表示して下さい。
    次の表示を参考にして、ソースコードを追加して下さい。
        case WM_PAINT:
            hdc = BeginPaint(hWnd, &ps);
            // TODO: 描画コードをここに追加してください...
            Sprite->Show(hdc,no,0,0);
            EndPaint(hWnd, &ps);
            break;
        
  8. WndProc() に WM_TIMER: を追加します。
    次の表示を参考にして、ソースコードを追加して下さい。
    16 には Sprite の枚数を指定して下さい。
        case WM_TIMER:
            no= (no+1)%16;
            InvalidateRect(hWnd,NULL,TRUE);
            UpdateWindow(hWnd); 
            break;
        
  9. WndProc() に WM_CLOSE: を追加します。
    次の表示を参考にして、ソースコードを追加して下さい。
        case WM_CLOSE:
            KillTimer(hWnd,ID_TIMER);
            SAFE_DELETE(Sprite);
            DestroyWindow(hWnd);
            break;
        
  10. BMP 画像はファイルから直接入力するのでリソースとして取り込む必要はありません。
  11. [デバッグ]を選択してビルドに続いて実行を行います。
    テスト用の画像が切り出されてアニメーションされていれば完成です。

プロジェクトの設定-2

汎用的に使えるように DialogBox からパラメータを設定できるようにします。
  1. 下の画像を参考にして DialogBox を作成して下さい。
    IDには、次の値を設定して下さい。
    BOX キャプション ID
    DialogBox ダイアログ IDD_DIALOG1
    Edit Control Edit IDC_EDIT1
    Edit Control Edit IDC_EDIT2
    Edit Control Edit IDC_EDIT3
    Edit Control Edit IDC_EDIT4
    Button OK IDOK
    Button キャンセル IDCANCEL

  2. 「// グローバル変数 :」の位置までスクロールして下さい。
    次の表示を参考にして、ソースコードを修正して下さい。
        // グローバル変数 :
        HINSTANCE hInst;                                // 現在のインターフェイス
        TCHAR szTitle[MAX_LOADSTRING];                  // タイトル バーのテキスト
        TCHAR szWindowClass[MAX_LOADSTRING];            // メイン ウィンドウ クラス名
        SPRITE          *Sprite= NULL;
        WORD            no= 0;
        char            BmpName[64];        // BMP File Name
        int             WC,HC;              // Sprite Count
        int             SPEED;              // アニメーション速度
        
  3. 関数の Prototype 宣言に DlgProc() を追加して下さい。
        // このコード モジュールに含まれる関数の前宣言:
        ATOM                MyRegisterClass( HINSTANCE hInstance );
        BOOL                InitInstance( HINSTANCE, int );
        LRESULT CALLBACK    WndProc( HWND, UINT, WPARAM, LPARAM );
        LRESULT CALLBACK    About( HWND, UINT, WPARAM, LPARAM );
        LRESULT CALLBACK    DlgProc( HWND, UINT, WPARAM, LPARAM );
        
  4. WndProc() の WM_CREATE: を次の表示を参考にして、修正して下さい。
            case WM_CREATE:
                Sprite= new SPRITE(hWnd);
                if (DialogBox(hInst,(LPCTSTR)IDD_DIALOG1,hWnd,(DLGPROC)DlgProc)==IDOK)
                {   Sprite->Load(BmpName,WC,HC);
                    Sprite->Adjust();
                    SetTimer(hWnd,ID_TIMER,SPEED,NULL);
                }
                break;
        
  5. WndProc() の WM_TIMER: を次の表示を参考にして、修正して下さい。
            case WM_TIMER:
                no= (no+1)%(WC*HC);
                InvalidateRect(hWnd,NULL,TRUE);
                UpdateWindow(hWnd); 
                break;
        
  6. プログラムの最後に DialogBox のメッセージハンドラを追加して下さい。
        // BMP 画像設定用メッセージ ハンドラ
        LRESULT CALLBACK DlgProc(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam)
        {   char    buf[20];
    
            switch( message )
            {
                case WM_INITDIALOG:
                    SetWindowText(GetDlgItem(hDlg,IDC_EDIT1),"美人16.bmp");
                    SetWindowText(GetDlgItem(hDlg,IDC_EDIT2),"4");
                    SetWindowText(GetDlgItem(hDlg,IDC_EDIT3),"4");
                    SetWindowText(GetDlgItem(hDlg,IDC_EDIT4),"200");
                    return TRUE;
                case WM_COMMAND:
                {   switch(LOWORD(wParam))
                    {   case IDOK:
                            GetDlgItemText(hDlg,IDC_EDIT1,BmpName,64);
                            GetDlgItemText(hDlg,IDC_EDIT2,buf,20);
                            WC=  atoi(buf);
                            GetDlgItemText(hDlg,IDC_EDIT3,buf,20);
                            HC=  atoi(buf);
                            GetDlgItemText(hDlg,IDC_EDIT4,buf,20);
                            SPEED= atoi(buf);
                        case IDCANCEL:
                            EndDialog(hDlg,LOWORD(wParam));
                            return TRUE;
                    }
                }
                break;
            }
            return FALSE;
        }
        
  7. [デバッグ]を選択してビルドに続いて実行を行います。
    プログラムを起動すると Dialog Box が表示されます。
    Dialog Box にパラメータを設定して OK をクリックします。
    画像が切り出されてアニメーションが表示されたら完成です。

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