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

KOR

Frischling

  • »KOR« ist der Autor dieses Themas
  • Private Nachricht senden

1

20.03.2006, 18:02

Sehr Merkwürdige Kollisionen

So mal wieder ich. Also mein neuestes Problem betrifft Kollisionen. Ich hab das game aus dem Buch C++ für Spieleprogrammierer und wollte es so erweitern das man nicht mehr durch Asteroiden Fliegen kann. Habe also ne Variable für leben eingebaut und ne Kollisionsabfrage zwischen Schiff und Asteroiden nur die hat ne Macke:

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
void CGame::CheckCollisions ()
{
  // Schussliste des Spielers holen

  list<CShot> *ShotList = m_pPlayer->GetShotList ();

  // Iteratoren für Asteroiden- und Schussliste

  list<CAsteroid>::iterator ItAsteroid = m_AsteroidList.begin ();
  list<CShot>::iterator ItShot;

  // Rects für Asteroiden und Schüsse

  SDL_Rect RectAsteroid;
  SDL_Rect RectShot;
  SDL_Rect RectPlayer;
  CSprite *Player=m_pPlayer->GetPlayer();
  RectPlayer=Player->GetRect();

  // Alle Asteroiden durchlaufen

  while (ItAsteroid != m_AsteroidList.end () )
  {
    // Rect des Asteroiden holen

    RectAsteroid = ItAsteroid->GetRect ();

    if(  m_pPlayer->m_Invinsible==false  &&
         RectPlayer.y < RectAsteroid.y + RectAsteroid.h&&
         RectPlayer.y + RectPlayer.h > RectAsteroid.y &&
         RectPlayer.x < RectAsteroid.x + RectAsteroid.w &&
         RectPlayer.x + RectPlayer.w > RectAsteroid.x)
      {
          m_Lives-=1;
          m_pPlayer->m_Invinsible=true;
          m_pPlayer->Reset();
          if(m_Lives<=0)
          {
              m_bGameRun = false;
          }
      }
    // Alle Schüsse durchlaufen

    for (ItShot = ShotList->begin (); 
         ItShot != ShotList->end ();
         ++ItShot)
    {
      // Rect des Schusses holen

      RectShot = ItShot->GetRect ();

      // Überschneiden sich die Rects?

      if (RectShot.y < RectAsteroid.y + RectAsteroid.h &&
          RectShot.y + RectShot.h > RectAsteroid.y &&
          RectShot.x < RectAsteroid.x + RectAsteroid.w &&
          RectShot.x + RectShot.w > RectAsteroid.x)
      {
        // Ja, also gab es eine Kollision. Somit Schuss und

        // Asteroid deaktivieren

        ItAsteroid->SetAlive (false);
        ItShot->SetAlive (false);
        m_pPoints->Increase(1);
      }

    }
    // Asteroid löschen, falls deaktiviert

    if (ItAsteroid->IsAlive () )
      ItAsteroid++;
    else
      ItAsteroid = m_AsteroidList.erase (ItAsteroid);

  }
  m_pPlayer->m_Invinsible=false;

} // CheckCollision


Ich hab das ganze mal durch nen debugger laufen lassen:
Das erste mal bleibt der mit den werten in der if Schleife Hängen:
Asteroid h=128
Asteroid.w=640
Asteroid.x=41
Asteroid.y=-60
Player.h=64
Player.w=64
Player.x=376
Player.y=520
invinsible=0
so dann wenn ich jetzt das ganze mal so durch rechne:
false
520<-60+128//da müsste er doch schon rausfliegen
520+64>-60
376<41+640
376+64>41
des weiteren ist mir nicht so ganz klar wieso die Asteroiden ne höhe von 128 und ne breite von 640 haben
würde mich über hilfe freuen.
Diplomatie ist die Kunst guter Hund zu sagen, während man gleichzeitig nach dem nächst größeren Stein ausschau hält.