Lekcija 7: Fullscreen i fontovi u DirectXu
Postizanje rada u fullscreen modu u directXu ne predstavlja nikakav problem, no dobro je znati par svari koje će riješiti neke najčešće probleme kod širenja prozora na fullscreen. Kao prvo potrebno je kreirati prozor na nešto drugačiji način, tako da je nemoguće izači iz tog prozora pritiskom miša na rub prozora ili slično. Prozor se kreira sada pomoću CreateWinowEx funkcije i to kao najgornji prozor što spriječava navedeno iskakanje pozadine ispred D3D prozora. Također je potrebno maknuti miša, pošto ćemo sami definirati i crtati svoj pokazivač. Ovo se obavlja u WinProc funkciji.
Kreiranje najgornjeg prozora:
|
//Stvori prozor klase wc -- topmost HWND hWnd = CreateWindowEx(WS_EX_TOPMOST, "D3D Aplikacija", "Sedma D3D Aplikacija", WS_VISIBLE|WS_POPUP, 0,0,0,0, NULL, NULL, hInst, NULL); |
Uklanjanje windows pokazivača za miša:
|
LRESULT WINAPI WinProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_SETCURSOR: SetCursor(NULL);//netreba nam kursor return 0; . . . |
U CScene klasi promjenjena je d3dpp struktura, time što su podešene još tri vrijednosti, te što je podešen format pozadinskog spremnika. Ove parametre potrebno je postaviti da bi DirectX znao na koji način otvoriti fullscreen mod.
|
//iduce linije služe za podešavanje fullscreen moda d3dpp.AutoDepthStencilFormat = D3DFMT_D32;//Format boje za racunanje dubine d3dpp.BackBufferFormat = D3DFMT_R5G6B5;//format BackBuffera d3dpp.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT; d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_ONE; d3dpp.BackBufferWidth=800; d3dpp.BackBufferHeight=600; |
U CPloha klasi promjenjena je samo Rotate metoda koja sada može rotirati plohu oko bilo koje osi, a kreiranje pojedinih ploha izvedeno je tako da je svaka ploha slučajno zarotirana oko sve tri osi.
Kreiranje ploha:
|
if(CDInput::MouseLeft) { CPloha *Ploha=new CPloha(D3DDevice,20.,20., D3DCOLOR_XRGB(rand()*255/RAND_MAX,rand()*255/RAND_MAX, rand()*255/RAND_MAX)); plohe.push_back(Ploha); Ploha->Rotate((float)rand()*2*D3DX_PI/RAND_MAX, (float)rand()*2*D3DX_PI/RAND_MAX, (float)rand()*2*D3DX_PI/RAND_MAX); Ploha->MoveTo(CDInput::MouseX,CDInput::MouseY,1.0); } |
Da bi mogli jednostavno ispisati tekst i podatke o toku programa u program je su stavljene datoteke koje podržavaju DirectX fontove. Osnova funkcioniranja fontova je HFONT klasa koja je dio Windowsa, te ID3DFont interface. Pri kreiranju fonta, potrebno je prvo kreirati windows font, a tek zatim directX font. Ovo se obavlja u konstruktoru CFont klase.
|
CFont::CFont(LPDIRECT3DDEVICE9 pD3DDevice, LPSTR pFontFace, int nHeight, bool fBold, bool fItalic, bool fUnderlined) { HFONT hFont; m_pD3DDevice = pD3DDevice;
int nWeight = FW_NORMAL; DWORD dwItalic = 0; DWORD dwUnderlined = 0; if(fBold) { nWeight = FW_BOLD; } if(fItalic) { dwItalic = 1; } if(fUnderlined) { dwUnderlined = 1; } hFont = CreateFont(nHeight, 0, 0, 0, nWeight, dwItalic, dwUnderlined, 0, ANSI_CHARSET, 0, 0, 0, 0, pFontFace);
D3DXCreateFont(m_pD3DDevice, hFont, &m_pFont); } |
Crtanje fonta na monitor zahtjeva podešavanje pogleda na ortogonalnu projekciju. Ortogonalna projekcija koristi se kod crtanja 2D dijelova scene, kao što su razne tipke, dijalozi itd. U tu svrhu u CScene klasu dodana je metoda Setup2DCamera nakon koje se ispisuju svi podaci. Ispis stringa može se izvesti DrawText metodom ili printf metodom koje su obje unutar CFont klase (ne mješati printf i CFont->printf).
Unutar podešavanja 2D pogleda, view matrica se postavlja na jediničnu, a projekcijska kamera se podešava ne ortogonalnu projekciju. Matrica ortogonalne projekcije računa se pomoću D3DXMatrixOrthoLH metode (lijevi koordinatni sustav).
|
HRESULT CScene::Setup2DCamera() { D3DXMATRIXA16 matView; //podešavanje view matrice na jedniničnu D3DXMatrixIdentity( &matView ); D3DDevice->SetTransform( D3DTS_VIEW, &matView ); D3DXMATRIXA16 matProj;//podešavanje matrice ortogonalne projekcije D3DXMatrixOrthoLH( &matProj, ScreenWidth, ScreenHeight, 1.0f, 5000.0f ); D3DDevice->SetTransform( D3DTS_PROJECTION, &matProj );
return S_OK; } |
Font se inicijalizira u InicijalizirajObjekte metodi, i koristi se u Render metodi nakon poziva Setup2DCamera metode. Fontovi se ne moraju crtati samo u 2D modu, već mogu i u 3D modu. Preveliki broj ispisa u isto vrijeme znatno će usporiti program, stoga pokušajte koristiti što je manje moguće neprestanog osvježavanja teksta.
U CFont::printf metodi koristi se varijabilni broj parametara u funkciji. Ovo je vrlo pogodno kod raznih formatiranih ispisa, bilo na monitor, u datoteku ili negdje drugdje. Blok varijabilnog broja argumenata započinje makroom va_startkoji sprema list argumenata u varijablu tipa va_list argList koja se kasnije predaje vsprintf funkciji. Cijeli blok završava sa va_end makoom.
|
void CFont::printf(float xs,float ys,char *format, ...) { char tmp[500]; va_list argList; //započni blok sa varijabilnim brojem parametara va_start(argList, format); vsprintf(tmp, format, argList);//zapiši sve u jedan string DrawText(tmp,xs,ys,D3DCOLOR_XRGB(255,255,255));//ispiši string tmp na monitor //završi blok sa varijablinim brojem parametara va_end(argList); } |
Izgled sedme aplikacije

Made by: Mll