TEXT 文字をスクロールする

Back Buffer を取得して、3Dモデルの上から TEXT 文字をスクロールしながら表示します。

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

プログラムの説明

  1. #define と #include と Direct3D の領域です。
    myd3d が MyD3D Object Class の定義です。
    hFont2 に画面に表示する文字フォントを設定します。
    M_2 がスクロールを制御する変数で、800を設定するとスクロールが始まります。
    msg1[][48] が表示するメッセージです。
        #include    "MyD3D.h"
    
        //Global Area
        MyD3D                   *myd3d           = NULL;    // MyD3D Object Class
        HWND                    g_hWnd           = NULL;
        LPDIRECT3DDEVICE9       g_pDEV           = NULL;
        LPD3DXMESH              g_pMesh          = NULL;
        bool                    g_bActive        = false;   // アクティブ状態
        LPDIRECT3DSURFACE9      g_pBackBuffer    = NULL;    // Back Buffer Surface
        D3DXVECTOR3             ViewForm(0.0f,0.0f,-5.0f);
        HFONT                   hFont2,hFontOld;
        int                     M_2= 0;          // TEXT Scroll Line 800 → 0(6Line * 40)
        char    msg1[][48] =
        { "宇宙暦○△□×、宇宙連合とクリンゴンは1000",
          "年間に渡り宇宙の覇権争いを続けていた。",
          "近年宇宙連合の劣勢は覆いがたく、このまま行けば",
          "クリンゴンに征服される日も近い。",
          "そこで起死回生の秘策として温存されていた宇宙船",
          "エンタープライズを出動させることにした。"
        };
        
  2. Direct Graphics の初期化です。
    Object Class をインスタンス化して、DirectX のインターフェースを取得します。
    ティーポットのメッシュを生成します。
    GetBackBuffer() で Back Buffer を取得します。
    SetMyFont() で文字フォントを設定します。
        HRESULT InitGraphics(void)
        {   HRESULT hr;
    
            myd3d= new MyD3D(g_hWnd);
            myd3d->InitD3D(&g_pDEV);
            //ティーポットの生成
            D3DXCreateTeapot(g_pDEV,&g_pMesh,NULL);
            //Back Buffer を取得
            hr= g_pDEV->GetBackBuffer(0,0,D3DBACKBUFFER_TYPE_MONO,&g_pBackBuffer);
            if (FAILED(hr))
            {   MessageBox(NULL,"GetBackBuffer Error","Error Message", MB_OK);
                return E_FAIL;
            }
            hFont2= myd3d->SetMyFont((LPCTSTR)"MS ゴシック", 32, 0);
            return  S_OK;
        }
        
  3. 描画処理のソースコードです。
    Clear() で画面をクリアしてティーポットを表示します。
    M_2>0 のときスクロールしながら文字を表示します。
    M_2 の値から6行分のメッセージを表示する位置(スクロール座標)を計算します。
        void Draw(void)
        {   HDC         hDC;
            HRESULT     hr;
            int         i;
    
            g_pDEV->Clear(0,NULL,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,D3DCOLOR_XRGB(0,50,30),1.0f,0);
            if (SUCCEEDED(g_pDEV->BeginScene()))
            {   g_pDEV->BeginScene();
                SetupMatrices();
                g_pMesh->DrawSubset(0);
                g_pDEV->EndScene();
            }
            //Scroll しながら TEXT を表示
            if (M_2>0)
            {
                M_2-= 2;
                if (g_pBackBuffer!=NULL)
                {
                    hr= g_pBackBuffer->GetDC(&hDC);
                    if (!FAILED(hr))
                    {   SetTextColor(hDC,RGB(255,115,0));
                        SetBkMode(hDC,TRANSPARENT);
                        hFontOld= (HFONT)SelectObject(hDC, hFont2);
                        for(i=0; i<6; i++)
                            TextOut(hDC,20,(M_2-240)+i*40,msg1[i],sizeof(msg1[i]));
                        SelectObject(hDC, hFontOld);
                        g_pBackBuffer->ReleaseDC(hDC);
                    }
                    else    MessageBox(NULL,"GetDC Error","Error Message", MB_OK);
                }
            }
            g_pDEV->Present(NULL,NULL,NULL,NULL);
        }
        
  4. CALLBACK 関数です。
    Enter キーがタイプされるとスクロールを開始します。
        LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,UINT wParam,LONG lParam)
        {
                       :
                case WM_KEYDOWN:
                    switch(wParam)
                    {   case VK_ESCAPE:     // [ESCAPE]キーでウインドウを閉じる
                            PostMessage(hWnd,WM_CLOSE,0,0);
                            break;
                        case VK_RETURN:     //Enter キーで Scroll 開始
                            M_2= 800;
                            break;
                    }
                    break;
        
  5. 描画環境を設定する関数では、タイマを取得してY軸を中心に回転しています。
        void  SetupMatrices(void)
        {   RECT            rect;
            D3DXMATRIX      matWorld;
            D3DXMATRIX      matView;
            D3DXMATRIX      matProj;
    
            GetClientRect(g_hWnd,&rect);
            //World 座標をY軸を中心に自動回転
            D3DXMatrixRotationY(&matWorld,timeGetTime()/5000.0f);
            g_pDEV->SetTransform(D3DTS_WORLD,&matWorld);
            //View 座標の設定
            D3DXMatrixLookAtLH(&matView,&ViewForm,
                               &D3DXVECTOR3(0.0f,0.0f,0.0f),&D3DXVECTOR3(0.0f,1.0f,0.0f));
            g_pDEV->SetTransform(D3DTS_VIEW,&matView);
            //透視変換の設定
            D3DXMatrixPerspectiveFovLH(&matProj,D3DXToRadian(45.0f),(float)rect.right/(float)rect.bottom,1,100);
            g_pDEV->SetTransform(D3DTS_PROJECTION,&matProj);
            //Material と Light の設定
            myd3d->SetMaterial(0.6f,0.3f,0.8f);
            myd3d->SetLight();
        }
        
  6. オブジェクトを開放する処理です。
    文字 Font や Back Buffer も開放して下さい。
        void Cleanup(void)
        {
            DeleteObject(hFont2);
            SAFE_RELEASE(g_pBackBuffer);
            SAFE_RELEASE(g_pMesh);
            SAFE_DELETE(myd3d);
        }
        

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

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

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

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