延迟键盘输入帮助

时间:2010-04-14 18:34:57

标签: c# xna

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

在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(延迟)。

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

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

澄清

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

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

已解决:发现gameTime.ElapsedGameTime.TotalMilliseconds返回0 ...将其移动到其他地方。

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

  1. 如果您希望在按下按钮时移动一次(就像在菜单中移动一样),那么您希望将KeyboardState存储在类级变量中,以便每次更新都可以根据当前状态进行检查。你只会移动,如果按钮没有保持在之前的状态,但现在保持。这确保您只会触发一次操作。
  2. 如果您希望它能够定期顺畅地移动(例如,当您按向右箭头时向右滚动),则将您的移动变量(当前硬编码为50)缩放一定量(您可以调整)。像movement.X += 50 * .05;这样的东西。您可以上下调整它,直到每帧的移动与您想要移动的速度相匹配

答案 2 :(得分:0)

如果您使用的是固定游戏时间,则根本不需要按时间延迟。您可以保留一个跟踪“框架”的变量,并根据该变量进行更新:

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

这样你就不用处理gameTime了。