DirectX 9 in DevC++ einbinden/Tutorial für DirectX
-
Ich hatte eigentlich vor ein 2D-Spiel zu machen, erstmal so eine Art Pong und dann vielleicht einen Weltraumshooter oder ein Jump'n Run.
Das weiß ich aber noch nicht, ein Langzeitziel wär ein RPG.
-
Wenn du Englisch kannst, sollte dir das erstmal weiterhelfen:
http://nexe.gamedev.net/directKnowledge/default.asp?p=DirectX Development Using DevCpp
Ich werde dann im Laufe des Tages ein Grundgerüst posten um deinen Rechner in den DirectX-2D Modus zu zwingen.
Theoretisch hab ich schon eins, aber das ist momentan nur in C (damals konnt ich noch kein C++ und seitdem hab ich nix mehr in DirectX-2D gemacht).
Sollte dir das Grundgerüst in C schon reichen, dann gib einfach Bescheid, dann kann ich mir das Umschreiben sparen!Ich antworte erst jetzt, da Not am Mann / Nachbar war (Rechner kam nicht mehr ins Internet)...
-
Also ich hab schon verstanden was der Typ auf der Seite erklärt hat, aber mein PC wollte nicht in den Ordner wechseln. Ich habs mehrmals überprüft.
Der Ordner ist C:\DXSDK\Lib\x64\. Da sind die .lib Dateien drin. Es gibt neben dem x64 noch einen einen Ordner mit dem Namen x86 in dem auch die .lib Dateien
enthalten sind. Gibt es nicht noch eine andere Möglichkeit???
So Konsole und in Ordner wechseln, da bin ich anscheinend zu doof zu!!!

