2017-12-22 19 views
1

私はSFMLを使ってゲームを書いていますが、私のボタンには少し問題があります。ここで私はボタンがクリックされたかどうかを確認するために使用する機能は次のとおりです。SFMLボタンが2回トリガーする

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

それはほとんど正常に動作し、まだ私は、このボタンを押したら、私はそれをダブルクリックするように時々、アクションは私もそれを解放didntのも、カントー、二回trigerredされますまだ。私はsf::Event::MouseButtonReleasedを関与させようとしましたが、実際には助けにもなりませんでした。私が達成したいことはもちろん、1つのボタンのプレス/リリース/何でも1つのアクションだけです。

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

答えて

0

短い答え必要で、その場合はここで

は私GameLoopの一例です:ところで

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

Long storyを、それはグーグルで、第2のリンクです....

1

ます」 2つの異なるアプローチを組み合わせてユーザー入力を管理する

  • イベントをすることによって

    入力:一度起こるそれらのものを管理するために使用し、あなたが通知されるようにしたい

  • リアルタイム入力:基本的には、繰り返し入力ステータスのポーリング(この場合は、マウス)

一般的なルール:あなたは、私recommの詳細を知りたい場合は

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 

あなたはSFMLのゲーム開発者についてthisの章(またはそれよりも良い、全体の本)を読むことを終了します。

関連する問題