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

Das Gurke

Community-Fossil

  • »Das Gurke« ist der Autor dieses Themas

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

1

15.02.2006, 17:06

Problem mit switch Statements?

Ich habe ein Problem ... Ich programmiere mir gerade ein Bomberman zusammen und ich schätze ich hab da was ziemlich falsch gemacht, beim Versuch eine rudimentäre Spielschleife hinzuzufügen. Momentan sieht sie so aus:

C-/C++-Quelltext

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
// Hauptspielschleife

    while(true)
    {
        // Modi

        // 0 = Intro

        // 1 = Spiel

        // 2 = Scorescreen

        switch(iGameState)
        {
            // Behandeln wir das Intro

            case 0:
                iGameState = Intro_Play();
                // Bomberman mit Spielfeld X * X und X Spielern initialisieren

                if(Bomberman_Init(GetPrivateProfileInt("Bomberman", "xSize", 15,"config/Bomberman.ini"),
                                  GetPrivateProfileInt("Bomberman", "ySize", 15,"config/Bomberman.ini"),
                                  GetPrivateProfileInt("Bomberman", "Players", 2,"config/Bomberman.ini")) != BMAN_OK)
                {
                    Bomberman_Shutdown();       
                }
                break;

            // Behandeln wir das "normale" Spiel

            case 1:
                iGameState = Bomberman_ProcessFrame();
                break;

            // Zeigen wir den Score Screen

            case 2:
                iGameState = Scorescreen_Show();
                break;              
        }
        
        // Mit der normalen Nachrichtenschleife fortfahren

        if(PeekMessage(&msg,NULL,0,0,PM_REMOVE) == TRUE)
        {
            if(msg.message == WM_QUIT)
                ::PlaySoundW (L"snd/outro.wav", NULL, SND_SYNC);
                break;

            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
     }


Das das weit entfernt von etwas idealem ist, ist mir klar ... Aber bis vor kurzem hats funktioniert. Dann kam ich auf die Idee einen Scorescreen einbauen zu wollen, das hat zu der Version jetzt gerade geführt.

Die Funktione Intro_Play() gibt den Wert 1 zurück (für das Spielgeschehen). Beim Spielgeschen prüft dann Bomberman_ProcessFrame() intern ob der Tod eines Spielers vorliegt und gibt in diesem Fall dann 2 zurück für den Scorescreen. Der Scorescreen zeigt dann Punkte an, löscht alle Spielinhalte und initialisert das Spiel komplett neu.

Soweit die Theorie ...

In der Praxis passiert folgendes:
Bomberman_ProcessFrame() wird genau EINMAL durchlaufen, dann beendet sich das Spiel.

Meine erste Vermutung war das dafür "break;" verantwortlich war. Scheint nicht der Fall zu sein ...

Hilfe? Wenn mehr Code gewünscht wird ist das kein Problem, glaube aber der Fehler liegt wo da oben ...

Black-Panther

Alter Hase

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

2

15.02.2006, 17:24

Das scheint an der Funktion Bomberman_ProcessFrame(); zu liegen... könntest du diese bitte mal posten... vor allem den Teil bei dem der Rückgabewert ermittelt wird...
Die switch an und für sich ist schon richtig...
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

Das Gurke

Community-Fossil

  • »Das Gurke« ist der Autor dieses Themas

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

3

15.02.2006, 17:29

C-/C++-Quelltext

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
int Bomberman_ProcessFrame()
{
    DWORD   dwRenderTime;

    dwRenderTime = GetTickCount();
    
    // Spieler erstmal im Speicher bewegen

    Player_ProcessInput();
    // Bomben überprüfen und ggf Lebenszeit verlängern

    Bomb_ProcessList();
    // Dann das gleiche mit den Flammen

    Bomb_FlameProcessList();
    // Haben wir einen toten Spieler?

    for(int i = 0; i < iPlayerCount; i++)
    {
        if((Player_CheckForDeath(iPlayerCount) == TRUE))
        {
            return 2;
            break;
        }
    }
    
    // Dann die neuen Positionen zeichnen

    Graphics_RenderFrame();
    
    // Zeit in ms vergangen

    dwRenderTime = GetTickCount() - dwRenderTime;
    
    // Für diese Zeit CPU an andere Anwendungen abgeben

    if(dwRenderTime < 33)
        Sleep(33 - dwRenderTime);

    return (1);

}


Und dann gleich nochmal die Player_CheckForDeath, diese wird aber NICHT durchlaufen (Breakpointgeprüft).

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int Player_CheckForDeath(int iPlayerNum)
{
    for(int i = 0; i < iPlayerNum; i++)
    {
        // Steht der Spieler auf einem explodierenden Feld und ist er NICHT unverwundbar?

        if(Gamefield.pFields[(pPlayer[i].iYPos * Gamefield.iXSize) + pPlayer[i].iXPos].iStatus & FIELD_KILLS_PLAYER && pPlayer[i].iInvulnerable == FALSE)
        {
            pPlayer[i].bDead = TRUE;
            return (TRUE);
        }
        else
        {
            return (FALSE);
        }
    }
}

Anonymous

unregistriert

4

16.02.2006, 09:15

Hi!

Das Problem liegt hier:

C-/C++-Quelltext

1
2
3
4
// Mit der normalen Nachrichtenschleife fortfahren

            if(msg.message == WM_QUIT)
                ::PlaySoundW (L"snd/outro.wav", NULL, SND_SYNC);
                break;


Nach dem "if" wird genau EIN Statement ausgeführt, wenn WM_QUIT
gesendet wurde - das wäre dann die PlaySound-Funktion. Das
"break" Statement hingegen wird immer ausgeführt - und wirkt auf die
äußerte while-Schleife. Dadurch beendet sich das Spiel.

Richtig wäre es so:

C-/C++-Quelltext

1
2
3
4
5
6
// Mit der normalen Nachrichtenschleife fortfahren

            if(msg.message == WM_QUIT)
            {
                ::PlaySoundW (L"snd/outro.wav", NULL, SND_SYNC);
                break;
            }


Grüße
Stefan

Das Gurke

Community-Fossil

  • »Das Gurke« ist der Autor dieses Themas

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

5

16.02.2006, 13:15

DankeDANKE!!

Und ich wollte das Hauptprogramm schon komplett neu schreiben :angel:

Willkommen im Forum btw :huhu:

Werbeanzeige