/ / SFMLマウスボタンがスパムしている - c ++、sfml

リリースされたSFMLマウスボタンがスパムです - c ++、sfml

私はSFMLとC ++を使っていますが、私は奇妙な問題を抱えています、

これが私のメインゲームのアップデート方法です

while (renderService.Window.isOpen())
{
//Poll events
sf::Event event;
while (renderService.Window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
renderService.Window.close();
running = false;
}

MouseMovment(event);
MouseClick(event);
Update();
Draw();
}

これが私のMouseClickメソッドです。

void Game::MouseClick(sf::Event event)
{
sf::Vector2i position = sf::Mouse::getPosition(renderService.Window);

if (event.mouseButton.button == sf::Mouse::Left && event.type == sf::Event::MouseButtonReleased)
{
std::cout << "Mouse released" << std::endl;
}
}

今ここに奇妙な部分があります、私のコンソールで時々私のcoutは10/20回のようにスパムされるでしょう、しかし時々それは完全にうまくいくでしょう、私は間違ってイベントを呼んでいますか?

回答:

回答№1の場合は3

あなたはそれを間違ってやっています。 MouseButtonReleased イベントが発生し、あなたのポーリング関数がそれをつかみます(コメントの中の数字に従います):

while (renderService.Window.isOpen()) // 4) The loop starts again
{
//Poll events
sf::Event event;
while (renderService.Window.pollEvent(event)) // 1) Grabs the event // 5) No more events
{
if (event.type == sf::Event::Closed) // 2) Nope, it"s not this one
renderService.Window.close();
running = false;
}

MouseMovment(event);
MouseClick(event); // 3) Yes, handle it // 6) Uses the unmodified event variable - undefined behavior
Update();
Draw();
}

あなたはむしろ以下のようなことをするべきです:

sf::Event event;

// while there are pending events...
while (window.pollEvent(event))
{
// check the type of the event...
switch (event.type)
{
// window closed
case sf::Event::Closed:
...
break;

// mouse button released
case sf::Event::MouseButtonReleased:
{
if (event.mouseButton.button == sf::Mouse::Left)
...
} break;

// we don"t process other types of events
default:
break;
}

}