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*


Anmelden zum Antworten