Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

24.05.2004, 19:43

DialogBox für Spiele geeignet?

Hallo, also ich habe ein Problem: Ich kann bei meinem Spiel (ist noch nicht wirklich eins.. soll aber eins werden :) ) nur EINMAL zu Beginn die Einstellungen per Dialog festlegen. Also welche Auflösung, ob Fenster oder Fullscreen Anwendung. Wenn ich es dann starte wird alles korrekt initialisiert und gerendert. Aber wenn ich es dann wieder zum Hauptmenü verlasse, das überings auch ein mit DialogBox erstellter Dialog ist, und dann nochmals die Einstellungen ändern will, oder das Spiel neustarten will, wird zwar das GameFenster mit der richtigen Auflösung erzeugt, aber es wird nichts gerendert und er springt dann auch nicht mehr in den Fullscreen modus. Wenn ich dann nochmal das Game Fenster schliesse geht er komplett aus dem Programm ( Game Fenster ist kein mit DialogBox erstellter Dialog sondern mit CreateWindow )

Hier mal ein bisschen Code:

Quellcode

1
2
3
4
5
6
case IDC_NEWGAME:
            
            ShowWindow(hDlg, SW_HIDE);
            runGame(/*hDlg*/);
            ShowWindow(hDlg, SW_SHOW);
        break;


So wird aus dem Hauptmenü das Spiel aufgerufen...

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
void runGame()      // nicht mehr nur initialisieren des Spiels...
{

    WNDCLASSEX      wc;
    wc.cbClsExtra  = 0;
    wc.cbSize = sizeof(WNDCLASSEX);
    wc.cbWndExtra  = 0;
    wc.hbrBackground =(HBRUSH)GetStockObject(LTGRAY_BRUSH);
    wc.hCursor = LoadCursor(NULL,IDC_ARROW);
    wc.hIcon = LoadIcon(NULL,IDI_APPLICATION);
    wc.hIconSm = LoadIcon(NULL,IDI_APPLICATION);
    wc.hInstance = g_hInst;
    wc.lpfnWndProc = GameMsgProc;
    wc.lpszClassName = "Fenster";
    wc.lpszMenuName = NULL;
    wc.style = CS_HREDRAW | CS_VREDRAW;

    RegisterClassEx(&wc);

    g_hwnd = CreateWindowEx(NULL,"Fenster","Pong 1.0", WS_OVERLAPPEDWINDOW,
                            0,0,g_sAkt3DParams.VideoMode.Width,g_sAkt3DParams.VideoMode.Height, 
                            NULL, NULL, g_hInst, NULL);
    
    if( g_hwnd == NULL )
    {
        FILE* dat = fopen("error.txt","a");
        fprintf(dat,"Fehler beim initialisieren des Fensters!\n");
        fclose(dat);
    }
    else
    {
        aktGame = new CGame(g_hwnd, &g_sAkt3DParams);  //Haupt Spielobjekt wird erzeugt!!

        ShowWindow(g_hwnd, g_show);
        UpdateWindow(g_hwnd);
        
        while ( gameMsg.message != WM_QUIT )
        {  
            if ( PeekMessage(&gameMsg,NULL,0U,0U,PM_REMOVE) )
            {

                TranslateMessage(&gameMsg);
                DispatchMessage(&gameMsg);
            
            }   

            aktGame->render(); 
        }
        
    }


    exitGame();

}


und so sieht dann die Spielfunktion aus... Mir ist nun wirklich schleierhaft, wieso er nur beim ersten Aufruf von runGame() auch wirklich etwas rendert... Theoretisch wird doch beim Aufruf von runGame() jedes mal ein völlig neues Game Objekt erzeugt, was auch die 3D Klasse enthält die somit auch neu erzeugt wird und es doch eigentlich so funktionieren müsste wie beim ersten mal...
Kann das Problem mit den durch DialogBox erzeugten Dialogfeldern zusammenhängen? Oder ist es ratsam die Einstellungen in einem extra Programm abzufragen und den Benutzter dadurch zu zwingen die Einstellungen ausserhalb des Spiels zu machen?

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

2

24.05.2004, 21:08

also ganz konnt ich dir ja jetzt nicht folgen ;) aber es könnte ja sein, das du nicht beachtet hast, das dein "Spiel Fenster" ein anderes Handle für das Fenster als dein Dialog hat.

An deiner Stelle würd ich auch mal prüfen, ob du das Fenster auch ordentlich beendest. Denn du musst dein Fenster nicht nur "Registrieren" sondern auch unregistrieren mit: UnregisterClass(...).

Übrigends ich glaub mit dem Befehl GetLastError() kannst du Fehler beim erstellen von irgendwelchen Fenstern bekommen, also ich mein woran es liegt. Ich glaube es leifert einen integer Wert zurück, den kannst du dann in der Dokumentation deines Compilers nachschauen, such einfach GetLastError() da wirst du schon was finden. Dann suchst du nach der Fehlernummer und du weisst woran es liegt ;)

Ich persöhnlich halte Dialogboxen dafür weniger geeignet. Einstellungen sollten meiner Meinung nach "gerendert" werden. Also im "Spiel" Fenster. Wenn du noch keine GUI Klassen hast, und nicht die Engine von David nutzen willst, so wie es mir scheint ;), dann würd ich dir vorschlagen erst mal die Einstellungen aus einer Datei zu lesen. Zum Beispiel ne INI. Später kannste ja dann immernoch die graphische Oberfläche aufbauen. So hab ichs auch gemacht ;D