ich bin gerade dabei, das sdl spiel (kapitel 12) zu erweitern.
ich habe eine kollisionskontrolle zwischen spieler und asteroid eingebaut, die auch funktioniert. nun möchte ich, das der player bei einer kollision ein leben verliert. hier mal meine checkCollision methode und meine PlayerHit methode:
|
Quellcode
|
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
89
90
91
92
93
94
95
96
97
98
|
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;
// Alle Asteroiden durchlaufen
while (ItAsteroid != m_AsteroidList.end () )
{
// Rect des Asteroiden und players holen
RectAsteroid = ItAsteroid->GetRect ();
RectPlayer = m_pPlayer->GetRect();
//rect des players holen
RectPlayer = m_pPlayer->GetRect();
// Überschneiden sich die Rects (asteroid spieler)?
if (RectPlayer.y < RectAsteroid.y + RectAsteroid.h &&
RectPlayer.y + RectPlayer.h > RectAsteroid.y &&
RectPlayer.x < RectAsteroid.x + RectAsteroid.w &&
RectPlayer.x + RectPlayer.w/10 > RectAsteroid.x) {
// Ja, also gab es eine Kollision
cout << "kollision" << endl;
ItAsteroid->SetAlive (false);
cout << "rectplayer.x: " << RectPlayer.x << endl;
cout << "rectplayer.y: " << RectPlayer.y << endl;
m_pPlayer->SetAlive(false);
if (!m_pPlayer->IsAlive() ) {
PlayerHit();
}
}
// 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);
cout << "treffer" << endl;
}
}
// Asteroid löschen, falls deaktiviert
if (ItAsteroid->IsAlive () ) {
ItAsteroid++;
} else {
ItAsteroid = m_AsteroidList.erase (ItAsteroid);
}
}
} // CheckCollision
void CGame::PlayerHit() {
int lives = m_pPlayer->GetLives();
lives--;
cout << lives << endl;
m_pPlayer->SetAlive(true);
}
|
bei einer kollsion wird auch angezeigt, der player hat nurnoch 2 leben. also eins wird angezeigt. aber das wiederholt sich bei JEDER kollision, heißt es ist immer 2.
ich schätzte, es geht in die richtung, dass ich mir immerwieder den wert per getLives hole. zudem initialisiere ich lives in der player init methode. ich nehme an, ich benutzte garnicht den veränderten wert...
aber ich komme momentan auf keine löung
wäre nett wenn jemand mir helfen könnte