Rätsle schon seit über einem Tag über ein unerklärliches Problem, das sich wie folgt äußert:
Habe 3 kleine Bilder ins Fenster geladen. (vgl. Anhang) Wenn ich jetzt z.B. die Farbe Rot feststellen lassen möchte, geht das nur bei den oberen beiden. Wenn ich jedoch auf das untere klicke, kommt ein Fehler "vector subscript out of range".
Laut debugger ist die Zeile mit dem sf::Color schuld. Bei Einsetzen des auskommentierten "break" ist der Fehler zwar weg, aber es tut sich dann nichts, wenn man sowohl auf das rechte als auch auf das untere Bild klickt.
Habe das auch mit bloß einem einzigen Bild versucht, das ich auf die Y-Position 100 (also die Stelle des unteren) gesetzt habe und da kommt auch der vector subscript.... Fehler. Hab schon alles versucht, wie ne 2. for Schleife oder Farbafrage an der nullten Vektorstelle etc. aber es geht aus unerklärlichen Gründen nicht. Wie lässt sich dieser Fehler beheben?
Habe 3 kleine Bilder ins Fenster geladen. (vgl. Anhang) Wenn ich jetzt z.B. die Farbe Rot feststellen lassen möchte, geht das nur bei den oberen beiden. Wenn ich jedoch auf das untere klicke, kommt ein Fehler "vector subscript out of range".
Laut debugger ist die Zeile mit dem sf::Color schuld. Bei Einsetzen des auskommentierten "break" ist der Fehler zwar weg, aber es tut sich dann nichts, wenn man sowohl auf das rechte als auch auf das untere Bild klickt.
Habe das auch mit bloß einem einzigen Bild versucht, das ich auf die Y-Position 100 (also die Stelle des unteren) gesetzt habe und da kommt auch der vector subscript.... Fehler. Hab schon alles versucht, wie ne 2. for Schleife oder Farbafrage an der nullten Vektorstelle etc. aber es geht aus unerklärlichen Gründen nicht. Wie lässt sich dieser Fehler beheben?
Code:
#include <SFML/Graphics.hpp>
#include <iostream>
#include <vector>
int main()
{
sf::RenderWindow mMainWindow(sf::VideoMode(1000,500), "Map", sf::Style::Close);
mMainWindow.setFramerateLimit(60);
sf::Image ImageName;
sf::Texture TextureName;
sf::Sprite SpriteName;
std::vector<sf::Image> ImageVector;
std::vector<sf::Texture> TextureVector;
std::vector<sf::Sprite> SpriteVector;
for(int i=0; i<3; i++)
{
ImageVector.push_back(ImageName);
TextureVector.push_back(TextureName);
SpriteVector.push_back(SpriteName);
}
for(int i=0; i<3; i++)
{
ImageVector[i].loadFromFile("test0.png");
TextureVector[i].loadFromImage(ImageVector[i]);
SpriteVector[i].setTexture(TextureVector[i]);
}
SpriteVector[0].setPosition(0,0);
SpriteVector[1].setPosition(100,0);
SpriteVector[2].setPosition(0,100);
int itpos = 0;
while (mMainWindow.isOpen())
{
sf::Event event;
sf::Vector2i mousePos;
bool leftclicked = false;
while (mMainWindow.pollEvent(event))
{
switch (event.type)
{
case sf::Event::Closed:
mMainWindow.close();
break;
case sf::Event::MouseButtonPressed:
if (event.mouseButton.button == sf::Mouse::Left)
{
leftclicked = true;
mousePos = sf::Vector2i(event.mouseButton.x, event.mouseButton.y);
break;
}
}
}
if(leftclicked)
{
for (auto& it=SpriteVector.begin(); it!=SpriteVector.end(); ++it)
{
if((*it).getGlobalBounds().contains(mousePos.x,mousePos.y))
{
itpos = it - SpriteVector.begin();
sf::Color color = ImageVector[itpos].getPixel(mousePos.x, mousePos.y);
std::cout << static_cast<int>(color.r) << std::endl;
}
// break;
}
}
mMainWindow.clear();
for (auto& it=SpriteVector.begin(); it!=SpriteVector.end(); ++it)
{
mMainWindow.draw(*it);
}
mMainWindow.display();
}
return 0;
}
Zuletzt bearbeitet: