Sprite の拡大と縮小

DirectX の D3DXMatrixScaling で、キーの操作で画像を拡大・縮小しながら描画します。

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

プログラムの説明

  1. 新規作成で空のプロジェクト(Spscal)を作成してプログラムファイルとヘッダファイルをプロジェクトに追加して下さい。
    myd3d.h と myd3d.cpp は Object Class Library から取得して下さい。
    ファイル名 ファイルの説明
    spscal.cpp 「プログラムの説明」を参考に作成して下さい
    myd3d.h MyD3D Object Class ヘッダファイル
    myd3d.cpp MyD3D Object Class プログラムファイル
  2. #define と #include と Global Area の定義です。
    xscl, yscl, zscl は、それぞれXYZのサイズです。
        #include    "MyD3D.h"
    
        // Global Area
        HINSTANCE               g_hInst     = NULL;
        HWND                    g_hWnd      = NULL;
        MyD3D                   *myd3d      = NULL;     // MyD3D Object Class
        LPDIRECT3DDEVICE9       g_pDEV      = NULL;     // Direct3DDeviceインターフェイス
        D3DPRESENT_PARAMETERS   g_D3DPP;                // D3DDeviceの設定
        bool                    g_bActive   = false;    // アクティブ状態
        bool                    g_bLost     = false;    // デバイスの消失フラグ
        char                    ImgFile[]   = "c:\\data\\test\\kishi.bmp";
        float                   xscl        = 1.0f;     // X Scal
        float                   yscl        = 1.0f;     // Y Scal
        float                   zscl        = 1.0f;     // Z Scal
    
        // Sprite の定義
        LPD3DXSPRITE            g_pSprite  = NULL;  // スプライト
        LPDIRECT3DTEXTURE9      g_pTexture = NULL;  // スプライトに使うテクスチャ
        
  3. WinMain() と InitDXGraphics(void) はいつもと同じです。
  4. キーを検出して、拡大・縮小を行いながら Sprite を描画する関数です。
    GetKeyState() でキーの押し下げを検出して xscl, yscl, zscl を設定します。
    D3DXMatrixScaling() で拡大・縮小の計算をして g_pSprite->SetTransform() で Sprite に設定します。
    Xを縮小します
    Xを拡大します
    Yを縮小します
    Yを拡大します
        HRESULT Draw(void)
        {   D3DXMATRIX      matWorld;
    
            if (GetKeyState(VK_LEFT)<0)     xscl= xscl*0.95f;
            if (GetKeyState(VK_RIGHT)<0)    xscl= xscl*1.05f;
            if (GetKeyState(VK_UP)<0)       yscl= yscl*0.95f;
            if (GetKeyState(VK_DOWN)<0)     yscl= yscl*1.05f;
            if (GetKeyState(VK_NUMPAD1)<0)  zscl= zscl*0.95f;
            if (GetKeyState(VK_NUMPAD3)<0)  zscl= zscl*1.05f;
            D3DXMatrixScaling(&matWorld,xscl,yscl,zscl);
            g_pSprite->SetTransform(&matWorld);
            g_pDEV->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(100,80,0),1.0f,0);
            // シーンの描画開始
            if (SUCCEEDED(g_pDEV->BeginScene()))
            {   // シーンの描画(スプライトの描画)
                g_pSprite->Begin(0);
                g_pSprite->Draw(g_pTexture,NULL,NULL,&D3DXVECTOR3(10,10,0),0xffffffff);
                g_pSprite->End();
                // シーンの描画終了
                g_pDEV->EndScene();
            }
            // シーンの表示
            return g_pDEV->Present(NULL, NULL, NULL, NULL);
        }
        
  5. CALLBACK 関数です。
    WM_SIZE: でウインドウサイズの変更を検出して ChangeWindowSize() で設定します。
        LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, UINT wParam, LONG lParam)
        {   HRESULT hr = S_OK;
    
            switch(msg)
            {   case WM_ACTIVATE:
                    g_bActive = (LOWORD(wParam) != 0);
                    break;
                        :
                case WM_SIZE:
                    if (!g_pDEV || wParam == SIZE_MINIMIZED)    break;
                    g_D3DPP.BackBufferWidth  = LOWORD(lParam);
                    g_D3DPP.BackBufferHeight = HIWORD(lParam);
                    if (wParam == SIZE_MAXIMIZED || wParam == SIZE_RESTORED)
                        ChangeWindowSize();
                    break;
                        :
        

超初心者の方のために全ソースコードを掲載します。 (^_^;)
全ソースコード

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