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