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!

Suchergebnisse

Suchergebnisse 1-9 von insgesamt 9.

Werbeanzeige

05.06.2017, 13:29

Forenbeitrag von: »Fighter00HD«

Listen Element in C++ kann nicht korrekt gelöscht werden

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 Die Shot List habe ich jetzt an anderer Stelle auf Anfang gesetzt und siehe da, es funktioniert 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.interse...

05.06.2017, 13:22

Forenbeitrag von: »Fighter00HD«

Listen Element in C++ kann nicht korrekt gelöscht werden

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?

05.06.2017, 13:14

Forenbeitrag von: »Fighter00HD«

Es funktioniert... fast

Zitat von »BlueCobold« 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

05.06.2017, 13:06

Forenbeitrag von: »Fighter00HD«

Listen Element in C++ kann nicht korrekt gelöscht werden

Zitat von »BlueCobold« 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; }

05.06.2017, 13:04

Forenbeitrag von: »Fighter00HD«

Eine If Abfrage als Lösung?

Zitat von »BlueCobold« Die Schleifen sind aber noch immer nicht ganz korrekt. Siehe Kommentar #4. Du führst auf dem Iterator immer ein "++" aus, selbst dann, wenn er bereits auf "end()" zeigt, was zu Problemen führt. Das riecht ja förmlich nach einer if Abfrage - ist übrigens mein erstes "Spiel" deswegen bringt mich das eben auch etwas an meine Grenzen Ich hätte da an sowas gedacht C-/C++-Quelltext 1 2 if(it != asteroidList->end()) it++;

05.06.2017, 12:46

Forenbeitrag von: »Fighter00HD«

Listen Element in C++ kann nicht korrekt gelöscht werden

Also sieht der ganze Code mit einer while Schleife so aus: C-/C++-Quelltext 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 void cCollisionManager::checkCollision(cPlayer * pPlayer, std::list<cAsteroid*> *asteroidList, std::list<cShot*> *ShotList) { sf::FloatRect PlayerBox = pPlayer->getSprite()->getGlobalBounds(); auto it = asteroidList->begin(); auto es = ShotList->begin(); while (it != asteroidList->end()) { sf::FloatRect asteroidboundingBox = (...

05.06.2017, 12:26

Forenbeitrag von: »Fighter00HD«

Meine urpsrüngliche Idee sah etwas anders aus

Dieser ominöse StackOvflow Link besagt, das das Problem durch den Syntax asteroidList->erase(it++) beseitigt sein sollte. Wie gehabt schlagen die als Lösung auch eine while Schleife vor, die aber bei mir wegen der Implementierung in die SFML Schleife nicht funktioniert, da das Programm da dann einfach "hängen bleibt" EDITUrsprünglich habe ich das ganze sowieso im C++11 Stil gelöst, wobei gelöst eben dieses Problem beinhaltet C-/C++-Quelltext 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 ...

05.06.2017, 12:03

Forenbeitrag von: »Fighter00HD«

Listen Element in C++ kann nicht korrekt gelöscht werden

Erase liefert ja den vorherigen Iterator zurück. Und das kann man für gewöhnlich ja mit C-/C++-Quelltext 1 it=erase(it) erreichen Aber bei mir ändert sich an der Fehlermeldung dennoch nichts

05.06.2017, 11:38

Forenbeitrag von: »Fighter00HD«

Listen Element in C++ kann nicht korrekt gelöscht werden

Seit nunmehr 2 Tagen versuche ich ein recht fieses Problem aus der (also meinem Code) zu schaffen. Ich verwende die SFML um meine Grafiken auf den Bildschirm zu zaubern, und alles funktioniert, doch beim löschen der Listenelemente (asteroid, schuss) bekomme ich nur eine Fehlermeldung ausgespuckt. Lange rede kurzer Sinn - hier ist mein Code: C-/C++-Quelltext 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 void cCollisionManager::checkCollision(cPlayer * pPlayer...

Werbeanzeige