【问题标题】:SFML Input Not responsive at startSFML 输入 开始时无响应
【发布时间】:2023-03-22 16:43:01
【问题描述】:

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

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

谢谢。

【问题讨论】:

    标签: sfml


    【解决方案1】:

    我认为您没有以正确的方式处理事件。您在这里所做的是检查每个事件(可能是键盘输入与否)是否按下了 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 用于此类事情,以使常量易于访问(因为它们被放入预处理器中),并且完全封顶的编写使其与代码中的经典变量更容易区分。但这只是我们在这里谈论的编码风格:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-14
      • 2022-10-02
      • 1970-01-01
      • 1970-01-01
      • 2016-03-06
      • 1970-01-01
      • 2014-10-08
      • 1970-01-01
      相关资源
      最近更新 更多