【问题标题】:SFML button triggers twiceSFML 按钮触发两次
【发布时间】:2017-12-22 21:26:25
【问题描述】:

我正在使用 SFML 编写游戏,但我的按钮出现了小问题。这是我用来检查按钮是否被点击的函数:

bool InputManager::isSpriteClicked(sf::Sprite object, sf::Mouse::Button button, sf::RenderWindow &window) {

    if (sf::Mouse::isButtonPressed(button)) {
        sf::IntRect rect(object.getPosition().x, object.getPosition().y,
            object.getGlobalBounds().width, object.getGlobalBounds().height);
        if (rect.contains(sf::Mouse::getPosition(window))) {
            return true;            
        }
    }
    return false;
}

它几乎可以正常工作,但有时一旦我按下这个按钮,就会触发两次动作,就像我双击它一样,即使我还没有释放它。我试图让sf::Event::MouseButtonReleased 参与进来,但它实际上也没有帮助。我想要实现的当然是每 1 个按钮按下/释放/无论如何只有 1 个动作。

如果需要,这是我的GameLoop 示例

void GameState::handleUserInput() {
    sf::Event evnt;
    while (this->m_data->window.pollEvent(evnt)) {      

        if (this->m_data->input.isSpriteClicked(this->m_rollButton, sf::Mouse::Left, this->m_data->window)) {           
            m_gameEngine.startTurn(m_gameStatusBox);
        }
}

void GameState::update(sf::Time dt) {
    m_gameEngine.getActivePlayer().move(dt); 
}

void GameState::draw() {
    this->m_data->window.display(); 
}

【问题讨论】:

    标签: c++ button sfml


    【解决方案1】:

    简答:

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

    Long story顺便说一句,这是google的第二个链接....

    【讨论】:

      【解决方案2】:

      您正在混合使用两种不同的方法来管理用户输入

      • 事件输入:用于管理那些发生过一次并希望收到通知的事情

      • 实时输入:基本上,反复轮询输入状态(在本例中为鼠标)

      一般规则:

          if (sf::Mouse::isButtonPressed(sf::Mouse::Left))
              // WHILE the left mouse button is being pressed, do something 
          if (event.type == sf::Event::MouseButtonPressed)
              // WHEN the left mouse button has been pressed, do something
      

      如果你想了解更多,我建议你阅读this 章节(或者更好的是,整本书)关于 SFML 游戏开发。

      【讨论】:

        猜你喜欢
        • 2022-09-03
        • 1970-01-01
        • 2015-07-05
        • 2013-12-02
        • 2015-04-01
        • 2021-06-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多