TEXT を表示する

Sprite を使って TEXT 文字を表示します。

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

事前の準備

  1. 次のプログラムをダブルクリックで起動して実行を確認して下さい。
    Program Files\Microsoft DirectX 9.0 SDK (April 2005)\Samples\C++\Direct3D\Bin\x86\EmptyProject.exe
  2. プログラムの実行が確認できると、ビルドのテストを行います。
    次のフォルダーに格納されているプログラムをビルドして、実行を確認して下さい。
    プロジェクトのフォルダーに格納されている次のどちらかをダブルクリックして .NET を立ち上げます。
    書き込み禁止が設定されているときは解除して下さい。
    Program Files\Microsoft DirectX 9.0 SDK (April 2005)\Samples\C++\Direct3D\EmptyProject\EmptyProject_2002.vcproj
    Program Files\Microsoft DirectX 9.0 SDK (April 2005)\Samples\C++\Direct3D\EmptyProject\EmptyProject_2003.vcproj
  3. ビルドのテストが終わるとプロジェクトの作成です。
    Microsoft DirectX 9.0 SDK (April 2005) では Common のフォルダーに格納されているソースファイルを直接プロジェクトに組み込みます。
    Common のフォルダーは、これから作成するプロジェクトのフォルダーに対して相対的に指定します。
    例えば dxstdafx.h は、次のように組み込まれています。
    "..\..\Common\dxstdafx.h"
    この関係を維持できるようにプロジェクトのフォルダーを作成しなければなりません。
    私はプロジェクトのフォルダーの親の親に Common のフォルダーを丸ごとコピーして使っています。
  4. プロジェクトのフォルダーと Common のフォルダーの関係は、次のプロジェクトで調べて下さい。
    Program Files\Microsoft DirectX 9.0 SDK (April 2005)\Samples\C++\Direct3D\EmptyProject\
    Program Files\Microsoft DirectX 9.0 SDK (April 2005)\Samples\C++\Common\
  5. Samples の中には Media のフォルダーを相対的に参照しているプロジェクトもあり、異なるフォルダーに移すときは要注意です。
    Media のフォルダーにはサンプルプログラムで使用するXファイルや画像ファイルが格納されています。
    Program Files\Microsoft DirectX 9.0 SDK (April 2005)\Samples\Media\

プロジェクトの作成

  1. Common のフォルダーと相対的な位置関係にある場所に、次のフォルダーをコピーして下さい。
    Program Files\Microsoft DirectX 9.0 SDK (April 2005)\Samples\C++\Direct3D\EmptyProject\
  2. プロジェクトのフォルダーには次のファイルが格納されています。
    EmptyProject.cpp
    EmptyProject.fx
    EmptyProject.jpg
    EmptyProject.manifest
    EmptyProject.rc
    EmptyProject_2002.sln
    EmptyProject_2002.vcproj
    EmptyProject_2003.sln
    EmptyProject_2003.vcproj
    makefile.x64
    resource.h
  3. EmptyProject.cpp をプログラムの説明に従って修正して下さい。
    プロジェクトをビルドして、実行を確認して下さい。
    2002.vcproj または 2003.vcproj のどちらかをダブルクリックして .NET を立ち上げます。
  4. common のフォルダーに置かれている次のファイルがプロジェクトに組み込まれています。
    dxstdafx.h はプリコンパイルヘッダで、ここに格納されている全てのファイルが組み込まれています。
    dxstdafx.cpp はプリコンパイル用のプログラムファイルで、実質的なコードは何も書かれていません。
    directx.ico
    dxstdafx.cpp
    dxstdafx.h
    dxut.cpp
    dxut.h
    dxutenum.cpp
    dxutenum.h
    dxutgui.cpp
    dxutgui.h
    dxutmesh.cpp
    dxutmesh.h
    dxutmisc.cpp
    dxutmisc.h
    dxutsettingsdlg.cpp
    dxutsettingsdlg.h
  5. 次のライブラリがプロジェクトからリンクされています。
    プロジェクト/プロパティ/リンカ/入力から調べて下さい。
    dxerr9.lib
    dxguid.lib
    d3dx9d.lib
    d3d9.lib
    winmm.lib
    comctl32.lib

プロジェクトの名前を変更

  1. April 2005 のプロジェクトは、新規に作成するよりも既存のプロジェクトをコピーして変更する方が現実的でしょう。
    ここではプロジェクト名を変更する方法を説明します。
  2. まずプロジェクトのフォルダー名を変更して下さい。
  3. フォルダーに格納されているファイル名(* の部分)を変更して下さい。
  4. *.vcproj の中で定義されている複数箇所の名前を全て変更して下さい。
  5. resource.rc で定義されている *.manifest の名前を変更して下さい。
  6. *.manifest の中で使われている名前を変更して下さい。
  7. これでプロジェクト名の変更が完了です。
    ビルドして試してみて下さい。

