【问题标题】:Delay keyboard input help延迟键盘输入帮助
【发布时间】:2011-02-08 01:29:36
【问题描述】:

我很近!我正在使用找到 here 的 XNA 游戏状态管理示例并尝试修改它处理输入的方式,以便我可以延迟键/创建输入缓冲区。

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

在 HandleInput 方法中,我将 Key.Right 按钮按下更改为:

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

伪代码:

如果未按下右箭头键,则将 elapsedTime 设置为 0。如果按下,elapsedTime 等于自身减去自上一帧以来的毫秒数。如果差值等于或小于 0,则移动对象 50,然后将 elapsedTime 设置为 10(延迟)。

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

问题是,每次按下它都会移动对象一次,但如果按住它就不起作用。任何人都可以为此提供任何类型的提示/示例/知识吗?提前谢谢,它让我发疯了。从理论上讲,我认为这肯定会奏效。

澄清

当您考虑我希望块如何移动时,请考虑网格。它不仅仅是在屏幕上流畅地移动,而是按其宽度(有点跳跃)移动到下一个位置。如果我按住这个键,它就会在屏幕上飞驰。我想放慢整个过程,以便按住键在它“跳跃”/移动它的宽度之间产生 X 毫秒的延迟。

编辑:结果 gameTime.ElapsedGameTime.TotalMilliseconds 一直在返回 0...。我不知道为什么。

已解决:发现 gameTime.ElapsedGameTime.TotalMilliseconds 返回 0...将其移至其他位置。

【问题讨论】:

    标签: c# xna


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      1. 如果您希望它在您按下按钮时移动一次(就像在菜单中移动一样),那么您希望将 KeyboardState 存储在类级别变量中,以便每次更新时都可以根据当前状态检查它。只有如果按钮不是在之前的状态下被按住,而是现在被按住,您才会移动。这样可以确保您只会触发一次操作。
      2. 如果您希望它有规律且平稳地移动(如按下右箭头时向右滚动),则将您的移动变量(当前硬编码为 50)缩放一定量(您可以调整)。所以像movement.X += 50 * .05;。您可以上下调整它,直到它每帧的移动速度与您希望它移动的速度相匹配

      【讨论】:

      • 两者都不是。我有一个 50 像素宽的块,我不想一次移动一个像素......我希望它每次都移动它的宽度。问题是如果我只是按住键它移动得非常快。我需要通过计时器延迟输入。使用 .05 之类的东西不起作用=/我不想要选项 1,因为这意味着我每次都必须按下键。由于我所做的第一个陈述,选项 2 将不起作用。
      【解决方案3】:

      如果您使用固定的游戏时间,则根本不必延迟时间。您可以保留一个跟踪“帧”的变量并据此进行更新:

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

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

      【讨论】:

        猜你喜欢
        • 2012-12-27
        • 1970-01-01
        • 1970-01-01
        • 2015-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多