处理鼠标事件 SFML
Handle mouse events SFML
我在处理 SFML 中的事件时遇到了一些问题。我正在制作一个回合制游戏,当鼠标移动或单击鼠标左键时,我检查轮到谁了,然后在该对象位置产生一个射弹,当射弹与地形或对手发生碰撞时,它会被摧毁并转弯被改变了。
虽然这种行为不是我所期望的。当点击射击时,射弹有时根本不会产生(并且它会立即改变转弯)。我已经禁用了所有碰撞,所以不能那样。我 90% 确定问题出在我处理事件的方式上,所以我真的很感激关于如何让它变得更好的意见。
我了解到你不应该在 while poll 事件中执行函数,它只是为了记录最近发生的事情,所以我把它们放在外面。这并不能解决我的问题...
sf::Event event;
sf::Vector2i mousePos;
while (_window.pollEvent(event)) {
if (event.type == sf::Event::Closed) {
_window.close();
}
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Escape)) {
_window.close();
}
if(event.type == sf::Event::MouseMoved) { // <- this is how you check to see if an event
mousePos = sf::Mouse::getPosition();
moved = true;
}
if(event.type == sf::Event::MouseButtonPressed) { // <- this is how you check to see if an event
mousePressed = true;
}
}
if (mousePressed && tank1Turn)
{
sf::Vector2f spawnPos = _t1->getPos() + sf::Vector2f(0, -150);
sf::Vector2f initVel = _t1->getInitVel();
cout << endl;
_p = new Projectile(spawnPos, initVel);
tank1Turn = false;
tank1Firing = true;
mousePressed = false;
}
if (mousePressed && tank2Turn) {
sf::Vector2f spawnPos = _t2->getPos()+sf::Vector2f(0,-150);
sf::Vector2f initVel = _t2->getInitVel();
_p = new Projectile(spawnPos, initVel);
tank2Turn = false;
tank2Firing = true;
mousePressed = false;
}
if (tank1Turn && moved) {
_t1->aim(mousePos);
moved = false;
mousePressed = false;
}
if (tank2Turn && moved) {
_t2->aim(mousePos);
moved = false;
mousePressed = false;
}
}
将此视为评论。这不是一个答案(我没有足够的声誉来发表评论所以我必须把它作为一个答案)但是我注意到了一些事情:
您应该将事件循环中的 if
替换为 if-else
,或者使用开关
sf::Keyboard::isKeyPressed
用于实时输入(将其放入游戏更新循环中)。在你的事件循环中,它应该是 sf::Event::KeyPressed
并检查它是哪个键 evt.key.code
您没有检查按下的是哪个鼠标按钮。用evt.mouseButton.button
(鼠标左键sf::Mouse::Button::Left
)
Of what ive learned is that you should not execute the functions in the while poll event, its only for registering what has happend most recently,so i put them outside instead.
你在哪里读到的?我不认为那是真的
- 事件循环下面不应该只有
if
的数组。代码结构应该更好
我在处理 SFML 中的事件时遇到了一些问题。我正在制作一个回合制游戏,当鼠标移动或单击鼠标左键时,我检查轮到谁了,然后在该对象位置产生一个射弹,当射弹与地形或对手发生碰撞时,它会被摧毁并转弯被改变了。
虽然这种行为不是我所期望的。当点击射击时,射弹有时根本不会产生(并且它会立即改变转弯)。我已经禁用了所有碰撞,所以不能那样。我 90% 确定问题出在我处理事件的方式上,所以我真的很感激关于如何让它变得更好的意见。
我了解到你不应该在 while poll 事件中执行函数,它只是为了记录最近发生的事情,所以我把它们放在外面。这并不能解决我的问题...
sf::Event event;
sf::Vector2i mousePos;
while (_window.pollEvent(event)) {
if (event.type == sf::Event::Closed) {
_window.close();
}
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Escape)) {
_window.close();
}
if(event.type == sf::Event::MouseMoved) { // <- this is how you check to see if an event
mousePos = sf::Mouse::getPosition();
moved = true;
}
if(event.type == sf::Event::MouseButtonPressed) { // <- this is how you check to see if an event
mousePressed = true;
}
}
if (mousePressed && tank1Turn)
{
sf::Vector2f spawnPos = _t1->getPos() + sf::Vector2f(0, -150);
sf::Vector2f initVel = _t1->getInitVel();
cout << endl;
_p = new Projectile(spawnPos, initVel);
tank1Turn = false;
tank1Firing = true;
mousePressed = false;
}
if (mousePressed && tank2Turn) {
sf::Vector2f spawnPos = _t2->getPos()+sf::Vector2f(0,-150);
sf::Vector2f initVel = _t2->getInitVel();
_p = new Projectile(spawnPos, initVel);
tank2Turn = false;
tank2Firing = true;
mousePressed = false;
}
if (tank1Turn && moved) {
_t1->aim(mousePos);
moved = false;
mousePressed = false;
}
if (tank2Turn && moved) {
_t2->aim(mousePos);
moved = false;
mousePressed = false;
}
}
将此视为评论。这不是一个答案(我没有足够的声誉来发表评论所以我必须把它作为一个答案)但是我注意到了一些事情:
您应该将事件循环中的
if
替换为if-else
,或者使用开关sf::Keyboard::isKeyPressed
用于实时输入(将其放入游戏更新循环中)。在你的事件循环中,它应该是sf::Event::KeyPressed
并检查它是哪个键evt.key.code
您没有检查按下的是哪个鼠标按钮。用
evt.mouseButton.button
(鼠标左键sf::Mouse::Button::Left
)Of what ive learned is that you should not execute the functions in the while poll event, its only for registering what has happend most recently,so i put them outside instead.
你在哪里读到的?我不认为那是真的
- 事件循环下面不应该只有
if
的数组。代码结构应该更好