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.