DirectX EmptyProjectを使う その1 This sample is a bare-bones Direct3D application provided as a
convenient starting point for your own project. This sample uses DXUT to initialize and run a basic Direct3D
application. Functions are included as stubs with implementation left for
the user. The library supports drawing colored line strips with the
following line features, each of which is independent of any other: これを使って、lineを描くには、以下の 青の部分が必要です。 //p_Line->SetWidth(5.0f); V( pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET |
D3DCLEAR_ZBUFFER, D3DCOLOR_ARGB(0, 45, 50, 170), 1.0f, 0)
); WCHAR str[120]; // Render the scene
p_Line->Begin(); V( pd3dDevice->EndScene()
); for(i=0;i<200;i++) V_RETURN(g_DialogResourceManager.OnCreateDevice(pd3dDevice)); pSprite->Begin(D3DXSPRITE_ALPHABLEND |
D3DXSPRITE_DONOTSAVESTATE); ............................................................. SAFE_RELEASE(pSprite);
1. EmptyProject
DirectXのsample EmptyProjectは、大変シンプルな、DirectXのフレームワークです。
Sample Overview
How the Sample Works
サンプルフレームワークと、呼ばれています。( 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
void CALLBACK
OnFrameRender( IDirect3DDevice9* pd3dDevice, double fTime, float
fElapsedTime, void* pUserContext )
{
HRESULT
hr;
LPD3DXLINE
p_Line;
D3DXCreateLine(pd3dDevice,&p_Line);
V( pd3dDevice->Clear(1, &myRect,
D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_ARGB(255, 0, 0, 0), 1.0f, 0)
);
StringCchPrintf( str,120 , L" %.2f fps",DXUTGetFPS()
);
g_TEXT.GetStatic(IDC_STATIC_TEXT)->SetText(str
);
if(
SUCCEEDED( pd3dDevice->BeginScene() ) )
{
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) );
}
SAFE_RELEASE(p_Line);
}
試しに Lineの配列を作って、描いてみますと
//D3DXVECTOR2
g_vector[200];
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(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->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(pTexture);
}
えらい太ったtigerですね...
んで、最後は、
今までの成果を、合成しました。
tigerの絵は、α値を変えて、少し透明にしてあります。
全画面に表示、できますが、
まだ、縦横比等、設定してませんので、絶対座標になって、間が抜けています。
次回を、お楽しみに
H.19.4.26