GSPRITE Class を継承して美人のアニメーション

My.lib に登録されている GSPRITE Class と BACKBUF Class を継承して美人の顔が変わるアニメーションを行います。

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

Object Class の説明

  1. My.lib に登録されている GSPRITE Class と BACKBUF Class を継承した Anime Object Class を使います。
    GSPRITE Object Class は GIF 画像を入力して格子状に区切り、Sprite を表示する汎用の Object Class です。
    Win32 の環境では GIF 画像が使えないので GSPRITE Object Class を作成しました。
    BACKBUF Object Class は、バックバッファを取得してチラツキを抑えて描画する Object Class です。
    わざわざ Anime Class に継承しなくても GSPRITE Class と BACKBUF Class をそのまま使えば良いのですが、 Library に登録されている Object Class を継承する場合のサンプルとして参照して下さい。
  2. 空の新規プロジェクト(Bijin) を作成して、次のファイルをフォルダーに格納して下さい。
    ファイル名ファイルの説明
    Bijin.cpp Main Program ファイル
    Anime.h Anime Object Class のヘッダファイル
    Anime.cpp Anime Object Class のプログラムファイル
    my.h 私有 Object Class Library のヘッダファイル
    my.lib 私有 Object Class Library のライブラリファイル
    美人.gif 4列4行の美人のアニメーション画像
    説明の画像
  3. クラスタブを選択して[プロジェクト][プロパティ][リンカ][入力]から、追加する依存関係を編集して [my.lib]を追加します。
    リンカ/入力からリンクする代わりに #pragma でリンクすることも出来ます。
    #pragma comment(lib,"my.lib")
  4. BSPRITE Class と BACKBUF Class を継承した Anime Class のヘッダファイル Anime.h です。
    My.lib に登録されている Class を継承するので、My.h を include します。
    : public GSPRITE, public BACKBUF で、継承する Class を宣言します。
    全ての処理は My.lib で行うので、他に定義することはありません。
        /*★ Anime Object Header File  2006-12-01  前田 稔 ★*/
        //   GSPRITE Class, BACKBUF Class を継承する
        #include "My.h"
    
        class Anime : public GSPRITE, public BACKBUF
        { protected:
    
          public:
            Anime(HWND hWnd);               //Constructor
            ~Anime();                       //Destructor
    
        };
        
  5. Anime Class のプログラムファイル Anime.cpp です。
    こちらも形式だけで、中身は何もありません。
    : GSPRITE(hwnd), BACKBUF(hwnd) で継承した Class の Constructor を呼び出します。
        /*★ Anime Object Class  2006-12-01  前田 稔 ★*/
        #include    <windows.h>
        #include    "Anime.h"
    
        // Anime Object Class 関数
        // コンストラクタ(オブジェクトの初期化)
        Anime::Anime(HWND hwnd) : GSPRITE(hwnd), BACKBUF(hwnd)
        {
        }
    
        // デストラクタ(オブジェクトの終了)
        Anime::~Anime()
        {
        }
        

Main Program の説明

  1. Bijin.cpp の説明です。
    *App が Anime Object Class の定義です。
    File[] でアニメーションで使用する GIF 画像を定義します。
    g_NO は現在表示中の Sprite の番号です。
        /******************************************************************/
        /*★ GSPRITE, BACKBUF を継承して美人のアニメーション    前田 稔 ★*/
        /******************************************************************/
        #define     NAME    "Animation"
        #include    <windows.h>
        #include    "Anime.h"
        #pragma     once
        #pragma     comment(lib,"my.lib")
    
        #define     SAFE_DELETE(p)  { if (p) { delete (p);     (p)=NULL; } }
        #define     ID_TIMER    (WM_APP + 0)
    
        Anime       *App= NULL;
        char        MAX_PATH]= "美人.gif";
        int         g_NO= 0;
        
  2. WM_CREATE: では Anime Object Class を生成(インスタンス化)します。
    次に GIF 画像をロードして描画の準備をします。
    4,4 は「4列4行=16枚」の画像を切り出すパラメータです。
    準備が整うとタイマを設定します。
            case WM_CREATE:
                App= new Anime(hWnd);
                if (App->Load(File,4,4)==E_FAIL)
                {   PostMessage(hWnd,WM_CLOSE,0,0);
                    break;
                }
                SetTimer(hWnd,ID_TIMER,100,NULL);
                break;
        
  3. WM_TIMER: で Sprite を切り替えてアニメーションを行います。
    WM_PAINT: から描画するとチラツクので、ここから直接 Render() 関数で描画します。
            case WM_TIMER:
                g_NO= (g_NO+1)%16;
                Render();
                break;
        
  4. Sprite を描画する Render() 関数です。
    バックバッファをクリアして、Show() 関数で Sprite を転送します。
    描画はバックバッファからフロントサーフェスに一挙に転送します。
        //描画処理
        VOID  Render()
        {   App->Clear((HBRUSH)GetStockObject(BLACK_BRUSH));
            App->Show(App->hBackDC,g_NO,50,50);
            App->Blt();
        }
        
  5. WM_DESTROY: ではプログラムを終了する前に Object を開放して下さい。
            case WM_DESTROY:
                KillTimer(hWnd,ID_TIMER);
                SAFE_DELETE(App);
                PostQuitMessage(0);
                return 0L;
        
  6. WinMain() はいつもと同じです。
  7. Windows 10 でも W32 Animation 画像を切り分けてアニメーションをしています。

【演習】

  1. GSPRITE Object Class を作成して下さい。
    詳細は GIF 画像を表示する を参照して下さい。
  2. BACKBUF Object Class を作成して下さい。
    詳細は 「ちらつき」を抑えてスクロール を参照して下さい。
  3. GSPRITE Class と BACKBUF Class を継承して Anime Object Class を作成して下さい。
  4. 美人の顔が変わるアニメーションを作成して下さい。
  5. Object Class の継承は便利ですが、多用は禁物です。
    多用するとプログラムの細部が見え難くなり、実行の流れを掌握できず、デバッグが困難になります。

【メモ】

スーパークラス(継承元のクラス)で宣言されている関数を、新たに定義することをオーバーライドと言います。
オーバーライドされる可能性のある関数は virtual 宣言をして下さい。
virtual 宣言されていない関数をオーバーライドしてもスーパークラスの関数が呼び出されます。
virtual ~BMP(); //Destructor
virtual void Adjust(BOOL flag=TRUE);

Destructor は virtual 宣言をするのが無難なようです。
詳細は 純粋仮想関数と抽象クラス を参照して下さい。

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