2015-05-21 291 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';