我正在制作2D游戏,我们应该通过箭头键来控制角色。
if((win.GetInput().IsKeyDown(sf::Key::Down)))
{
y = y + Speed;
}
if((win.GetInput().IsKeyDown(sf::Key::Left)))
{
x = x - Speed;
}
我已将Speed设置为10.然后我使用Sprite.SetPosition(x,y)实际为我的角色制作动画。
一切正常。但问题是每当我按箭头键时,角色移动1/2秒,停止约1/2秒然后再顺利移动。每按一次箭头键就会发生这种情况。
是的,我在顶部使用while循环来同时处理多个事件。
我希望我的问题很清楚。请帮帮我!
感谢。
答案 0 :(得分:3)
我认为你没有以正确的方式处理事件。你在这里做的是检查每个事件(可能是键盘输入或不是键盘输入)是否按下了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();
}
在此代码中,整个过程分为两部分:
注意:您可能会注意到我将“速度”更改为“速度”。我无法看到它是一个define,一个const var还是只是你给出的代码中的一个var,但最好的选择是前两个中的一个。我更喜欢使用#define来实现这些目的,使常量易于访问(因为它们放在预处理器中),并且完全上限的写入使其在代码中与经典变量更加不同。但这只是我们在这里讨论的编码风格:)