Verwaltung von Sprites in einem Spiel => Crash



  • Hallo,
    um es möglich zu machen mehrere Schüsse darzustellen benutze ich eine std::list in der ich diese verwalte. Sobald der Bildschirmbereich verlassen wurde, soll der Schuss aus der Liste gelöscht werden damit ich nicht irgendwann 100000000000... Einträge habe. Leider stürzt mein Programm dabei immer ab 😞

    Es greift wohl auf einen falschen Speicherbereich zu.

    Hier mein Code:

    for (std::list<class Projectile *>::iterator it = projectiles.begin(); it != projectiles.end(); ++it) {
    	(*it)->think(elapsedTime);
    	if ((*it)->erase()) {
    		delete (*it);
    		it = projectiles.erase(it);
    	}
    	Draw((*it)->getSprite());
    }
    

    Wie kann ich das Problem beheben? Bitte um eure Hilfe. So schwer kann das doch nicht sein... 😞

    Vielen Dank im Voraus,
    ProblemeHabeIch



  • Wieso eine list mit Zeigern?

    Das macht das alles nur unübersichtlicher.

    Ansonsten sieht alles korrekt aus, eventuell solltest du mal schauen ob du NULL-Pointer, bzw. ungültige Pointer in der Liste hast.



  • Du inkrementierst deinen Iterator zweimal, wenn du am Ende der Liste löscht.

    Vielleicht geht das so:

    std::list<class Projectile *>::iterator it = projectiles.begin();
    while (it != projectiles.end()) {
        (*it)->think(elapsedTime);
        if ((*it)->erase()) {
            delete (*it);
            it = projectiles.erase(it);
        } else {
          Draw((*it)->getSprite());
          ++it;
        }
    }
    


  • ProgChild schrieb:

    Du inkrementierst deinen Iterator zweimal, wenn du am Ende der Liste löscht.

    Vielleicht geht das so:

    std::list<class Projectile *>::iterator it = projectiles.begin();
    while (it != projectiles.end()) {
        (*it)->think(elapsedTime);
        if ((*it)->erase()) {
            delete (*it);
            it = projectiles.erase(it);
        } else {
          Draw((*it)->getSprite());
          ++it;
        }
    }
    

    Wow. Danke 🙂 So klappts bestens 🙂 Lässt sich der Code vielleicht noch etwas verkürzen?



  • ProblemeHabeIch schrieb:

    Wow. Danke 🙂 So klappts bestens 🙂 Lässt sich der Code vielleicht noch etwas verkürzen?

    Mir ist kein wesentlicher Weg dafür bekannt.


Anmelden zum Antworten