SFML输入在开始时没有响应

时间:2012-11-15 17:49:46

标签: sfml

我正在制作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循环来同时处理多个事件。

我希望我的问题很清楚。请帮帮我!

感谢。

1 个答案:

答案 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();
}

在此代码中,整个过程分为两部分:

  • 我们首先拦截用户输入,看看是否需要改变事物的移动状态。
  • 然后,一旦每个事件都被捕获并彻底分析,我们就会移动它。它是通过两个bool完成的(如果你想要一个四向控制,你可能需要增加到四个。如果你想处理对角线方向,使用枚举比八个bool更明智,这开始相当记忆 - 为了这么简单的任务而消耗。)

注意:您可能会注意到我将“速度”更改为“速度”。我无法看到它是一个define,一个const var还是只是你给出的代码中的一个var,但最好的选择是前两个中的一个。我更喜欢使用#define来实现这些目的,使常量易于访问(因为它们放在预处理器中),并且完全上限的写入使其在代码中与经典变量更加不同。但这只是我们在这里讨论的编码风格:)