12 강. 문자출력 Direct3D 에서는문자를출력하기위해서 LPD3DXFONT 객체를사용한다. 12.1 LPD3DXFONT 객체생성과초기화 LPD3DXFONT 객체를생성하고초기화하는함수로 D3DXCreateFont() 가있다. HRESULT D3DXCreateFont( in LPDIRECT3DDEVICE9 pdevice, in INT Height, in UINT Width, in UINT Weight, in UINT MipLevels, in BOOL Italic, in DWORD CharSet, in DWORD OutputPrecision, in DWORD Quality, in DWORD PitchAndFamily, in LPCTSTR pfacename, out LPD3DXFONT *ppfont ); [ 표 12-1] Font 생성함수 Height와 Width는글자의가로세로길이이며 Weight는글자의굵기를결정하는매개변수이 다. Weight에설정하는값은 WinGDI.h 헤더에있으며그기본값은 FW_NORMAL이다. #define FW_THIN 100 #define FW_EXTRALIGHT 200 #define FW_LIGHT 300 #define FW_NORMAL 400 #define FW_MEDIUM 500 #define FW_SEMIBOLD 600 #define FW_BOLD 700 #define FW_EXTRABOLD 800 #define FW_HEAVY 900 #define FW_ULTRALIGHT #define FW_REGULAR #define FW_DEMIBOLD #define FW_ULTRABOLD #define FW_BLACK FW_EXTRALIGHT FW_NORMAL FW_SEMIBOLD FW_EXTRABOLD FW_HEAVY [ 표 12-2] WinGDI.h 헤더 - 1 -
MipLevels에는기본값인 1을설정하며 Italic에는이텔릭체를사용할것인지의여부를설정하며여기에는일반적으로 FALSE를설정한다. 그외에는기본값을설정하면되며 CharSet에는 DEFAULT_CHARSET을설정하며 OutputPrecision에는 OUT_DEFAULT_PRECIS으로설정한다. 그리고 Quality에는 DEFAULT_QUALITY를 PitchAndFamily에는 DEFAULT_PITCH FF_DONTCARE를설정한다. pfacename에는글자체를설정하는데 "Arial" 또는 System 등을설정한다. 여기까지설명한폰트의설정값을셋팅하여 D3DXCreateFont() 함수를호출하면다음과같다. LPD3DXFONT Font;... 생략... D3DXCreateFont( m_pd3ddevice, 20, 0, FW_NORMAL, 1, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH FF_DONTCARE, "Arial", &Font ); [ 표 12-3] 12.2 출력 글자를출력해주는 LPD3DXFONT 객체의멤버함수에는 DrawText() 가있으며그원형은다음과 같다. INT DrawText( [in] LPD3DXSPRITE psprite, [in] LPCTSTR pstring, [in] INT Count, [in] LPRECT prect, [in] DWORD Format, [in] D3DCOLOR Color ); [ 표 12-4] 출력함수 psprite에는 NULL을설정하고 pstring에는출력하려는문자열을설정한다. Count에는 1을설정하며널문자까지를출력하게된다. prect에는출력하려는위치를설정하는데 left와 top 값을설정하면되며나머지는 0으로설정한다. Format에는문자의정렬에관련된값을설정하는데 DT_NOCLIP을설정한다. Color에는출력할색상값을설정하며색상값은 D3DXCOLOR() 를이용하여설정한다. 색상값의범위는 0.0 ~ 1.0f 까지면그원형은다음과같다. D3DXCOLOR( FLOAT r, FLOAT g, FLOAT b, FLOAT a ); - 2 -
출력함수를설정하면다음과같다. RECT rt; SetRect( &rt, 100, 430, 0, 0 ); Font->DrawText( NULL, "Test", -1, &rt, DT_NOCLIP, D3DXCOLOR( 1.0f, 1.0f, 0.0f, 1.0f ) ); 12.3 FPS 출력 FPS(Frame Per Second) 는 1초에화면전환이몇번일어났는가를측정한값을말한다. 그래서 FPS로게임엔진의렌더링성능을평가하는경향이있으며게임엔진의개발초기에는항상 FPS를출력하면서프로그래밍을한다. 컴퓨터에서는초단위가아닌밀리세컨드단위로시간값을가져오므로 1초는 1000 밀리세컨드가되며경과된시간이 1초인지를알수있는방법은현재시각과이전시각의차를이용하거나매프레임마다경과된시간을누적하여판단하는방법등이있다. 아래의소스는매프레임마다경과된시간을누적하여판단하는소스이다. void CGameEdu01::OnInit() int i; RECT rect; D3DVIEWPORT9 vp; GetClientRect( m_hwnd, &rect ); vp.x = 0; vp.y = 0; vp.width = rect.right - rect.left; vp.height = rect.bottom - rect.top; vp.minz = 0.0f; vp.maxz = 1.0f; m_eye.x = 0.0f; m_eye.y = 10.0f; m_eye.z =-32.0f; m_at.x = 0.0f; m_at.y = 0.0f; m_at.z = 0.0f; m_up.x = 0.0f; m_up.y = 1.0f; - 3 -
m_up.z = 0.0f; D3DXMatrixLookAtLH( &m_matview, &m_eye, &m_at, &m_up ); m_pd3ddevice->settransform( D3DTS_VIEW, &m_matview ); D3DXMatrixPerspectiveFovLH( &m_matproj, D3DX_PI / 4, 1.0f, 1.0f, 100.0f ); m_pd3ddevice->settransform( D3DTS_PROJECTION, &m_matproj ); m_pd3ddevice->setviewport( &vp ); D3DXCreateFont( m_pd3ddevice, 20, 0, FW_NORMAL, 1, FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH FF_DONTCARE, "System", &m_pfont ); void CGameEdu01::OnRender() char string[100]; RECT rt = 10, 10, 0, 0 ; sprintf( string, "FPS: %d", m_nfps ); m_pfont->drawtext( NULL, string, -1, &rt, DT_NOCLIP, D3DXCOLOR( 1.0f, 1.0f, 0.0f, 1.0f ) ); m_nfpscount++; void CGameEdu01::OnUpdate() DWORD dwcurtime = GetTickCount(); static DWORD dwoldtime = GetTickCount(); static DWORD dwaccumulatetime = 0; // 누적경과시간 m_dwelapsedtime = dwcurtime dwoldtime; // 프레임경과시간 dwoldtime = dwcurtime; dwaccumulatetime += m_dwelapsedtime; // 누적 if( dwaccumulatetime >= 1000 ) // 1초경과체크 dwaccumulatetime = 0; m_nfps = m_nfpscount; m_nfpscount = 0; void CGameEdu01::OnRelease() - 4 -
m_pfont->release(); - 5 -