我认为您没有以正确的方式处理事件。您在这里所做的是检查每个事件(可能是键盘输入与否)是否按下了 sf::Key::Down 键(对于 sf::Key::Left 也是如此)。
首先,它没有效果,因为你没有得到你想要的结果。其次,它执行无用的检查,承认事件可能是鼠标移动、鼠标点击或其他任何事件:检查在这种情况下是否按下了这些键对您的程序毫无意义。
我看不到你的整个代码,但你应该尝试这种口味的东西作为你的主循环:
bool isMovingLeft = false;
bool isMovingDown = false;
sf::Event event;
while (win.IsOpen())
{
// While window catches events...
while(win.GetEvent(event))
{
// If the caught event is a click on the close button, close the window
if (event.Type == sf::Event::Closed)
win.Close();
// If it's a key press, check which key and move consequently
else if (event.Type == sf::Event::KeyPressed)
{
if(event.Key.Code == sf::Key::Left)
isMovingLeft = true;
else if(event.Key.Code == sf::Key::Down)
isMovingDown = true;
}
// If it's a key release, stop moving in the following direction
else if (event.Type == sf::Event::KeyReleased)
{
if(event.Key.Code == sf::Key::Left)
isMovingLeft = false;
else if(event.Key.Code == sf::Key::Down)
isMovingDown = false;
}
}
// Now that we have caught events, we move the lil' thing if we need to.
if(isMovingLeft)
x = x - SPEED;
if(isMovingDown)
y = y - SPEED;
win.Clear();
// Draw things on the screen...
win.Display();
}
在这段代码中,整个过程分为两部分:
- 我们首先拦截用户输入,看看是否需要改变事物的移动状态。
- 然后,一旦每个事件都被捕获并彻底分析,我们就会在必要时移动它。它是通过两个布尔值完成的(如果你想要一个四方向控制,你可能需要增加到四个。如果你想处理对角线方向,使用枚举比使用八个布尔值更明智,这开始相当记忆- 消耗如此简单的任务。)
注意:您可能会注意到我将“速度”更改为“速度”。我看不出它是一个定义、一个 const var 还是只是你给出的代码中的一个 var,但最好的选择是前两个中的一个。我更喜欢将#define 用于此类事情,以使常量易于访问(因为它们被放入预处理器中),并且完全封顶的编写使其与代码中的经典变量更容易区分。但这只是我们在这里谈论的编码风格:)