簡體   English   中英

SFML 鼠標點擊檢測

[英]SFML Mouse click detection

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

菜單.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

該函數被調用了太多次。

不知道我是否沒記錯,但你不能用這樣的東西來檢查鼠標點擊(也指定左鍵或右鍵單擊)

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

如果您希望檢查指定點擊的位置,那么您可以在下面使用它並檢查它是否在提到的按鈕的范圍內:

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

然后您可以使用位置變量(position.x 和 position.y 用於特定坐標)進行檢查。

這個問題不是最近出現的,但是當我幾個月前開始 sfml 時,我掙扎了一段時間才能得到答案。 即使我閱讀了鼠標和事件的文檔“大聲笑”。 但我改進了,這里是代碼:

static bool lock_click; //create a bool variable for lock the click.
if (evnt.type == sf::Event::MouseButtonPressed) //Mouse button Pressed
{
    if (evnt.mouseButton.button == sf::Mouse::Left && lock_click != true) //specifies
    {
        //stuff before locking...
        std::cout << "lmb-pressed" << std::endl; // normaly this will show if is being pressed.
        lock_click = true; //after your code this lock to not print in a loop. 
    }
}
if (evnt.type == sf::Event::MouseButtonReleased) //Mouse button Released
{
    if (evnt.mouseButton.button == sf::Mouse::Left) //specifies again
    {
        lock_click = false; //unlock when released
    }
}

如果您在應用程序中使用鍵盤,則有一個“選項”window.setKeyRepeatEnabled(false)我之前說過,它適用於鍵盤 (或者至少不適用於鼠標!)

我看不出有什么比這更有效的了,因為你可以只用一個按鈕來制作它,而讓另一個正常。 就像使用 Lmb 的近戰和 Rmb 的自動遠程東西一樣。 (如果你想要一些特定的時間,你也可以制作計時器。)

這是我用來檢測鼠標點擊的內容:

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

當我搜索鼠標事件時,它總是出現在谷歌搜索中。 :)

可以檢測鼠標單擊是按下還是釋放鼠標按鈕,就像您已經在做的那樣

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM