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

BlueCobold

Community-Fossil

Beiträge: 10 738

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 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • 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 885

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 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • 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