画像を切り替えてアニメーション

DirectX の CDisplay Class を使って girl.bmp から Sprite を切り出してアニメーションします。
まだまだ DirectX の2D描画の要望は根強いようなので、シンプルなアニメーションのサンプルプログラムを作成してみました。
このプログラムは DirectX August 2007 を使って開発しました。

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

プログラムの説明

  1. プロジェクトのフォルダーに次のファイルを格納して下さい。
    ☆DirectX9 の新しいバージョンでは、2D関係のソースファイルが無くなっています。 (;_;)
    見つからないときは、ここから Object Class Library から取得して下さい。
    ファイル名 ファイルの説明
    Main.cpp Main Program File
    Ddutil.cpp c:\Dx90SDK\Samples\C++\Common からコピー
    Ddutil.h c:\Dx90SDK\Samples\C++\Common からコピー
    Dxutil.h c:\Dx90SDK\Samples\C++\Common からコピー
    Girl.bmp 透明色(黒)を使った BMP 画像
    Girl.bmp は高さが 216 ドットで、一枚の幅が 128 ドットのスプライトを横に7枚並べた画像です。
    背景の色(黒)は透明色に設定されています。

  2. timeGetTime() を使うので mmsystem.h を取り込んで winmm.lib をリンクして下さい。
    g_pBmpSurface にアニメーションに使う画像をロードします。
    g_num はアニメーションする画像の番号を格納する領域です。
    bmpfile[] がアニメーションに使う画像ファイルです。
    HWND        g_hWnd;
    CDisplay*   g_pDisplay    = NULL;
    CSurface*   g_pBmpSurface = NULL;
    BOOL        g_bActive     = FALSE;
    int         g_num         = 0;
    //幅=128, 高さ=216 で横に7枚並んでいる BMP 画像ファイル
    char        bmpfile[]=    "c:\\data\\test\\girl.bmp";
        
  3. Direct Draw の初期化です。
    CreateWindowedDisplay() で DisplayMode を設定します。
    CreateSurfaceFromBitmap() でアニメーションに使う画像を設定します。
    SetColorKey(0) で画像の背景色(黒)を透明色に設定します。
    //★ InitDirectDraw()
    HRESULT InitDirectDraw(HWND hWnd)
    {   HRESULT             hr;
    
        g_pDisplay = new CDisplay();
        if (FAILED(hr=g_pDisplay->CreateWindowedDisplay(hWnd,900,240)))     return hr;
        if (FAILED(hr=g_pDisplay->CreateSurfaceFromBitmap(&g_pBmpSurface,bmpfile,0,0))) return hr;
        if (FAILED(hr=g_pBmpSurface->SetColorKey(0)))   return hr;
        return S_OK;
    }
        
  4. 描画は DisplayFrame() 関数で行います。
    timeGetTime() で時刻を取得してスプライトの番号を切り替えます。
    アニメーションの切り替え速度は timeGetTime()/200 の値で調整して下さい。
    g_pDisplay->Blt(0,0,g_pBmpSurface,NULL); にすると画像全体が表示されます。
    rect に描画する画像の範囲(1枚のスプライト)を設定します。
    HRESULT DisplayFrame()
    {   HRESULT hr;
        RECT    rect;
    
        g_pDisplay->Clear(RGB(0,100,80));
    //    g_pDisplay->Blt(0,0,g_pBmpSurface,NULL);
        g_num= (timeGetTime()/200)%7;
        SetRect(&rect,g_num*128,0,(g_num+1)*128,216);
        g_pDisplay->Blt(0,0,g_pBmpSurface,&rect);
        if (FAILED(hr=g_pDisplay->Present()))   return hr;
        return S_OK;
    }
        

全ソースコード

超初心者のプログラム入門(DirectX9 game program)