SFML鼠标单击检测

时间:2015-05-21 11:31:21

标签: c++ events click mouse sfml

我用SFML库编写游戏代码。 我有一些按钮,当我点击时,我想做点什么。

但我有一个问题,我不知道如何检测一个简单的点击,而不是释放按键或按下按键,只需点击一下。

我写这段代码:

游戏循环:

void                            GameEngine::gameLoop()
{
  Menu                                  menu(_win);

  while (_win.isOpen() && gl_quit == false)
    {
      sf::Event         event;
      while (_win.pollEvent(event))
        {
          if (event.type == sf::Event::Closed)
            _win.close();
        }
      menu.mouseEvent(event);
      menu.keyboardEvent();

      menu.calcul();
      menu.reDraw();

      _win.display();
      _win.clear();
    }
}

Menu.cpp

bool                            Menu::mouseEvent(sf::Event &event)
{
  if (event.type == sf::Event::MouseButtonReleased)
    {
      if (event.mouseButton.button == sf::Mouse::Left)
        {
          for (std::map<std::string, Button *>::iterator it = _buttons.begin();
               it != _buttons.end(); ++it)
            {
              if (it->second->collide(sf::Mouse::getPosition(_win)))
                (this->*(it->second->getAction()))();
            }
        }
    }
}

例如,当我点击&#34; Play&#34;按钮,此方法称为:

void                            Menu::on_Jouer_clicked()
{
  std::cout << "fct jouer" << std::endl;
}

这就是结果:

~/Projet/gametest :./game 
fct jouer
fct jouer
fct jouer
fct jouer
fct jouer
fct jouer
fct jouer
fct jouer
fct jouer
fct jouer
fct jouer
fct jouer
fct jouer
fct jouer
fct jouer
fct jouer

该函数调用次数过多。

3 个答案:

答案 0 :(得分:1)

不确定我是否记得正确但你不能用这样的东西来检查鼠标点击(同时指明左键或右键点击)

if (event.type == sf::Event::MouseButtonPressed)

如果您希望检查指定点击的位置,那么您可以使用下面的内容并检查它是否在所提到按钮的范围内:

sf::Vector2i position = sf::Mouse::getPosition();

然后你可以使用位置变量(position.x和position.y作为特定坐标)进行检查。

答案 1 :(得分:0)

以下是我用来检测鼠标点击的内容:

sf::Vector2i Block_Until_Mouse_Click(){

    static bool pressed=false;
    sf::Vector2i position;
    while (true){

      if (sf::Mouse::isButtonPressed(sf::Mouse::Left))
      {
          if (!pressed){
            position = sf::Mouse::getPosition();
            pressed=true;
            break;
          }
      }
      else{
        pressed = false;
      }   
    }

    return position;
}

这样,您只能获得鼠标点击坐标,而不是鼠标仍处于停机状态时的坐标。

auto position = Block_Until_Mouse_Click();
std::cout << position.x << " " << position.y << '\n';

答案 2 :(得分:0)

当我搜索鼠标事件时,它总是出现在谷歌搜索中。 :)

可以检测鼠标点击是按下还是释放,就像你已经在做的那样

if (event.type == sf::Event::MouseButtonReleased)

此外,它可以进一步指定为左按钮或右按钮。

if (event.mouseButton.button == sf::Mouse::Left)

同样可以通过 event.mouseButton [X|Y] 属性获取相对于窗口的鼠标坐标。

if (event.type == sf::Event::MouseButtonPressed)
{
    if (event.mouseButton.button == sf::Mouse::Left)
    {
        std::cout << "mouse x: " << event.mouseButton.x << std::endl;
        std::cout << "mouse y: " << event.mouseButton.y << std::endl;
    }
}