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

14.11.2010, 21:46

SDL Kollision

Hi Leute,

habe leider nochmal ein Problem. Ich wollte das Spiel aus Kapitel 12 um ein paar PowerUps erweitern.
Das Rendern + Updaten funktioniert auch ganz gut, nur komme ich mit der Kollisionserkennung nicht weiter.
Ich will, dass der Spieler ein Leben dazubekommt, wenn der mit dem PowerUps kollidiert.
Dazu habe ich:

- eine GetRect Funktion beim Player eingebaut (wie beim Asteroiden, funktioniert auch)
- Das Player Rect in der Update (genau: ProcessMoving) Funktion des Players aktualisiert (funktioniert auch)
- eine Liste mit den PowerUps erstellt (funktioniert auch, wird ja auch zum Rendern benötigt, was ja gut geht, wenn ich die kollision weglasse)

Der Abschnitt in der Funktion für Kollisionserkennung sieht dann 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
// Iteratoren für die Listen
     list<CPlusLife>::iterator ItPL = m_PlusLifeList.begin (); 

         //Rects 
         SDL_Rect RectPlayer; 
     SDL_Rect RectPlusLife; 

     RectPlayer = m_pPlayer->GetRect ();

     // Alle PlusLife durchlaufen  
     while (ItPL != m_PlusLifeList.end ()) 
     {
          RectPlusLife = ItPL->GetRect (); 
        
                  // Kollision mit Spieler prüfen 
         if (RectPlayer.y < RectPlusLife.y + RectPlusLife.h &&
             RectPlayer.y + RectPlayer.h > RectPlusLife.y && 
             RectPlayer.x < RectPlusLife.x + RectPlusLife.w && 
             RectPlayer.x + RectPlayer.w > RectPlusLife.x) 
         {
             ++m_Lives;
             ItPL->SetAlive(false);  
         }
     }


Das Problem ist jetzt, dass, immer wenn ein PowerUp gespawnt wird, sich das Spiel aufhängt.
Ich konnte den Fehler bereits eingrenzen. Er muss etwas mit der while schleife zu tun haben. Wenn ich die if Bedingung und das ganze andere Zeugs weglasse und nur die while Schleife durchlaufen wird (wenn etwas in der Liste ist, also direkt nach einem Spawn) hängt es sich auf. Wenn ich die while schleife weglasse, geht alles gut.
Mit dem Debugger geht das auch nicht so wirklich, ab dem Punkt, an dem die If-Bedingung durch ist, hängt sich auch im Debugger das Spiel auf, ohne dass irgendetwas im Debugger erscheint. Habe mehrere Haltepunkte gesetzt:
- beim Eintritt in die while schleife
- beim Eintritt in die if Bedingung
- nach der If Bedingung

Bei den ersten beiden Haltepunkten haben meiner Ansicht nach noch alle Variablen etc. gestimmt, erst nach der If-Bedingung hing es sich dann auf und es kam wie gesagt keine Ausgabe dazu.

Kann mir da bitte jemand helfen?

Danke im Voraus :)

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

2

14.11.2010, 21:56

ein

C-/C++-Quelltext

1
++ItPL;
fehlt

forschleifen sind für soetwas besser geeignet(dann passiert dir soetwas auch nicht^^)
"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?

3

14.11.2010, 21:57

Du hast vergessen am Ende der Schleife den Iterator zu addieren :P
Da folgt ne Endlos-Schleife -> Absturz

EDIT: Mist da wr jemand mal wieder schneller :D

4

14.11.2010, 22:00

Super, danke :)
Funktioniert jetzt alles.

Werbeanzeige