Zum Gerüst es ist auch ok, wenn du es in C posten würdest C++, wär aber natürlich besser. Mach es wie du willst.
Vielleicht könntest du mir das mit dem einbinden nochmal selber erklären.
Schon mal Danke das du mir überhaupt geholfen hast.
-
Der Ordner ist C:\DXSDK\Lib\x64\. Da sind die .lib Dateien drin.
aber mein PC wollte nicht in den Ordner wechseln.
So Konsole und in Ordner wechseln, da bin ich anscheinend zu doof zu.du bist nicht in der lage, einen ordner zu oeffnen, aber moechtest dich mit der direct3d-api beschaeftigen?!
-
Ich hatte eigentlich erwartet das diese Antwort von irgendwem kommmt, mir fällt jetzt leider kein guter Konter an. Also erstmal will ich mich ja nur mit 2D beschäftigen(Ich weiß das ist bei Direct 3D dabei), außerdem vielleicht könntest du mir ja sagen was ich falsch gemacht habe, Ich hab in der Konsole ganz normal den Pfad angegeben nämlich C.\DXSDK und so weiter...
Das ich es nicht kann liegt einfach daran das ich mich noch nie damit auseinadergesetzt hab und es auch nie wollte, aber jetzt muss ich es halt und deshalb wärs sehr nett wenn du es mir erklären könntest.
-
So ich bin jetzt auf die geniale Idee gekommen das Devpack für DX 9 runterzuladen ich habe es installiert und folgendes Tutorial von www.codeworx.org compiliert.
#include <windows.h> #include <ddraw.h> using namespace std; #define WindowTitle "DirectDraw-Tutorial" #define WindowClassName "DDWinClass" LPDIRECTDRAW7 lpDirectDraw; // DirectDraw-Objekt HRESULT ddrval; LONG FAR WINAPI WndProc (HWND , UINT , UINT , LONG) ; int WINAPI WinMain (HINSTANCE hInstance , HINSTANCE hPrevInstance , LPSTR lpCmdLine , int nCmdShow) { MSG msg ; HWND hwnd ; WNDCLASS wndclass ; if (!hPrevInstance) { wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc = WndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = hInstance ; wndclass.hIcon = LoadIcon (NULL , IDI_APPLICATION) ; wndclass.hCursor = LoadCursor (NULL , IDC_ARROW) ; wndclass.hbrBackground = (HBRUSH)GetStockObject (LTGRAY_BRUSH) ; wndclass.lpszMenuName = NULL ; wndclass.lpszClassName = WindowClassName ; RegisterClass (&wndclass) ; } hwnd = CreateWindow (WindowClassName , WindowTitle , WS_OVERLAPPEDWINDOW , CW_USEDEFAULT , CW_USEDEFAULT , CW_USEDEFAULT , CW_USEDEFAULT , NULL , NULL , hInstance , NULL) ; ShowWindow (hwnd , nCmdShow) ; UpdateWindow (hwnd) ; ddrval = DirectDrawCreateEx(NULL, (VOID**)&lpDirectDraw, IID_IDirectDraw7, NULL); if (ddrval != DD_OK) { return (0); } ddrval = lpDirectDraw->SetCooperativeLevel (hwnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN); if (ddrval != DD_OK) { lpDirectDraw->Release(); lpDirectDraw = NULL; return (0); } ddrval = lpDirectDraw->SetDisplayMode (640, 480, 8, 0, 0); if (ddrval != DD_OK) { lpDirectDraw->Release(); lpDirectDraw = NULL; return (0); } while(1) { if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)) { if (msg.message == WM_QUIT) break; TranslateMessage(&msg); DispatchMessage(&msg); } } if (lpDirectDraw != NULL) { lpDirectDraw->Release(); lpDirectDraw = NULL; } return msg.wParam ; } LONG FAR WINAPI WndProc (HWND hwnd , UINT message , UINT wParam , LONG lParam) { switch (message) { case WM_DESTROY: { PostQuitMessage (0) ; return 0 ; } break; } // switch (message) return DefWindowProc (hwnd , message , wParam , lParam) ; } // WndProcAllerdings gab der Compiler diese Fehler aus:
.drectve `/DEFAULTLIB:"uuid.lib" /DEFAULTLIB:"uuid.lib" ' unrecognized
Falls jetzt jemand fragt... Ich hab unter Projektoptionen DevC++\Include unter Include Verzeichnisse angegeben und DevC++\lib unter Bibliotheksverzeichnisse.
Ich hab das MSVisualC++ Projekt importiert und dann kompiliert ich hab keine Ahnung was jetzt noch falsch sein soll.
-
Ich hab in der Konsole ganz normal den Pfad angegeben
das kommando heisst "cd", wie "change directory".
ich bin jetzt auf die geniale Idee gekommen das Devpack für DX 9 runterzuladen ich habe es installiert
vorbildlich!

directve '/DEFAULTLIB:"uuid.lib"' unrecognized
wenn dein dev-c++ diese direktive nicht kennt, dann lass sie doch einfach mal weg (duerfte in den linker-optionen zu finden sein) - stattdessen fuegst du diese lib (in selbigen linker-optionen) einfach manuell dazu.
die lib ist uebrigens im microsoft-plattform-sdk zu finden.davon abgesehen hat microsoft das directx-sdk ja schon sehr einsteigerfreundlich fuer visual-c vorbereitet; und wo's deren ide auch kostenlos gibt, waere es doch vielleicht unproblematischer, eben diese zu benutzen...
-
Das Beispiel geht tatsächlich!!!
Meinst du eine Autorenversion???
Na ich googel mal nach einer und guck dann ob sie mir gefällt der Download ist doch sicher recht happig, na ja ich guck trotzdem mal nach. Vielleicht kauf ich mir auch ein Buch wo eine Autorenversion dabei ist....
-
Ich sehe gerade, du hast selber schon eine Lösung gefunden. Meine Gratulation!

O.K. Muradhin, gehen wir mal der Reihe nach vor:
1. Öffne eine Eingabeaufforderung und tippe ein:
cd \
Jetzt gibt es zwei Möglichkeiten fortzufahren, wenn du das letzte DirectX-SDK installiert hast und während der Installation das Installationszielverzeichnis
nicht geändert hast, dann sollte folgender Befehl bei dir richtig sein:cd C:\Programme\Microsoft DirectX SDK (August 2006)\Lib\x86
ansonsten wenn du es wie auf der Internetseite bei meinem anderen Posting (nexe.gamedev.net) installiert hast, tippe:
cd C:\DXSDK\Lib\x86
Jetzt bist du normalerweise im richtigen Verzeichnis, außer du hast einen 64-Bit Prozessor, dann ersetze oben das "x86" durch "x64".
2. Kopiere nun mittels Windows-Explorer aus dem bin-Verzeichnis von MinGW (bei mir liegt das unter "C:\MinGW\bin") die drei Dateien
as.exe
dlltool.exe
reimp.exein dein "C:\Programme\Microsoft DirectX SDK (August 2006)\Lib\x86"-Verzeichnis.
3. In der Eingabeaufforderung (die von Punkt 1. immer noch offen sein sollte!) tippst du nun ein
reimp –c ddraw.lib
Jetzt sollten in deinem "x86"-Verzeichnis zwei neue Dateien von "reimp" produziert worden sein. Eine "DDRAW.def" und eine "libDDRAW.a".
4. Jetzt startest du den DevC++ und legst ein neues C++-Projekt vom Typ "Windows-Applikation" an.
Im Quelltextfenster des "main.cpp" markierst du alles und löschst es, so daß die Datei leer ist und fügst dann folgenden Inhalt ein:
#include <windows.h> #include <ddraw.h> #include <stdio.h> #define MWC "My1" DWORD Tr1; HANDLE COH = INVALID_HANDLE_VALUE; HDC hdc1; HWND hwnd1; LPDIRECTDRAW lpDD1; LPDIRECTDRAWSURFACE lpdds1; void ShowErrorMessageAndDie(const VOID *daMessage, DWORD messageLength) { if (COH != INVALID_HANDLE_VALUE) { WriteConsole(COH, daMessage, messageLength, &Tr1, NULL); Beep(1,1); Sleep(5000); FreeConsole(); exit(0); }; } LRESULT CALLBACK WindowProc1(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { return DefWindowProc(hWnd, message, wParam, lParam); }; int WINAPI WinMain(HINSTANCE hInstance1, HINSTANCE hinstance2, LPSTR lpstr1, int ncs1) { DDSURFACEDESC ddsd1; HBITMAP bitmap1, primecopybitmap; HBRUSH Bru1; HDC primecopy; HRESULT CSR; LPCTSTR Warnmeldung = ";D"; MSG msg1; RECT rect1; WNDCLASS wc1; AllocConsole(); COH = GetStdHandle(STD_OUTPUT_HANDLE); wc1.lpszClassName = MWC; wc1.lpfnWndProc = WindowProc1; wc1.style = CS_SAVEBITS; wc1.hInstance = hInstance1; wc1.hIcon = NULL; wc1.hCursor = NULL; wc1.hbrBackground = (HBRUSH )GetStockObject(BLACK_BRUSH); wc1.lpszMenuName = NULL; wc1.cbClsExtra = 0; wc1.cbWndExtra = 0; RegisterClass( &wc1 ); if (NULL !=(hwnd1 = CreateWindowEx(WS_EX_TOOLWINDOW, MWC,"NT-Crash", WS_CAPTION|WS_VISIBLE, 100, 100, 100, 100, NULL, NULL, hInstance1, NULL))) { if (DD_OK != DirectDrawCreate(NULL, &lpDD1, NULL)) { ShowErrorMessageAndDie("DirectDrawCreate failed!\n", 25); }; if (DD_OK != (IDirectDraw_SetCooperativeLevel(lpDD1, hwnd1, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN))) { ShowErrorMessageAndDie("SetCooperativeLevel failed!\n", 28); }; if (DD_OK != (IDirectDraw_SetDisplayMode(lpDD1, 800, 600, 8))) { ShowErrorMessageAndDie("SetDisplayMode failed!\n", 23); }; ZeroMemory(&ddsd1, sizeof(ddsd1)); ddsd1.dwSize = sizeof(ddsd1); ddsd1.dwFlags = DDSD_REFRESHRATE|DDSD_CAPS; ddsd1.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; if (DD_OK != (CSR = IDirectDraw_CreateSurface(lpDD1, &ddsd1, &lpdds1, NULL))) { ShowErrorMessageAndDie("CreateSurface failed!\n", 22); } if (DD_OK != IDirectDrawSurface_GetDC(lpdds1, &hdc1)) { ShowErrorMessageAndDie("IDirectDrawSurface_GetDC failed!\n", 34); }; Bru1 = CreateSolidBrush(RGB(0, 0, 255)); rect1.bottom = 600; rect1.left = 0; rect1.right = 800; rect1.top = 0; FillRect(hdc1, &rect1, Bru1); SetTextColor(hdc1, RGB(255, 0, 0)); SetBkColor(hdc1, RGB(0, 0, 255)); SetCursor(LoadCursor(NULL, IDC_CROSS)); primecopy = CreateCompatibleDC(hdc1); bitmap1 = CreateCompatibleBitmap(hdc1, 800, 600); primecopybitmap = (HBITMAP__*)SelectObject(primecopy, bitmap1); while (1) { TextOut(hdc1, 395, 295, Warnmeldung, 2); BitBlt(primecopy, 0, 0, 800, 600, hdc1, 0, 0, SRCCOPY); if (0 != (PeekMessage(&msg1, hwnd1, WM_KEYFIRST, WM_KEYLAST, PM_REMOVE))) { if ((msg1.message == WM_KEYUP) && (msg1.wParam == VK_ESCAPE)) break; }; BitBlt(hdc1, 0, 0, 800, 600, primecopy, 0, 0, SRCCOPY); } DeleteDC(primecopy); DeleteObject(bitmap1); DeleteObject(Bru1); IDirectDrawSurface_ReleaseDC(lpdds1, hdc1); IDirectDrawSurface_SetPalette(lpdds1, NULL); IDirectDrawSurface_Release(lpdds1); IDirectDraw_Release(lpDD1); } else { LPVOID lpMsgBuf; FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL); MessageBox( NULL, (LPCTSTR)lpMsgBuf, "Error", MB_OK | MB_ICONINFORMATION ); LocalFree( lpMsgBuf ); ShowErrorMessageAndDie("CreateWindow failed!\n", 21); }; DestroyWindow(hwnd1); Sleep(5000); FreeConsole(); return 1; }5. Gehe jetzt ins Menü "Projekt" und wähle dort "Projekt Optionen" an. Es öffnet sich ein Fenster, wo du den Karteireiter "Verzeichnisse" anwählst und dann den
Karteireiter "Include Verzeichnisse". Dort wählst du das "include"-Verzeichnis aus, welches in deinem DirectX-SDK-Verzeichnis enthalten ist und fügst es der
Liste hinzu.6. Dann klickst du oben in dem Fenster noch auf den Karteireiter "Parameter" und unterhalb "Linker" noch auf den Knopf "Bibliothek/Objekt hinzufügen" und wählst
hier die vorhin frisch erstellte "libDDRAW.a" aus. Dann klickst du im Fenster "Projekt Optionen" noch auf den "Ok"-Knopf und es verschwindet.7. Klicke jetzt im Menü "Ausführen" auf "Kompilieren" und DevC++ fragt dich jetzt, wo du die "main.cpp" speichern willst. Das sollte in dem Verzeichnis geschehen,
wo auch die Projektdatei von deinem Projekt erstellt wurde, also die mit der Endung ".dev". Jetzt kompiliert DevC++ die "main.cpp" und sollte ohne Fehler eine
ausführbare Datei mit dem Namen des Projekts in dem Verzeichnis erstellen, wo auch die "main.cpp" gespeichert ist.Das Programm macht nicht viel. Es öffnet lediglich ein Fenster, welches für das Erstellen einer DirectX-Surface notwendig ist, erstellt dann eine DirectX-Surface mit einer Auflösung von 800x600 und färbt sie blau ein. In der Mitte wird noch ein Smiley ";D" in rot ausgegeben und der Mauscursor wird durch einen anderen (Fadenkreuz) ersetzt. Verlassen kannst du das Programm mit der ESC-Taste.
Das Konsolenfenster wird nur geöffnet, um Fehlermeldungen auszugeben, falls welche auftreten sollten und schließt sich nach fünf Sekunden von selbst.Zu Büchern kann ich leider nix sagen, ich habe mir das nur mit den Dokumentationen des DirectX-SDKs, der WinAPI sowie der DirectX-Beispielquelltexte angeeignet.
Hoffe geholfen zu haben?

-
Ok ich denke jetzt kann ich loslegen mit DDRAW, danke für alles!!!!
Ich frage trotzdem nochmal ob irgendjemand ein GUTES Buch für Anfänger kennt???