Hallo, ich bin gerade dabei meine letzte Erweiterung in das Spiel von Listing 12 zu implementieren und zwar diese:
Jedes mal, wenn ein Asteroid den Bildschirm verlässt, also nicht abgeschossen wird oder mit dem Raumschiff kollidiert,
sollen 10% vom Zustand der Erde abgezogen werden. Bei 0% wird Game Over angezeigt.
Aber das wirft mir immer eine Zugriffsverletzung bei der If-Abfrage aus, alles andere funktioniert. Aber hier erstmal ein
Auszug aus den Codes:
Game.hpp, hier wird eine Funktion (CheckHealthEarth) erstellt, der den aktuellen Zustand der Erde anzeigt und eine
neue Instanz des Asteroiden erstellt, der den Schaden übergeben soll:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
private:
void ProcessEvents ();
void SpawnAsteroids ();
void SpawnExtraLife ();
void RenderAsteroids ();
void RenderExtraLifes ();
void CheckCollisions ();
void RenderExplosions();
void Text ();
void CheckHealthEarth();
CPlayer *m_pPlayer; // Spieler-Instanz
CAsteroid *m_pAsteroid; // Asteroiden-Instanz
|
Game.cpp
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
// CheckHealthEarth
//
// Aufgabe: Zustand der Erde anzeigen
//
void CGame::CheckHealthEarth()
{
m_Health -= m_pAsteroid->SetDamage();
if (m_Health <= 0)
{
m_pText->RenderText("GAME OVER", 320, 270);
m_Points = 0;
m_Health = 0;
}
}
|
So, nun zu dem Punkt wo der Fehler ausgelöst wird. Asteroiden.cpp
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
// SetDamage
//
// Aufgabe: Wenn Asteroid aus Bild verschwindet, Schaden übergeben
//
int CAsteroid::SetDamage()
{
int Temp = 0;
if (m_fYPos > 590.0f)
Temp = 10;
return (Temp);
} // SetDamage
|
Der Fehler tritt bei der if-Abfrage auf und ich komm net drauf warum. Ich hab wohl irgendeinen Denkfehler.
Also die Funkion CheckHealthEarth checkt wie der Name schon sagt, die ganze Zeit den Zustand der Erde
ab. Wenn ein Asteroid nun den Bildschirmrand verlässt, sollt die temporäre Variable den Wert 10 annehmen
und diesen der Funktion zurückgeben.
Wenn ich die if-Anweisung auskommentiere und Temp auf zb 1 setze, funktioniert die das Ganze. Nur
es wird halt bei jedem Durchlauf, eins abgezogen und somit is das Spiel nach 3 Sekunden vorbei
Aber das wollte ich nur erwähnen um zu zeigen, dass es ohne die if-Anweisung funktioniert.
Beim Schreiben ist mir gerade die Idee gekommen, ob ich nicht vl eine Liste benötige? Und jeden
Asteroiden der unten verschwindet hineinschiebe und dann die Punkte abziehe...