Zenedith's dev blog

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

+Netbeans

Czy NetBeans, środowisko programistyczne stworzone przez twórców Javy dla programistów Javy, nadal można tylko w ten sposób postrzegać? ZDECYDOWANIE NIE.

Wystarczy spojrzeć na stronę projektu aby się przekonać, że z bardzo dużym powodzeniem można wykorzystać to IDE do pracy m.in. z Java SE, JavaFX, Java, Ruby, C/C++ oraz PHP.

Co mnie ostatnio bardzo pozytywnie bardzo zaskoczyło, to wykorzystanie NetBeans do PHP – szybkie porównanie z tym, co oferuje Eclipse (+PDT) i muszę przyznać, że jestem pod wrażeniem.

Nie o NetBeans PHP miał być ten wpis, dlatego zaprezentuję teraz jak skonfigurować NetBeans do pracy z cpp.

Potrzebne będą trzy rzeczy:

  1. Kompilator, linker, biblioteki CPP, które dostępne są w moim ulubionym nuwen MinGW distro,
  2. MSYS, konsola i narzędzia naśladujące środowisko unixowe,
  3. NetBeans z pluginem do C/CPP.

MinGW

Wykorzystana dystrybucja nuwen’a jest szybka w instalacji (rozpakowanie plików) i zawiera wszelkie podstawowe narzędzia oraz te bardziej specjalne, ale o tym można się dowiedzieć na stronie dystrybucji. Przede wszystkim jednak dla gamedeveloper’ów, zawiera dużo bibliotek do obsługi grafiki 3D, m.in. DirectX, OpenGL (Glee), SDL jak również do obsługi dźwięku (OGG), grafiki 2D (JPEG, PNG) oraz archiwów (zlib, libbzip2).

Istotne jest to, jak należy “zainstalować” tą dystrybucję MinGW, żeby była widoczna dla Eclipse. Otóż możemy rozpakować podaną dystrybucję gdziekolwiek (najlepiej bez białych znaków w strukturze katalogów – żadnych spacji), lecz jeśli nie będzie to standardowe miejsce C:\MinGW\ to musimy utworzyć na dysku C takie katalogi: C:\MinGW\bin, ponieważ CDT wyszukuje zainstalowanego toolchain’a od MinGW m.in. po istnieniu podanej ścieżki na dysku C (najprostszy wariant).

To oczywiście nie wszystko – w zmiennej systemowej PATH należy dodać lokalizację rozpakowanej dystrybucji ze ścieżką do podkatalogu bin, czyli dla przykładu, jeśli rozpakowaliśmy MinGW w katalogu D:\PRO, to ustawiamy w PATH ścieżkę do D:\PRO\MinGW\bin.

Żeby sprawdzić czy wszystko jest ok, należy uruchomić ponownie komputer lub wylogować się z profilu – dopiero wtedy zmiany w zmiennej systemowej PATH zostaną uwzględnione w systemie.

Sprawdzić możemy wpisując w wierszu poleceń CMD ( będąc w dowolnym katalogu) polecenie:

g++ -v

Jeśli wszystko jest ok, to powinniśmy otrzymać parę linii komunikatu kończącego się np. tak:

gcc version x.y.z ,

gdzie x,y,z to numer wersji kompilatora gcc.

MSYS

MSYS można pobrać z oficjalnej strony projektu, jednak polecam ściągnąć instalator MSYS dla Gnustep, który zawiera najnowsze wersje potrzebnych narzędzi i nie trzeba ich ręcznie wybierać z listy do instalacji.

Podkatalog \bin MSYS także musimy dodać do zmiennej systemowej PATH, dodatkowo musi on być wcześniej niż katalog \bin MinGW, ponieważ narzędzie make.exe musi być znalezione w MSYS, a nie w MinGW (ewentualnie dla pewności można usunąć make.exe z podkatalogu \bin w MinGW)

NetBeans

Jeśli posiadamy już NetBeans bez C/CPP, możemy łatwo dodać ten plugin z menu Tools / Plugins, wyszukując go po nazwie cpp:

add_plugin1Ostatecznie, po restarcie IDE, plugin do C/CPP powinien znaleźć się na liście zainstalowanych:

plugins_installed

Teraz należy skonfigurować NetBeans do pracy z nowym toolchain MinGW.

W tym celu przechodzimy do menu Tools / Options / C/C++, gdzie znajdziemy pustą listę Tool Collection.

Klikamy Add… i uzupełniamy informację o toolchain:

new_toolchain

Następnie konfigurujemy ustawienia toolchain’a (kompilator, debugger):

toolchain_apps

i sprawdzamy przyciskiem Versions z prawej strony, czy wymagane narzędzia zostały w systemie odnalezione:

conf

W tym momencie możemy stworzyć nowy projekt C/CPP lub wybrać jeden z dostępnych (tutorial) i spróbować go skompilować.

Przykład aplikacji DirectX

Dla przykładu, stworzymy prostą aplikację wykorzystującą DirectX:

#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 : Netbeans + 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;
}

Musimy jeszcze dodać bibliotekę statyczną libd3d9.a, którą znajdziemy w podkatalogu \lib katalogu instalacji MinGW – klikamy na właściwości projektu, przechodzimy do linkera i wybieramy Add library…

add_lib

Kompilujemy, uruchamiamy, wyłączamy – zadanie wykonane.

Chyba, że pojawi się nam następujący błąd:

make: *** [.validate-impl] Error 255

Oznacza to, że używamy złego make.exe, więc musimy się upewnić, że jest to make.exe z katalogu MSYS, a nie z katalogu MinGW.

Brak komentarzy.

Dodaj komentarz