2010-04-14 66 views
2

我很亲密!我使用的XNA游戏状态管理示例发现here并试图修改它如何处理输入,所以我可以延迟键/创建输入缓冲区。延迟键盘输入帮助

在GameplayScreen.cs我声明了一个名为双和elapsedTime设置等于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应该永远不会被通过,否则设置为0。相反,在成功检查后,elapsedTime设置为10后,elapsedTime应该变得越来越低,因为它将被TotalMilliseconds减去。当它达到0时,它再次成功通过检查并再次移动对象。

的问题是,它每按移动对象一次,但如果你按住它不工作。任何人都可以提供任何类型的提示/示例/位知识对此?在此先感谢,它一直在让我疯狂。理论上我认为这肯定会奏效。

澄清

想到一个网格,当你对我多么希望块移动的思维。它不是在屏幕上流畅地移动,而是沿着它的宽度(按顺序跳跃)移动到下一个位置。如果我按住键,它会在屏幕上进行比赛。我想减慢整个过程,这样按住键可以在“跳跃”/移动它的宽度之间创建一个X毫秒的延迟。

编辑:原来gameTime.ElapsedGameTime.TotalMilliseconds将返回0 ...所有的时间。我不知道为什么。

解决:发现了gameTime.ElapsedGameTime.TotalMilliseconds返航0 ...搬到别的地方。

回答

1

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

0

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

  1. 如果你想要它,当你按下按钮(就好像通过菜单移动)移动一次,然后要在KeyboardState存储在一个类级别的变量,以便每次更新,你可以检查它逆水州。如果该按钮没有保持在先前的状态,而只是现在被保持,您只能移动。这可以确保您只会触发一次动作。
  2. 如果你想让它通过一定量的规律,平稳地移动(如,向右滚动,当你按下右箭头),然后扩展您的运动参数(目前硬编码为50),(你可以调整)。所以像movement.X += 50 * .05;。您可以上下调整它,直到它所做的移动与您希望它移动的速度相匹配
+0

既不是。我有一个50像素宽的块,我不想一次移动一个像素......我希望它每次移动它的宽度。问题是,如果我只按住键,它移动得非常快。我需要通过计时器来延迟输入。使用类似.05的东西将无法正常工作=/ 我不想要选项1,因为这意味着我必须每次按下按键。而选项2因为我所做的第一个陈述而不起作用。 – Stradigos 2010-04-14 19:08:47

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。