Du bist nicht angemeldet.

Werbeanzeige

BlueCobold

Community-Fossil

Beiträge: 10 860

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

11

05.06.2017, 13:06

Siehe edit. Beitrag #9 bitte erneut lesen.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

12

05.06.2017, 13:06

Ich würde dir übrigens raten von std::list zu std::vector zu wechseln und frage mich, was mit dem cAsteroid* passiert, wenn du ihn aus der Liste wirfst. Wird der korrekt gelöscht? Dazu wäre vielleicht ein Blick auf std::unique_ptr eine gute Sache.


Der Asteroid hat einen Destruktor der folgendermaßen aussieht:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
cAsteroid::~cAsteroid()
{
    delete pAstTexture;
    delete pAstSprite;

    pAstTexture = nullptr;
    pAstSprite = nullptr;
}

Schorsch

Supermoderator

Beiträge: 5 196

Wohnort: Wickede

Beruf: Student

  • Private Nachricht senden

13

05.06.2017, 13:12

Der Asteroid hat einen Destruktor der folgendermaßen aussieht:

Es geht ja nicht darum ob der Asteroid sobald er gelöscht wird hinter sich aufräumt sondern ob der Asteroid überhaupt gelöscht wird. Nur weil du einen Zeiger aus einer Liste nimmst heißt dass nicht dass der Speicher auch gelöscht wird. In deinem Buch hast du sicherlich mal das Stichwort delete gesehen. Anstatt Zeiger von Hand zu behandeln solltest du aber lieber zu Smart Pointern wechseln. BlueCobold hat ja schon das Stichwort std::unique_ptr in den Raum geworden.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

14

05.06.2017, 13:14

Es funktioniert... fast

Siehe edit. Beitrag #9 bitte erneut lesen.

Das ist jetzt schon mal ein großer Schritt nach vorne :)
Der erste Schuss wird tatsächlich gelöscht, und auch der Asteroid ist weg! Bei den späteren ist das nicht der Fall :(
Erreicht habe ich das jetzt durch platzieren der Funktion

C-/C++-Quelltext

1
es = ShotList->begin();
in der Intersect if Schleife

Ein weiteres Problem ist, dass der Spieler im Moment auch noch keinen Schaden erleidet

NachoMan

Community-Fossil

Beiträge: 3 905

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

15

05.06.2017, 13:20

C-/C++-Quelltext

1
2
3
4
5
6
7
8
cAsteroid::~cAsteroid()
{
    delete pAstTexture;
    delete pAstSprite;

    pAstTexture = nullptr;
    pAstSprite = nullptr;
}

Jeder Asteroid hat seine eigene Texture? Das ist keine gute Idee. Du solltest die Texture nur einmal laden und dann dem Asteroiden übergeben.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Schorsch

Supermoderator

Beiträge: 5 196

Wohnort: Wickede

Beruf: Student

  • Private Nachricht senden

16

05.06.2017, 13:21

in der Intersect if Schleife

Es gibt keine if-Schleife. Warum willst du bei einer Kollision den Iterator auf den Start der Liste setzen? Dann fängst du bei jeder Kollision an die Liste von vorne zu durchlaufen.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

17

05.06.2017, 13:22

Zitat

Es geht ja nicht darum ob der Asteroid sobald er gelöscht wird hinter sich aufräumt sondern ob der Asteroid überhaupt gelöscht wird. Nur weil du einen Zeiger aus einer Liste nimmst heißt dass nicht dass der Speicher auch gelöscht wird.


D.h. ich steuere hier vielleicht auf einen mächtigen Memory Leak zu?

18

05.06.2017, 13:29

Zitat

Es gibt keine if-Schleife. Warum willst du bei einer Kollision den Iterator auf den Start der Liste setzen? Dann fängst du bei jeder Kollision an die Liste von vorne zu durchlaufen.


Pardon :) eine if Schleife gibt es wirklich nicht :D Die Shot List habe ich jetzt an anderer Stelle auf Anfang gesetzt und siehe da, es funktioniert 8)

Hier noch einmal ein kurzer Auszug aus meinem Code:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
            if (es != ShotList->end())
                es++;
                
        }
        if (asteroidboundingBox.intersects(PlayerBox)) {
            if (*pPlayer->phealth >= 0.f)
                *pPlayer->phealth -= 0.5f;
        }


        if (it != asteroidList->end()) {
            it++;
            es = ShotList->begin();
        }



Was die Texturen betrifft
Jeder Asteroid hat seine eigene Texture? Das ist keine gute Idee. Du solltest die Texture nur einmal laden und dann dem Asteroiden übergeben.

, das werde ich noch überarbeiten, da wie gesagt, das mein erstes wirkliches Spiel ist :) Optimiert ist das ganze auf jeden Fall nicht aber, ich werde nach dem letzten Feinschliff mich darum kümmern, um mich an diesen Post erinnern!

Danke an Alle für eure Hilfe, ich wird mich jetzt nochmal dransetzten, das ganze Durchdenken, und dann wie vorgeschlagen, das auch auf std::Vector umstellen. Da das mein erstes Spiel ist, und ich (wie sicher nicht zu übersehen war) hier und da noch in einigen C++ Belangen hinterherhinke möchte ich mich besonders für eure Geduld bedanken!

Werbeanzeige