プログラムの説明

  1. dxstdafx.h はプリコンパイルヘッダで、この中で windows.h を始め、DirectX のヘッダが定義されています。
    g_pFont は表示テキストのフォントで、g_pTextSprite はテキストを表示するための Sprite の定義です。
        /*****************************************************/
        /*  Common を使って Text 文字を表示する     前田 稔  */
        /*****************************************************/
        #include "dxstdafx.h"
        #include "resource.h"
    
        // Global variables
        ID3DXFont*              g_pFont = NULL;         // Font for drawing text
        ID3DXSprite*            g_pTextSprite = NULL;   // Sprite for batching draw text calls
        
  2. CALLBACK 関数の宣言です。
    アプリケーションで必要な CALLBACK 関数だけを宣言して下さい。
        // Forward declarations 
        HRESULT CALLBACK OnCreateDevice( IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext );
        HRESULT CALLBACK OnResetDevice( IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext );
        void    CALLBACK OnFrameRender( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext );
        void    CALLBACK OnLostDevice( void* pUserContext );
        void    CALLBACK OnDestroyDevice( void* pUserContext );
        
  3. WinMain で CALLBACK 関数を設定します。
    InitApp() はアプリケーションの初期化ですが、今回はやることがありません。
    DXUTMainLoop() でメッセージループに入ります。
        //★ Win Main
        INT WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int )
        {
            DXUTSetCallbackDeviceCreated( OnCreateDevice );
            DXUTSetCallbackDeviceReset( OnResetDevice );
            DXUTSetCallbackDeviceLost( OnLostDevice );
            DXUTSetCallbackDeviceDestroyed( OnDestroyDevice );
            DXUTSetCallbackFrameRender( OnFrameRender );
    
            // Show the cursor and clip it when in full screen
            DXUTSetCursorSettings( true, true );
    
            InitApp();
    
            // Initialize DXUT and create the desired Win32 window and Direct3D 
            DXUTInit( false, true, true ); // command line, handle the default hotkeys, and show msgboxes
    
            DXUTCreateWindow( L"Text" );
    
            DXUTMainLoop();
    
            return DXUTGetExitCode();
        }
        
  4. DirectX の主要な処理は CALLBACK 関数で行います。
    OnCreateDevice() はデバイスを生成するときに呼ばれます。
    今回は表示するフォントの設定を行います。
    32 がフォントのサイズです。
        HRESULT CALLBACK OnCreateDevice( IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext )
        {
            HRESULT hr;
    
            // Initialize the font
            V_RETURN( D3DXCreateFont( pd3dDevice, 32, 0, FW_BOLD, 1, FALSE, DEFAULT_CHARSET, 
                                 OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, 
                                 L"Arial", &g_pFont ) );
    
            return S_OK;
        }
        
  5. デバイスのリセットです。
    パラメータで IDirect3DDevice9 が渡されて来ます。
    ここでは Sprite やメッシュの生成を行います。
        HRESULT CALLBACK OnResetDevice( IDirect3DDevice9* pd3dDevice, 
                                        const D3DSURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext )
        {
            HRESULT hr;
    
            if( g_pFont )   V_RETURN( g_pFont->OnResetDevice() );
    
            // Create a sprite to help batch calls when drawing many lines of text
            V_RETURN( D3DXCreateSprite( pd3dDevice, &g_pTextSprite ) );
    
            return S_OK;
        }
        
  6. Rendering を行う CALLBACK 関数です。
    今回は Sprite でテキストを表示するだけなので RenderText() を呼んでいます。
        void CALLBACK OnFrameRender( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext )
        {
            HRESULT hr;
    
            // Clear the render target and the zbuffer 
            V( pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_ARGB(0, 45, 50, 170), 1.0f, 0) );
    
            // Render the scene
            if( SUCCEEDED( pd3dDevice->BeginScene() ) )
            {
                RenderText();
                V( pd3dDevice->EndScene() );
            }
        }
        
  7. テキストを表示する RenderText() 関数です。
    32 はテキスト文字のサイズです。
    SetForegroundColor() で文字の色を設定します。
    DXUTGetFrameStats() でフレームのステータスを、DXUTGetDeviceStats() でデバイスのステータスを表示します。
        void RenderText()
        {
            CDXUTTextHelper txtHelper( g_pFont, g_pTextSprite, 32 );
            txtHelper.Begin();
    
            txtHelper.SetInsertionPos( 5, 5 );
            txtHelper.SetForegroundColor( D3DXCOLOR( 1.0f, 1.0f, 0.0f, 1.0f ) );
            txtHelper.DrawTextLine( L"Draw Text Test Program" );
            txtHelper.DrawTextLine( DXUTGetFrameStats() );
            txtHelper.DrawTextLine( DXUTGetDeviceStats() );
    
            txtHelper.End();
        }
        
  8. デバイスが失われたとき(終了時)の処理です。
    OnResetDevice() で割り当てたリソースを開放します。
    フォントをロストして、Sprite を開放しています。
        void CALLBACK OnLostDevice( void* pUserContext )
        {
            if( g_pFont )   g_pFont->OnLostDevice();
            SAFE_RELEASE( g_pTextSprite );
        }
        
  9. プログラムが終了する前の処理です。
    OnCreateDevice() で割り当てたリソースを開放します。
    フォントのリソースを開放しています。
        void CALLBACK OnDestroyDevice( void* pUserContext )
        {
             SAFE_RELEASE( g_pFont );
        }
        
  10. キーの操作です。
    キー 動作
    Alt+Enterフルスクリーン モードとウィンドウ モードを切り替える
    Esc アプリケーションを終了する

【メモ】

余分なファイルが沢山作成されるのですが、DirectX Sample Browser を使って、サンプルプログラムから構築することも出来ます。
  1. [スタート] から [プログラム] [Microsoft DirectX9 9.0 SDK] を選択して [DirectX Sample Browser] を実行して下さい。
  2. [Direct3D] を選んで、ページ先頭の項目をチェックするとサンプルプログラムの一覧が表示されます。
  3. EmptyProject を選んで Install Project をクリックすると、C:\Users(規定値) に新たなプロジェクトが構築されます。
  4. 作成するアプリケーションに合わせて、最適なサンプルを選んで下さい。
    画像による説明が DirectX のサンプルを実行 にあります。

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

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

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

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