bonjour tous le monde,
Voila j'ai un petit soucis lié a la sfml vous vous en doutez et plus précisément avec la détection de clic:
je suis en train de coder un éditeur de map pour un petit projet:
le soucis etant que lorsque je clic sur ma souri, la detection a bien lieu mais plusieurs fois, quand je print les coordonne de ma souri au moment du clic cela s'affiche plusieurs fois et me donne des resultats bizarre pour editer les objets sur la map.
l'effet attendu est le suivant:
lorsque je clic sur un des sprites de ma fentre, le sprite (donc le type d'object sur la map en fait) doit changer, hors lorsque je clic, ca change plusieurs cases en meme temps ...
trève de bavardage je vous montre mon code
Merci d'avance a celui qui prendra du temps pour lire mon code.
#define WINDOWSIZE 1000
class Render
{
private:
std::vector<std::vector<Object *> > _list;
int *_size;
int *_players;
int *_rate;
Types _currentType;
sf::Image *_image[2];
public:
Render(int *size, int *players, int *rate);
~Render();
/****/
void setCurrentType(Types type);
void setList(std::vector<std::vector<Object *> > list);
std::vector<std::vector<Object *> > getList() const;
void print();
void putNewObj(int x, int y);
void sfmlLaunch();
static void *run(void *data);
void setImg();
};
void Render::setImg()
{
sf::Sprite *sprite;
for (std::vector<std::vector<Object *> >::iterator it = this->_list.begin(); it != this->_list.end(); ++it)
{
for (std::vector<Object *>::iterator it2 = (*it).begin(); it2 != (*it).end(); ++it2)
{
sprite = new sf::Sprite();
if ((*it2)->getType() == UNDESTRUCTIBLEWALL)
sprite->SetImage(*(this->_image[0]));
else if ((*it2)->getType() == NONE)
sprite->SetImage(*(this->_image[1]));
sprite->SetPosition((*it2)->getX(), (*it2)->getY());
sprite->Resize(WINDOWSIZE / (*this->_size), WINDOWSIZE / (*this->_size));
(*it2)->setSprite(sprite);
}
}
}
void Render::putNewObj(int x, int y)
{
sf::Sprite *sprite;
std::cout << x << "-" << y << std::endl;
for (std::vector<std::vector<Object *> >::iterator it = this->_list.begin(); it != this->_list.end(); ++it)
{
for (std::vector<Object *>::iterator it2 = (*it).begin(); it2 != (*it).end(); ++it2)
{
if (((*it2)->getX() >= x) && (x <= ((*it2)->getX() + (WINDOWSIZE / (*this->_size)))) && ((*it2)->getY() >= y) && (y <= ((*it2)->getY() + (WINDOWSIZE / (*this->_size)))))
{
sprite = new sf::Sprite();
sprite->SetImage(*(this->_image[0]));
sprite->SetPosition((*it2)->getX(), (*it2)->getY());
sprite->Resize(WINDOWSIZE / (*this->_size), WINDOWSIZE / (*this->_size));
delete((*it2)->getSprite());
(*it2)->setSprite(sprite);
}
}
}
}
void Render::sfmlLaunch()
{
sf::RenderWindow app(sf::VideoMode(WINDOWSIZE, WINDOWSIZE, 32), "mapGenerator");
while (app.IsOpened())
{
sf::Event event;
while (app.GetEvent(event))
{
if (event.Type == sf::Event::Closed)
app.Close();
}
const sf::Input &input = app.GetInput();
if(event.Type == sf::Event::MouseButtonPressed)
{
sf::Mouse::Button button = event.MouseButton.Button;
if (button == sf::Mouse::Left)
this->putNewObj(input.GetMouseX(), input.GetMouseY());
}
app.Clear();
for (std::vector<std::vector<Object *> >::iterator it = this->_list.begin(); it != this->_list.end(); ++it)
{
for (std::vector<Object *>::iterator it2 = (*it).begin(); it2 != (*it).end(); ++it2)
app.Draw(*((*it2)->getSprite()));
}
app.Display();
}
}