DirectX9 : Eclipse + CDT + MinGW
W ostatnim wpisie było o SDL i poniekąd o OpenGL (OGL), więc dla równowagi coś dla “panującego standardu”, oczywiście z wykorzystaniem Eclipse, CDT i MinGW. Tak naprawdę nie wysiliłem się za bardzo, ponieważ wziąłem przykładowy kod aplikacji DX z template’a dołączonego do Code::Blocks.
Zaczynamy standardowo od stworzenie projektu “pustej” aplikacji c++ w Eclipse. Zakładam, że Eclipse jest skonfigurowane do pracy z CDT i toolchain’em MinGW (jeśli nie to odsyłam do poprzednich wpisów).
Tym razem wprowadzanych ustawień będzie bardzo mało, ponieważ dodamy tylko jedną bibliotekę statyczną d3d9 – wynika to z faktu, że prezentowany przykład jest bardzo prosty.
Czas najwyższy na podanie kodu aplikacji:
#include <d3d9.h> LPDIRECT3D9 pD3D9 = NULL; LPDIRECT3DDEVICE9 pD3D9Device = NULL; HRESULT InitialiseD3D(HWND hWnd) { // First of all, create the main D3D object. If it is created successfully // we should get a pointer to an IDirect3D8 interface. pD3D9 = Direct3DCreate9( D3D_SDK_VERSION ); if ( !pD3D9 ) { MessageBox( 0, "Direct3DCreate9() - Failed", 0, 0 ); return 0; } //Get the current display mode D3DDISPLAYMODE d3ddm; if(FAILED(pD3D9->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &d3ddm))) { return E_FAIL; } D3DPRESENT_PARAMETERS D3Dpp; ZeroMemory( &D3Dpp, sizeof(D3Dpp) ); D3Dpp.Windowed = TRUE; D3Dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; if ( FAILED( pD3D9->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &D3Dpp, &pD3D9Device ) ) ) { MessageBox( 0, "CreateDevice() - Failed", 0, 0 ); if(pD3D9 != NULL) { pD3D9->Release(); pD3D9 = NULL; } return 0; } return S_OK; } void Render() { if(pD3D9Device == NULL) { return; } // Clear the backbuffer to blue pD3D9Device->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 255), 1.0f, 0); // Begin the scene pD3D9Device->BeginScene(); // Fill in here the rendering of other objects // End the scene pD3D9Device->EndScene(); // Fill back and front buffers so that back buffer will be visible on screen pD3D9Device->Present(NULL, NULL, NULL, NULL); } void CleanUp() { if(pD3D9Device != NULL) { pD3D9Device->Release(); pD3D9Device = NULL; } if(pD3D9 != NULL) { pD3D9->Release(); pD3D9 = NULL; } } void MainLoop() { // Enter the main loop MSG msg; BOOL bMessage; PeekMessage(&msg, NULL, 0U, 0U, PM_NOREMOVE); while(msg.message != WM_QUIT) { bMessage = PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE); if(bMessage) { // Process message TranslateMessage(&msg); DispatchMessage(&msg); } else { Render(); // No message to process -> render the scene } }// while } // The windows message handler LRESULT WINAPI WinProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch(msg) { case WM_DESTROY: PostQuitMessage(0); return 0; break; case WM_KEYUP: switch (wParam) { case VK_ESCAPE: // Escape key pressed -> exit DestroyWindow(hWnd); return 0; break; } break; }// switch return DefWindowProc(hWnd, msg, wParam, lParam); } // Application main entry point INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, INT) { //Register the window class WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, WinProc, 0L, 0L, GetModuleHandle(NULL), NULL, NULL, NULL, NULL, "DirectX Project", NULL }; RegisterClassEx(&wc); // Create the application's main window HWND hWnd = CreateWindow("DirectX Project", "DirectX9 APP : Eclipse + CDT + MinGW", WS_OVERLAPPEDWINDOW, 50, 50, 500, 500, GetDesktopWindow(), NULL, wc.hInstance, NULL); // Initialize Direct3D if(SUCCEEDED(InitialiseD3D(hWnd))) { // Show window ShowWindow(hWnd, SW_SHOWDEFAULT); UpdateWindow(hWnd); //Start game running: Enter the game loop MainLoop(); } CleanUp(); UnregisterClass("DirectX Project", wc.hInstance); return 0; }
Efektem będzie okienko wypełnione kolorem niebieskim. Aż się prosi aby uzupełnić metodę Render() o dowolne efekty..
Brak komentarzy.

