Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: Detection clic multiple  (Lu 2095 fois)

0 Membres et 1 Invité sur ce sujet

bottus

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
    • E-mail
Detection clic multiple
« le: Mai 19, 2013, 05:45:40 pm »
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();
    }
}
 
« Modifié: Mai 20, 2013, 05:22:59 pm par bottus »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Detection clic multiple
« Réponse #1 le: Mai 19, 2013, 08:23:00 pm »
N'utilise pas ton évènement en dehors de la boucle d'évènements, il a un contenu indéfini (seul un retour à "true" de GetEvent t'assure que ton sf::Event a été rempli avec des trucs valides -- donc en dehors de ton "while(window.GetEvent)" tu n'as pas d'évènement à inspecter).
Laurent Gomila - SFML developer

bottus

  • Newbie
  • *
  • Messages: 4
    • Voir le profil
    • E-mail
Re : Detection clic multiple
« Réponse #2 le: Mai 20, 2013, 05:22:32 pm »
Soucis resolu, merci Laurent.