2015-05-21 286 views
0

我使用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()))(); 
      } 
     } 
    } 
} 

再举例来说,当我点击 “播放” 按钮,该方法被称为:

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

并且这是CONSOL中的结果:

~/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 

该函数调用的次数太多。

+0

你应该从一个更简单的例子/代码开始,比如一个简单的主要的精灵和没有什么奇特的东西。 – Hiura

+0

我的示例代码太复杂了吗? – DeepSiderZ

+0

您显示后立即清除屏幕。通常我认为你会清除屏幕,然后画出来然后显示。 – Galik

回答

1

不知道如果我没有记错,但你不能使用这样的检查鼠标点击(同时指定左或右键点击)

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

如果你希望你的支票指定点击然后你可以用下面这个并检查它是否是提到的按钮的范围内:

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

然后你可以使用位置变量(position.x和position.y的具体坐标)来检查。

+0

感谢您的答案,好方法只是把mouseEvent和pollEvent循环中的keyboardEvent函数:) – DeepSiderZ

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';