0

我正在制作一个 2D 游戏,我们应该通过箭头键控制角色。

        if((win.GetInput().IsKeyDown(sf::Key::Down)))
        {
            y = y + Speed;
        }

        if((win.GetInput().IsKeyDown(sf::Key::Left)))
        {
            x = x - Speed;
        }

我已将 Speed 设置为 10。然后 ai 使用 Sprite.SetPosition(x,y) 实际为我的角色设置动画。

一切正常。但问题是每当我按箭头键时,角色移动 1/2 秒,停止约 1/2 秒,然后再次平稳移动。每当我按任何箭头键时都会发生这种情况。

是的,我在顶部使用了一个 while 循环来同时处理多个事件。

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

谢谢。

4

1 回答 1

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

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

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

注意:您可能会注意到我将“速度”更改为“速度”。我看不出它是一个定义、一个 const var 还是只是你给出的代码中的一个 var,但最好的选择是前两个中的一个。我更喜欢将#define 用于此类事情,以使常量易于访问(因为它们被放入预处理器中),并且完全封顶的编写使其与代码中的经典变量更容易区分。但这只是我们在这里谈论的编码风格:)

于 2012-11-16T08:21:11.130 回答