Zenedith's dev blog

Dałem się namówić.., szatanowi chyba..

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..

3 sierpień, 2008 - Opublikował/a zenedith | cpp, game | , , | Nie ma jeszcze komentarzy

Brak komentarzy.

Dodaj komentarz