DirectDraw Interface richtig initialisiert?!
-
Hallo!
Ich würde gerne wissen ob ich DirectDraw richtig initialisiert habe, irgendwie ging mir das zu einfach / fix / leicht
Hier mal der komplette Code, die Initialisierung erfolgt ganz am Ende
#define WIN32_LEAN_AND_MEAN // MFC und selten genutzte Objekte nicht includen // Include Dateien #include <windows.h> #include <mmsystem.h> // Sound #include <stdlib.h> // Randomizefunktion #include <stdio.h> // sprintf #include <ddraw.h> // DirectDraw // Defines #define WINDOW_CLASS_NAME "WINCLASS1" #define WINDOW_HEIGHT 400 #define WINDOW_WIDTH 400 // Funktionsprototypen int Game_Init(void),Game_Main(void),Game_Shutdown(void); // Global HWND main_window_handle = NULL; LPDIRECTDRAW lpdd = NULL; LPDIRECTDRAW lpdd7 = NULL; char buffer[100]; // Window's Procedure Funktion /////////////////////////////////////////////// LRESULT CALLBACK WindowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) { PAINTSTRUCT ps; // Wird in WM_PAINT genutzt HDC hdc; // Handle zu einem best. Fenster switch(msg) { case WM_CREATE: { return(0); }break; case WM_PAINT: { hdc = BeginPaint(hwnd,&ps); EndPaint(hwnd,&ps); return(0); }break; case WM_DESTROY: { PostQuitMessage(0); return(0); }break; default:break; } // Sonstige Messages verarbeiten (Default Window Processes) return(DefWindowProc(hwnd, msg, wparam, lparam)); } // WINMAIN /////////////////////////////////////////////////////////////////// int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPrevInstance, LPSTR lpcmdline, int ncmdshow) { WNDCLASSEX winclass; // Speichert die Klasse die erschaffen wird HWND hwnd; MSG msg; // Die Fensterklassenstruktur winclass.cbSize = sizeof(WNDCLASSEX); winclass.style = CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW; winclass.lpfnWndProc = WindowProc; winclass.cbClsExtra = 0; winclass.cbWndExtra = 0; winclass.hInstance = hinstance; winclass.hIcon = LoadIcon(NULL, IDI_WINLOGO); winclass.hCursor = LoadCursor(NULL, IDC_ARROW); winclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); winclass.lpszMenuName = NULL; winclass.lpszClassName = WINDOW_CLASS_NAME; winclass.hIconSm = LoadIcon(NULL, IDI_WINLOGO); // Fensterklasse bei Windows regestrieren if(!RegisterClassEx(&winclass)) return(0); // Fenster erschaffen if(!(hwnd = CreateWindowEx( NULL, WINDOW_CLASS_NAME, "Standardfenster", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 0,0, // Startposition WINDOW_HEIGHT,WINDOW_WIDTH, // Fenstergröße NULL, // Handle geht an das Desktop NULL, hinstance, NULL))) // Zusätzliche Parameter return(0); Game_Init(); // Hauptschleife while(true) { if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)) { if(msg.message == WM_QUIT) break; TranslateMessage(&msg); // Tastenbetätigungen übersetzen DispatchMessage(&msg); // " an Window Processer senden } Game_Main(); } Game_Shutdown(); return(msg.wParam); } // Game_Init() ///////////////////////////////////////////////////////////////////// int Game_Init() { if (FAILED(DirectDrawCreateEx(NULL, (void **)&lpdd, IID_IDirectDraw7, NULL))) MessageBox(main_window_handle, "Fehler bei der DirectDraw initialisierung!", "Fehler", MB_OK | MB_ICONERROR); // Cooperation Level mit Windows; es handelt sich um eine Fensteranwendung lpdd->SetCooperativeLevel(main_window_handle, DDSCL_NORMAL); return(1); } // Game_Main() ///////////////////////////////////////////////////////////////////// int Game_Main() { return(1); } // Game_Shutdown() ///////////////////////////////////////////////////////////////// int Game_Shutdown() { if (lpdd) { if(FAILED(lpdd->Release())) MessageBox(main_window_handle, "Direct Draw Interface konnte nicht beendet werden!", "Fehler", MB_OK | MB_ICONERROR); lpdd = NULL; } return(1); }
Ist das jetzt in Ordnung so? Fehler bekomme ich keine angezeigt. Habt ihr evt. sonst noch etwas zu meckern, stimmt noch etwas ganz auffälliges am Code nicht? Wie einige vielleicht sehen arbeite ich mit dem André LaMothe Buch
! Ist alles noch sehr neu für mich
Gruß
Delryn
-
Viel hast du nicht gemacht. Kann ja nicht viel falsch sein
-
hallo!
ein bisschen kritik:
1. char buffer[100]; ?? für was wird der verwendet?
2. lpdd->SetCooperativeLevel(main_window_handle, DDSCL_NORMAL); hier sollte noch eine fehler abfrage kommen
3. if(FAILED(lpdd->Release()))
MessageBox(main_window_handle, "Direct Draw Interface konnte nicht beendet werden!", "Fehler", MB_OK | MB_ICONERROR); die abfrage finde ich nicht notwendig
4. return(1); falls alles gut gelaufen ist, sollte man return 0 verwenden, return 1 ist eher für fehler
5. desweiteren würde ich dir raten, bei funktionen wie Game_Init() bool als rückgabe wert zu verwenden und diesen dann auch beim fehler zurückgeben. im moment bekommst du nur eine meldung das etwas schief gelaufen ist, aber das programm wird trotzedem weiter ausgeführt.
-
Edit: Zu den 4 Punkten:
1.) Das erste ist ein globaler Textbuffer, den werde ich mit Sicherheit noch nutzen
Die restlichensind zum Glück eher Kosmetik
Aber ich nehms mir zu Herzen
---------------------------------------------------------------------------
Hmm na gut, allerdings will ich Windows nun sagen das ich eine Fullscreenanwendung machen will:int Game_Init() { if (FAILED(DirectDrawCreateEx(NULL, (void **)&lpdd, IID_IDirectDraw7, NULL))) MessageBox(main_window_handle, "Fehler bei der DirectDraw initialisierung!", "Fehler", MB_OK | MB_ICONERROR); /* if (FAILED(lpdd->SetCooperativeLevel(main_window_handle, DDSCL_NORMAL))) { MessageBox(main_window_handle, "SetCooperativeLevel() ist fehlgeschlagen!", "Fehler", MB_OK | MB_ICONERROR); } */ // Cooperation Level mit Windows; es handelt sich um eine Fensteranwendung if (FAILED(lpdd->SetCooperativeLevel(main_window_handle, DDSCL_FULLSCREEN | DDSCL_ALLOWMODEX | DDSCL_EXCLUSIVE | DDSCL_ALLOWREBOOT))) { MessageBox(main_window_handle, "SetCooperativeLevel() ist fehlgeschlagen!", "Fehler", MB_OK | MB_ICONERROR); // return(0); } if(FAILED(lpdd->SetDisplayMode(640,480,8))) MessageBox(main_window_handle, "SetDisplayMode() ist fehlgeschlagen!", "Fehler", MB_OK | MB_ICONERROR); return(1); }
Das Auskommentierte war für eine normale Fensteranwendung, dass untere für Fullscreen. Allerdings bekomme ich die Meldung meiner MessageBox(SetCooperativeLevel fehlgeschlagen...), danach versucht er SetDisplayMode und stürzt logischerweise ab.
Was mache ich falsch?
-
Konnte das Problem mit Hilfe der FAILEDFunction eingrenzen:
// Global HWND main_window_handle = NULL; LPDIRECTDRAW lpdd = NULL; LPDIRECTDRAW lpdd7 = NULL; char buffer[100]; int Game_Init() { if (FAILED(DirectDrawCreateEx(NULL, (void **)&lpdd7, IID_IDirectDraw7, NULL))) MessageBox(main_window_handle, "Fehler bei der DirectDraw initialisierung!", "Fehler", MB_OK | MB_ICONERROR); // Cooperation Level mit Windows; es handelt sich um eine Fensteranwendung if (FAILED((lpdd7->SetCooperativeLevel(main_window_handle, DDSCL_FULLSCREEN | DDSCL_ALLOWMODEX | DDSCL_EXCLUSIVE | DDSCL_ALLOWREBOOT))))//==DDERR_INVALIDPARAMS)) { MessageBox(main_window_handle, "SetCooperativeLevel() ist fehlgeschlagen!", "Fehler", MB_OK | MB_ICONERROR); return(0); } if((lpdd7->SetDisplayMode(320,200,8))==DDERR_DIRECTDRAWALREADYCREATED) MessageBox(main_window_handle, "SetDisplayMode() ist fehlgeschlagen!", "Fehler", MB_OK | MB_ICONERROR); return(0); }
Wo ist der Fehler, ich kann compiliere aber dann stürzt er zur laufzeit ab bei SetDisplayMode und sagt irgendwas von nem ESP wert der nicht stimmt?
-
Versuche es mal mit einer gängigen Auflösung. Z.B. 640x480 16Bit, oder so.
-
Bringt nix, hier der Fehler
http://mitglied.lycos.de/inselkampf/c++/error.jpg
Man sieht er bereitet schon Fullscreen vor scheitert aber an SetDisplayMode.
Was bedeutet der Fehler?
-
Probier mal aus dem "LRESULT CALLBACK" ein "LRESULT WINAPI" zu machen (bei "WindowProc").
-
TomasRiker schrieb:
Probier mal aus dem "LRESULT CALLBACK" ein "LRESULT WINAPI" zu machen (bei "WindowProc").
Sind das nicht beides #defines auf FAR PASCAL...?!?
-
Kann sein. Ich weiß nur, dass ich mal schlechte Erfahrungen damit gemacht habe. Irgendwann hatte ich die WindowProc-Funktion mal falsch deklariert und es gab immer wieder Fehler, sobald ich in den Vollbildmodus wechselte. Und das war ganz schön nervig, weil es ewig gedauert hat, bis ich den Fehler gefunden hatte.
-
Delryn schrieb:
Ich würde gerne wissen ob ich DirectDraw richtig initialisiert habe, irgendwie ging mir das zu einfach / fix / leicht
...
[snip]152 Zeilen Code[/snip]*lol*