代码之家  ›  专栏  ›  技术社区  ›  Stradigos

延迟键盘输入帮助

  •  2
  • Stradigos  · 技术社区  · 14 年前

    我太接近了!我使用的是XNA游戏状态管理示例 here

    在GameplayScreen.cs中,我声明了一个名为elapsedTime的double,并将其设置为0。

    在HandleInput方法中,我更改了键。右键按为:

    if (keyboardState.IsKeyDown(Keys.Left))
                        movement.X -= 50;
    
                    if (keyboardState.IsKeyDown(Keys.Right))
                    {
                        elapsedTime -= gameTime.ElapsedGameTime.TotalMilliseconds;
                        if (elapsedTime <= 0)
                        {
                            movement.X += 50;
                            elapsedTime = 10;
                        }
                    }
                    else
                    {
                        elapsedTime = 0;
                    }
    

    伪代码:

    如果按下键,则决不能通过else将elapsedTime设置为0。相反,在成功检查后将elapsedTime设置为10之后,elapsedTime应该越来越低,因为它被TotalMilliseconds减去。当该值达到0时,它将再次成功通过检查并再次移动对象。

    问题是,每次按下它都会移动物体一次,但如果你按住它,它就不起作用了。有人能提供一些提示/例子/知识吗?提前谢谢,我快疯了。理论上我认为这肯定管用。

    澄清

    编辑:gameTime.ElapsedGameTime.TotalMillices返回0。。。一直如此。我不知道为什么。

    已解决:发现gameTime.ElapsedGameTime.TotalMillises返回0。。。把它移到别的地方了。

    3 回复  |  直到 14 年前
        1
  •  1
  •   Stradigos    14 年前

    发现gameTime.ElapsedGameTime.totalMillimeters返回0。。。在Update方法中使用GameTime参数来设置名为GameT的公共双变量。然后在HandleInput方法中使用GameT并返回有效时间。这不是最合法的方法,但它现在起作用了。

        2
  •  0
  •   Joel Martinez    14 年前

    所以问题是,你希望你的实体有什么样的行为?

    1. 如果希望在按下按钮时移动一次(就像在菜单中移动一样),则希望将KeyboardState存储在类级变量中,以便每次更新时都可以对照当前状态检查它。你只会动 如果
    2. 如果您想让它有规律地、平稳地移动(例如,按下向右箭头时向右滚动),则将移动变量(当前硬编码为50)缩放一定量(您可以调整)。比如说 movement.X += 50 * .05; . 您可以上下调整它,直到它每帧所做的移动与您希望它移动的速度相匹配
        3
  •  0
  •   Bob    14 年前

    如果你用的是固定的游戏时间,你根本不必按时间来拖延。您可以保留一个跟踪“帧”的变量,并根据该变量进行更新:

    int elapsedFrames = 10;  //<- Set up somewhere higher than the function call
    if (keyboardState.IsKeyDown(Keys.Right))
    {
        elapsedFrames++;
        if (elapsedFrames >= 10)
        {
            movement.X += 50;
            elapsedTime = 0;
        }
    }
    else
    {
        elapsedTime = 10;
    }
    

    这样你就不必处理游戏时间了。