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

little_Progger

Treue Seele

  • »little_Progger« ist der Autor dieses Themas

Beiträge: 188

Wohnort: Nähe Bielefeld

Beruf: Azubi

  • Private Nachricht senden

1

29.03.2010, 11:51

Pause Funktion lässt das ganze Programm abstürzen

Hi Leute,

ich habe bei meinem Plan Kapitel 12 zu erweitern dran gedacht, eine "Pause"-Funktion mit einzubauen.
Nun habe ich das so realisiert, dass ich in der Funktion "CGame::ProcessEvents ()" nach der Esc Abfrage
noch eine Abfrage eingebaut habe indem ich abfrage ob "p" gedrückt wurde. Wenn dies nun zutrift, dann
lasse ich eine Schleife laufen bis die Taste nicht mehr gedrückt ist.

Nun wenn ich es starte, dann läuft auch alles bis ich "p" drücke.
Nachdem ich "p" gedrückt habe bleibt das ganze Programm stehen und das auch wenn ich "p" ein
zweites mal drücke.

Hier mal der Code:

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
44
45
46
47
48
// ProcessEvents
//
// Aufgabe: Events bearbeiten
//
void CGame::ProcessEvents ()
{
  SDL_Event Event;

  // Gab es ein Event?
  if (SDL_PollEvent (&Event))
  {
    // Ja, also schauen welches
    switch (Event.type)
    {
      // Beenden?
      case (SDL_QUIT):
      {
        m_bGameRun = false;

      } break;

      // Wurde eine Taste gedrückt?
      case (SDL_KEYDOWN):
      {
        switch (Event.key.keysym.sym)
        {
          case (SDLK_ESCAPE):
          {
            // Ja, also Spiel beenden
            m_bGameRun = false;

          } break;

      case (SDLK_p):
      {
        m_bLockP = true;
                    
        while (m_bLockP == true)
        {
            if (g_pFramework->KeyDown (SDLK_p) == false)
                    m_bLockP = false;
        }
       } break;                                                 
    }
      }
    }
  }
} // ProcessEvents

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

2

29.03.2010, 11:55

Öhm ja..
Du kannst nicht in der Schleife dort drin verweilen, weil die SDL ja die Events pollen muss ( Zeile 10) und wenn du da drin bleibst, dann bleibst du da drin. ;)

Du musst da ganz normal wieder raus und einfach z.B keine Update Funktionen aufrufen, wenn du im Pausenmodus bist.

little_Progger

Treue Seele

  • »little_Progger« ist der Autor dieses Themas

Beiträge: 188

Wohnort: Nähe Bielefeld

Beruf: Azubi

  • Private Nachricht senden

3

29.03.2010, 12:37

Gut, Danke erstmal für den Tipp.
Nun habe ich das ganze in die Game Run Funktion verlegt und dann mit einer If und else Funktion
geschrieben nur jetzt habe ich das Problem das erstens die Pause nur solange anhält wie ich p drücke (und das ist ja nich der Sinn) und das Spiel im Hintergrund trotzdem weiterläuft obwohl ich mit der Bedingung alle Update Funktionen nur aufrufe wenn p nicht gedrückt ist.

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

4

29.03.2010, 12:47

Dann musst du halt schauen welches Event es sein muss. Du willst ja nur einen Schalter, wenn p gedrückt worden ist.

Ich weiss jetzt nicht genau, wie das bei der SDL ausschaut, aber ich hätte gesagt, dass das hier reichen müsste:

C-/C++-Quelltext

1
2
3
4
      case (SDLK_p):
      {
        m_bLockP = !m_bLockP;
       } break;

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

5

29.03.2010, 12:49

du darfst da keine schleife benutzen.
du musst du hauptschleife weiter laufen lassen und nur das aufrufen der updatefunktionen unterbinden.
wenn p gedrückt wird musst du nur den bool wert umschalten:

C-/C++-Quelltext

1
2
3
4
case (SDLK_p):
  {
            m_bLockP = !m_bLockP;
   } break;


edit: zu langsam -.-
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

little_Progger

Treue Seele

  • »little_Progger« ist der Autor dieses Themas

