背景画像を立体的にスクロール

スクロールの画像

テクスチャを利用して背景画像を立体的にスクロールします。

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

プログラムの説明

  1. DirectX の Global Area です。
    ViewForm() はカメラの座標です。
    tergForm() はカメラの注視点です。
    背景のスクロールを確認しながら ViewForm() と tergFrom() を調整して下さい。
        //Global Area
        MyD3D                   *myd3d     = NULL;
        HWND                    g_hWnd     = NULL;
        LPDIRECT3DDEVICE9       g_pDEV     = NULL;
        LPDIRECT3DTEXTURE9      g_pTexture = NULL;
        D3DXVECTOR3             ViewForm(-1.0f, 5.0f, 9.0f);
        D3DXVECTOR3             tergForm(-0.3f, 1.0f, 0.0f);
        bool                    g_bActive  = false;
        
  2. File[] はスクロールする背景画像のファイル名です。
    上下及び、左右が連続しても違和感が無いような画像を用意して下さい。
    char File[] = "星空.jpg";
  3. 頂点フォーマットの設定です。
    三角形を組み合わせた矩形を、上部が奥(Z座標=0)に、下部が手前(Z座標=6)になるように定義しています。
    この違いで立体感が生まれます。
    画像の描画を確認しながら調整して下さい。
        #define D3DFVF_VERTEX (D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1)
        typedef struct
        {   float       x,y,z;    // The position
            D3DCOLOR    color;    // The color
            FLOAT       tu,tv;    // The texture coordinates
        }   D3DMYVERTEX;
    
        //矩形の定義
        D3DMYVERTEX vtx[4]=
        { { -5,   -5,    0,   0xffffffff, 0,   0    },
          {  5,   -5,    0,   0xffffffff, 0.5, 0    },
          { -5,    5,    6,   0xffffffff, 0,   0.5  },
          {  5,    5,    6,   0xffffffff, 0.5, 0.5  },
        };
        
  4. MyD3D Object Class をインスタンス化して、インターフェースを取得します。
    デバイスが設定できるとテクスチャ読み込みます。
        HRESULT InitD3D()
        {
            myd3d= new MyD3D(g_hWnd);
            myd3d->InitD3D(&g_pDEV);
            // テクスチャ読み込み
            g_pTexture= myd3d->LoadTexture(File);
            return S_OK;
        }
        
  5. 描画処理です。
    SetupMatrices() で描画環境を設定してレンダリングします。
        void Draw(void)
        {
            if (!g_pDEV || !g_bActive)  return;
            g_pDEV->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,100,80),1.0,0);
            if (SUCCEEDED(g_pDEV->BeginScene()))
            {   SetupMatrices();
                //頂点フォーマットの設定
                g_pDEV->SetFVF(D3DFVF_VERTEX);
                //直接データを渡して描画
                g_pDEV->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,2,vtx,sizeof(D3DMYVERTEX));
                g_pDEV->EndScene();
            }
            g_pDEV->Present(NULL,NULL,NULL,NULL);
        }
        
  6. 描画環境の設定です。
    timeGetTime() で時刻を取得してテクスチャ座標をスクロールします。
    テクスチャ座標は左上が 0, 0 で、右下が 1.0, 1.0 です。
        void  SetupMatrices(void)
        {   D3DXMATRIX      matView;
            D3DXMATRIX      matProj;
            DWORD           tim;
            float           ofst;
    
            tim= timeGetTime();
            ofst= (float)(tim%50000)/50000.0f;
            vtx[0].tu=vtx[2].tu= ofst;
            vtx[0].tv=vtx[1].tv= 1.0f-ofst;
            vtx[1].tu=vtx[3].tu= vtx[0].tu+1.0f;
            vtx[2].tv=vtx[3].tv= vtx[0].tv+1.0f;
            //View 座標の設定
            D3DXMatrixLookAtLH(&matView,&ViewForm,&tergForm,&D3DXVECTOR3(0.0f,-1.0f,0.0f));
            g_pDEV->SetTransform(D3DTS_VIEW,&matView);
            //透視変換の設定
            D3DXMatrixPerspectiveFovLH(&matProj,D3DX_PI/4,1.0f,0.0f,100.0f);
            g_pDEV->SetTransform(D3DTS_PROJECTION,&matProj);
            //環境の設定
            g_pDEV->SetRenderState(D3DRS_ZENABLE,D3DZB_FALSE);
            g_pDEV->SetRenderState(D3DRS_LIGHTING,FALSE);
            g_pDEV->SetTexture(0,g_pTexture);
            g_pDEV->SetTextureStageState(0,D3DTSS_COLOROP,  D3DTOP_MODULATE);
            g_pDEV->SetTextureStageState(0,D3DTSS_COLORARG1,D3DTA_TEXTURE);
            g_pDEV->SetTextureStageState(0,D3DTSS_COLORARG2,D3DTA_DIFFUSE);
        }
        
  7. WinMain() では、timeGetTime() で背景画像をスクロールするので、メッセージループの中から描画関数を呼びます。
  8. CALLBACK 関数では DirectX の一般的な処理を行います。
    ESCAPEキーまたは F12キーを押すと終了します。

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

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

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

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