DirectX EmptyProjectを使う その1


 

     1. EmptyProject    
 
      DirectXのsample EmptyProjectは、大変シンプルな、DirectXのフレームワークです。

    Sample Overview

        This sample is a bare-bones Direct3D application provided as a convenient starting point for your own project.

    How the Sample Works

       This sample uses DXUT to initialize and run a basic Direct3D application. Functions are included as stubs with implementation left for the user.

       ( DirectX SDK document から 抜粋 )

      サンプルフレームワークと、呼ばれています。( DirectX9 DirectX Graphics 工学社 IO BOOKS )

      gui機能も備えていて、各種コールバック関数も、予め、作られています。

 

 

 2. Buttonの色と、Textの色を変える
 
      
      Button 等を、この画面に配置するには、CDXUTDialog クラスのダイアログを配置し、

      そのダイアログの中に、各種guiを配置するように、なっています。

      んで、そのダイアログを管理するのが CDXUTDialogResourceManagerクラスです。

       CDXUTDialog     g_HUD;                   // dialog for standard controls
       CDXUTDialog     g_TEXT;
       CDXUTDialogResourceManager g_DialogResourceManager; // manager for shared resources of dialogs


           注意! CDXUTDialog を利用するには、DXUTgui.h 及び DXUTgui.cpp  が必要ですが、

     EmptyProjectをinstallした時に、これらが入って無い時は、以下のDirectoryの DXUTgui.* を

     your project のcommon folderに、加えて下さい。

          

     
      DO NOT INSTALL DXUTgui.*  in a folder below
        C:\Program Files\Microsoft DirectX SDK (February 2007)\Samples\C++\DXUT\Optional





      Buttonの defaultの色は、決められていますが、この色を変える事ができるのを、発見しました。

      大して、意味があるとは、思えませんが....(^_^;

 
mouseがbuttonの上にある時と、無い時

      変え方:

        Buttonには、3state があります。

        mouseが、Buttonの上にある時、無い時、Buttonが押された時 の、3つの状態です。

        この 各 3stateについて、全て設定してやれば、全ての状態を制御できます。

         enum DXUT_CONTROL_STATE
         {
            DXUT_STATE_NORMAL = 0,
            DXUT_STATE_DISABLED,
            DXUT_STATE_HIDDEN,
            DXUT_STATE_FOCUS,
            DXUT_STATE_MOUSEOVER,
            DXUT_STATE_PRESSED,
         }; ( dxutgui.h )

               Buttonの場合は、青色のstateが、関係します。

       void CDXUTDialog::InitDefaultElements()の中に、ヒントが、ありました。( DXUTgui.cpp )

         //-------------------------------------
         // CDXUTButton - Button
         //-------------------------------------
          SetRect( &rcTexture, 0, 0, 136, 54 );
          Element.SetTexture( 0, &rcTexture );
          Element.SetFont( 0 );
          Element.TextureColor.States[ DXUT_STATE_NORMAL ] = D3DCOLOR_ARGB(150, 255, 255, 255);
          Element.TextureColor.States[ DXUT_STATE_PRESSED ] = D3DCOLOR_ARGB(200, 255, 255, 255);
          Element.FontColor.States[ DXUT_STATE_MOUSEOVER ] = D3DCOLOR_ARGB(255, 0, 0, 0);
   
        // Assign the Element
          SetDefaultElement( DXUT_CONTROL_BUTTON, 0, &Element );

 
      これを真似て、

       g_HUD.GetControl(IDC_TOGGLEFULLSCREEN)->GetElement(1)->TextureColor.States[ DXUT_STATE_NORMAL ] =D3DCOLOR_ARGB(255,255,255,0);
       g_HUD.GetControl(IDC_TOGGLEFULLSCREEN)->GetElement(1)->TextureColor.States[ DXUT_STATE_MOUSEOVER ] = D3DCOLOR_ARGB(255, 255, 0, 0);
       g_HUD.GetControl(IDC_TOGGLEFULLSCREEN)->GetElement(1)->FontColor.States[ DXUT_STATE_NORMAL ]=D3DCOLOR_ARGB(255,255,0,0);

     これで、うまく動作いたしました。

     他のButtonの設定も、これで OK

       g_HUD.GetControl(IDC_MYBUTTON)->GetElement(1)->SetFont(1,D3DCOLOR_ARGB(255,255,255,0));
       g_HUD.GetControl(IDC_MYBUTTON)->GetElement(1)->TextureColor.States[ DXUT_STATE_NORMAL ] =D3DCOLOR_ARGB(255,125,125,0);
       g_HUD.GetControl(IDC_MYBUTTON)->GetElement(1)->TextureColor.States[ DXUT_STATE_MOUSEOVER ] = D3DCOLOR_ARGB(255, 255, 255, 0);
 
     解らんのは、 GetElement(1) と、1を指定しないと、動作しない事です。  zero は、defaultで使用されているから、でしょうが....意味不明

  

  3. Lineを描くには ?

     以前、C#で、DirectXを使って、スペアナ ( spectrum analyzer )を作った時は、頂点を作って、

     要らぬ z軸の座標も書いていたのですが、

     便利な機能を見つけました、ID3DXLine

   Functionality Description

     The library supports drawing colored line strips with the following line features, each of which is independent of any other:

  •   Line width
  •   Line pattern with repetition (the line pattern counter resets with each ID3DXLine::Draw or ID3DXLine::DrawTransform call. It does not reset with each segment of the line     strip.)
  •   Antialiasing
  • OpenGL-style lines

     これを使って、lineを描くには、以下の 青の部分が必要です。

void CALLBACK OnFrameRender( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext )
{
    HRESULT hr;
   LPD3DXLINE  p_Line;
   D3DXCreateLine(pd3dDevice,&p_Line);

  //p_Line->SetWidth(5.0f);

    V( pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_ARGB(0, 45, 50, 170), 1.0f, 0) );
    V( pd3dDevice->Clear(1, &myRect, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_ARGB(255, 0, 0, 0), 1.0f, 0) );

    WCHAR str[120];
    StringCchPrintf( str,120 , L" %.2f fps",DXUTGetFPS() );
    g_TEXT.GetStatic(IDC_STATIC_TEXT)->SetText(str );

     // Render the scene
    if( SUCCEEDED( pd3dDevice->BeginScene() ) )
    {

       p_Line->Begin();
       p_Line-> Draw(g_vector,200,D3DCOLOR_ARGB(255,255,255,255));
       p_Line->End();
  
  V(g_HUD.OnRender(fElapsedTime) );
  V(g_TEXT.OnRender(fElapsedTime) );

        V( pd3dDevice->EndScene() );
    }
 SAFE_RELEASE(p_Line);
}
      試しに Lineの配列を作って、描いてみますと

    //D3DXVECTOR2 g_vector[200]; 

     for(i=0;i<200;i++)
      g_vector[i]=D3DXVECTOR2( (float)(i+100), (float)(200-100*sin(2*pi*i/100)  );

    

 
fpsの値は、気にしないで下さい (本当は、VSYNCの値、60です)

 

     簡単で、ええわ...  こんなん、大好き。

  3. Textureも、貼り付けて見たい...

 
     Spriteに、Textureを、貼り付ける必要が、あります。

      LPD3DXSPRITE     pSprite;
      LPDIRECT3DTEXTURE9 pTexture;

     と、宣言しておいて

     HRESULT CALLBACK OnCreateDevice( IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext )
     {
       HRESULT hr;

       V_RETURN(g_DialogResourceManager.OnCreateDevice(pd3dDevice));
 
       V_RETURN(D3DXCreateSprite(pd3dDevice,&pSprite));
       V_RETURN(D3DXCreateTextureFromFile(pd3dDevice,L"tiger.dds",&pTexture));
 
        return S_OK;
}

void CALLBACK OnFrameRender( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext )
{
    HRESULT hr;
.  ............................................................ 
    
  // Render the scene
    if( SUCCEEDED( pd3dDevice->BeginScene() ) )
    {

      pSprite->Begin(D3DXSPRITE_ALPHABLEND | D3DXSPRITE_DONOTSAVESTATE);
     pSprite->Draw(pTexture,NULL,NULL,&pos,D3DCOLOR_ARGB(128,255,255,255));
     pSprite->End();

    .............................................................  
        V( pd3dDevice->EndScene() );
    }
 }

   最後に

  void CALLBACK OnDestroyDevice( void* pUserContext )
  {
    g_DialogResourceManager.OnDestroyDevice();

    SAFE_RELEASE(pSprite);
    SAFE_RELEASE(pTexture);
  }

 
えらい太ったtigerですね...

 
     んで、最後は、

     今までの成果を、合成しました。


tigerの絵は、α値を変えて、少し透明にしてあります。 

 
      全画面に表示、できますが、

   まだ、縦横比等、設定してませんので、絶対座標になって、間が抜けています。


  次回を、お楽しみに
 
  H.19.4.26