Beiträge: 188

Wohnort: Nähe Bielefeld

Beruf: Azubi

  • Private Nachricht senden

6

29.03.2010, 12:57

So schaut es jetzt aus und läuft auch nur es unterbindet irgendwie nur das Updaten des Video Subsystems, den wenn man die Pause kurz macht sieht man dies schön an der Position der Asteroiden die sich während der Pause verändert hat.

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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
// Run
//
// Aufgabe: Hauptschleife des Spiels
//
void CGame::Run ()
{
  // Hauptschleife des Spiels durchlaufen
  //
  while (m_bGameRun == true)
  {
    // Events bearbeiten
    ProcessEvents ();
    
    if (m_bLockP == false)
    {
        // Framework updaten und Buffer löschen
        g_pFramework->Update ();
        g_pFramework->Clear ();

        // Hintergrundbild rendern
        m_pSpriteBackground->Render ();

        // Lebensanzeige rendern
        HealthUpdate ();

        // Spieler updaten und rendern
        m_pPlayer->Update ();
        m_pPlayer->Render ();

        // Neue Asteroiden hinzufügen
        SpawnAsteroids ();

        // Kollisionen prüfen
        CheckCollisions ();

        // Asteroiden rendern
        RenderAsteroids ();

        // Buffer flippen
        g_pFramework->Flip ();
    }
  }
} // Run


// ProcessEvents
//
// Aufgabe: Events bearbeiten
//
void CGame::ProcessEvents ()
{
  SDL_Event Event;

  // Gab es ein Event?
  if (SDL_PollEvent (&Event))
  {
    // Ja, also schauen welches
    switch (Event.type)
    {
      // Beenden?
      case (SDL_QUIT):
      {
        m_bGameRun = false;

      } break;

      // Wurde eine Taste gedrückt?
      case (SDL_KEYDOWN):
      {
        switch (Event.key.keysym.sym)
        {
          case (SDLK_ESCAPE):
          {
            // Ja, also Spiel beenden
            m_bGameRun = false;

          } break;

          case (SDLK_p):
              {
                  m_bLockP = !m_bLockP;
                 
              }break;
        }
      }
    }
  }
} // ProcessEvents

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

7

29.03.2010, 13:06

du musst den buffer trotzdem flippen damit die frametime erneuert wird. ausserdem willst du ja vielleicht ein fenster rendern das die pause anzeigt.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

little_Progger

Treue Seele

  • »little_Progger« ist der Autor dieses Themas

Beiträge: 188

Wohnort: Nähe Bielefeld

Beruf: Azubi

  • Private Nachricht senden

8

29.03.2010, 13:17

also das Framework soll ich Updaten aber den Rest nicht?

Ja das mit dem Fenster nicht direkt, aber später wenn ich das mit der ttf library der SDL raus hab,
möchte ich in der mitte des Bildschirms "Pausiert" oder sowas schreiben. Naja dafür muss ich
noch schaun wie ich das mach, aber erstmal soll ja das mit der Pause selbst Funktionieren.

Hab grad mal das mit dem Framework aktualisieren ausprobiert und mit dem flipen, aber wenn ich flipe wird das Bild schwarz,
weil ja nichts anderes ins Fenster gerendert wird.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

9

29.03.2010, 13:20

dann ruf doch die renderfunktionen auf. :rolleyes:
es geht um die frametime. wenn du das framework nicht updatest wird die frametime so lang wie deine pause.
du könntest natürlich auch ne funktion schreiben die die frametime auf 0 setzt die du dann am ende der pause aufrufst...
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

little_Progger

Treue Seele

  • »little_Progger« ist der Autor dieses Themas

Beiträge: 188

Wohnort: Nähe Bielefeld

Beruf: Azubi

  • Private Nachricht senden

10

29.03.2010, 13:31

klappt nich ^^ ich Flippe nich. Ich werde wenn ich dann einen "Pause" Schriftzug auf den screen packe, dass ich Einmal mit ner else Bedingung den Schriftzug render.

Irgendwie so.

Danke für eure Hilfe Leute :)

Werbeanzeige