Suchergebnisse
Suchergebnisse 1-9 von insgesamt 9.
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...
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?
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
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; }
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++;
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 = (...
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 ...
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
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...