Hallo Leute, sitze schon seit Tagen daran und finde keine Lösung für folgendes Problem. (Visual Studio 10 C++ mit SFML 2.1)
In Anlehnung an den alten Beitrag zu einem ähnlichen Fall, der nunmehr weit über 2 Jahre zuürckliegt, (vgl.
, habe ich versucht den dortigen Lösungsansatz aus Beitrag#6 (remove_if als Struct-Variante) umzusetzen.
Bisher leider ohne Erfolg. Hier ist der Ausgangscode, wo der Iterator nach Löschen des letzten Sprites den Fehler "Vektor Iterator nicht inkrementierbar" erzeugt.
Jetzt wollte ich fragen, wie man das richtig umsetzt. Es geht lediglich um den Erase-Befehl und diese remove_if oder andere unbekannte Alternativen, der übrige Code ist fürs Verständnis da und zur freien Verwendung.
Sorry für den vielen Code. Das ist der neue Code:
Jetzt hat er mir bei der Struct nach und nach alles als Fehler markiert, wenn ich z.B. das e oder current_hp entfernen wollte. Wie kann man den Code richtig machen, dass er keinen Fehler mehr anzeigt. Ich weiß, diese Struct ist falsch, aber weiß nicht was. In den Büchern/Dokumentation wird das alles nur allgemein beschrieben und hilft hier überhaupt nicht weiter. Ich möchte einfach die letze Einheit löschen können bzw. in der unteren Variante das Programm überhaupt zum laufen zu bekommen :-) Bitte helft mir.
In Anlehnung an den alten Beitrag zu einem ähnlichen Fall, der nunmehr weit über 2 Jahre zuürckliegt, (vgl.
HTML:
https://www.computerbase.de/forum/threads/objekte-aus-vector-loeschen-waehrend-der-iterator-duch-den-vector-geht.957663/
Bisher leider ohne Erfolg. Hier ist der Ausgangscode, wo der Iterator nach Löschen des letzten Sprites den Fehler "Vektor Iterator nicht inkrementierbar" erzeugt.
Jetzt wollte ich fragen, wie man das richtig umsetzt. Es geht lediglich um den Erase-Befehl und diese remove_if oder andere unbekannte Alternativen, der übrige Code ist fürs Verständnis da und zur freien Verwendung.
Code:
#include <SFML/Graphics.hpp>
#include <iostream>
#include <sstream>
#include <vector>
#include <algorithm>
int main()
{
sf::RenderWindow mMainWindow(sf::VideoMode(1000, 600), "Map");
mMainWindow.setFramerateLimit(30);
sf::Image unitimage;
unitimage.loadFromFile("unit.png");
sf::Texture unittexture;
unittexture.loadFromImage(unitimage);
sf::Sprite unitsprite(unittexture);
std::vector<sf::Sprite>EnemyVector;
std::vector<sf::Sprite>::iterator EnemyIt;
while (mMainWindow.isOpen())
{
sf::Event event;
while (mMainWindow.pollEvent(event))
{
if (event.type == sf::Event::Closed)
{
mMainWindow.close();
}
if(event.type == sf::Event::MouseButtonPressed)
if(event.mouseButton.button == sf::Mouse::Left)
{
sf::Sprite *Sprite;
Sprite = new sf::Sprite;
Sprite->setTexture(unittexture);
Sprite->setPosition(sf::Mouse::getPosition(mMainWindow).x,sf::Mouse::getPosition(mMainWindow).y);
EnemyVector.push_back(*Sprite);
std::cout << "Objects count: " << EnemyVector.size() << std::endl;
}
}
for(EnemyIt = EnemyVector.begin();EnemyIt != EnemyVector.end();EnemyIt++)
{
mMainWindow.draw(*EnemyIt);
if(event.mouseButton.button == sf::Mouse::Right)
{
sf::Vector2f mousecoords(mMainWindow.mapPixelToCoords(sf::Vector2i(event.mouseButton.x, event.mouseButton.y)));
if(EnemyIt->getGlobalBounds().contains(mousecoords))
{
EnemyVector.erase(EnemyIt);
EnemyIt = EnemyVector.begin();
}
}
}
mMainWindow.display();
mMainWindow.clear(sf::Color(0, 200, 0, 255));
}
return 0;
}
Sorry für den vielen Code. Das ist der neue Code:
Jetzt hat er mir bei der Struct nach und nach alles als Fehler markiert, wenn ich z.B. das e oder current_hp entfernen wollte. Wie kann man den Code richtig machen, dass er keinen Fehler mehr anzeigt. Ich weiß, diese Struct ist falsch, aber weiß nicht was. In den Büchern/Dokumentation wird das alles nur allgemein beschrieben und hilft hier überhaupt nicht weiter. Ich möchte einfach die letze Einheit löschen können bzw. in der unteren Variante das Programm überhaupt zum laufen zu bekommen :-) Bitte helft mir.
Code:
#include <SFML/Graphics.hpp>
#include <iostream>
#include <sstream>
#include <vector>
#include <algorithm>
struct IsEnemyDead {
bool operator() (const Sprite& e) const {
return e current_hp <= 0;
}
};
int main()
{
sf::RenderWindow mMainWindow(sf::VideoMode(1000, 600), "Map");
mMainWindow.setFramerateLimit(30);
sf::Image unitimage;
unitimage.loadFromFile("unit.png");
sf::Texture unittexture;
unittexture.loadFromImage(unitimage);
sf::Sprite unitsprite(unittexture);
std::vector<sf::Sprite>EnemyVector;
std::vector<sf::Sprite>::iterator EnemyIt;
while (mMainWindow.isOpen())
{
sf::Event event;
while (mMainWindow.pollEvent(event))
{
if (event.type == sf::Event::Closed)
{
mMainWindow.close();
}
if(event.type == sf::Event::MouseButtonPressed)
if(event.mouseButton.button == sf::Mouse::Left)
{
sf::Sprite *Sprite;
Sprite = new sf::Sprite;
Sprite->setTexture(unittexture);
Sprite->setPosition(sf::Mouse::getPosition(mMainWindow).x,sf::Mouse::getPosition(mMainWindow).y);
EnemyVector.push_back(*Sprite);
std::cout << "Objects count: " << EnemyVector.size() << std::endl;
}
}
for(EnemyIt = EnemyVector.begin();EnemyIt != EnemyVector.end();EnemyIt++)
{
mMainWindow.draw(*EnemyIt);
if(event.mouseButton.button == sf::Mouse::Right)
{
sf::Vector2f mousecoords(mMainWindow.mapPixelToCoords(sf::Vector2i(event.mouseButton.x, event.mouseButton.y)));
if(EnemyIt->getGlobalBounds().contains(mousecoords))
{
EnemyVector.erase(
std::remove_if(
EnemyVector.begin(), EnemyVector.end(),
IsEnemyDead()),
EnemyVector.end()
);
EnemyIt = EnemyVector.begin();
}
}
}
mMainWindow.display();
mMainWindow.clear(sf::Color(0, 200, 0, 255));
}
return 0;
}
Zuletzt bearbeitet: