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

09.08.2015, 13:36

SDL_Game [Listing 12] Erweiterung - Übergabe von einer Variable

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 :D
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...

2

09.08.2015, 13:44

Die Instanz von CAsteroid wird wohl invalid sein.

MfG
Check

3

09.08.2015, 13:58

Wenn sie ungültig wäre, würde das Übergeben der Werte doch garnet funktionieren, oda?

4

09.08.2015, 14:08

Du rufstdie 'setDamage'-Methode vom einem nicht (mehr?) existierenden Objekt auf. Erst wenn du auf die Member dieses Objektes zugreifst, also auf irgendeinen Speicherbereich, tritt der Fehler auf.

5

09.08.2015, 16:26

Sowas in der Art habe ich mir schon gedacht, jetzt muss ich nur mehr draufkommen, wie man
des am besten löst ^^ werd noch ein wenig herumtüffteln

6

09.08.2015, 17:30

Debuggen. ;)

MfG
Check

7

09.08.2015, 22:30

Hab mich nochmal rangesetzt und jetzt hab ich das Problem ein wenig anders gelöst. Und zwar ohne
eigener Funktion und direkt in der while-Schleife der Game.cpp. Nicht in der Hauptschleife sondern
dort wo die ganzen Asteroiden abgearbeitet werden (Liste). Dort konnte ich mir als Bezugspunkt der Y-Koordinate
auch den Rect des Asteroiden zu nutze machen. Ich weiß nicht ob das unbedingt eine schöne Lösung ist,
aber sie funktioniert und damit bin ich vorerst mal zufrieden. Und nachdem ich noch ein paar Kleinigkeiten
geändert habe, kann ich nur das Projekt SDL_Game Erweiterung abschließen, danke nochmal für die Hilfe.
Hier noch ein Auszug aus dem Code mit dem es funzt :D

Game.cpp

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// Alle Asteroiden durchlaufen
    while (ItAsteroid != m_AsteroidList.end())
    {
        // Rect des Asteroiden und Player holen
        RectAsteroid = ItAsteroid->GetRect();
        RectPlayer = m_pPlayer->GetRect();

        // Schaden an Erde, wenn Asteroid am unteren
        // Bildrand verschwindet
            if (RectAsteroid.y >= 590.0f)
                m_Health -= 20;

            if (m_Health == 0)
                m_pText->RenderText("GAME OVER", 320, 270);

            if (m_Health <= 0)
            {
                m_Health = 0;
                m_fLeben = 3.0f; // Lebensbalken ausblenden
            }

Werbeanzeige