c#Xna keydown延迟1秒

问题描述:

即时编写俄罗斯方块xna。我有一个方法rotateBlocks的类。当我按下“向上”箭头键。我想,当我按住按钮1秒或更长时间,它会执行第一个参数,如果(快速旋转块),现在什么都没有发生。我已经在全局声明了oldState。如果我首先删除游戏时间检查,否则如果块将快速旋转imedietley。如果我尝试通过代码与换行到步骤分辨率总得F **** d向上c#Xna keydown延迟1秒

公共无效RotateBlocks(loadBlock磅,KeyboardState newState,GameTime gameTime) { _elapsedSeconds2 + =(浮点)gameTime.ElapsedGameTime。 TotalSeconds;

 if (lb._name.Equals("block1")) 
     { 

      if (newState.IsKeyDown(Keys.Up) && !oldState.IsKeyDown(Keys.Up)) 
      { 
       // the player just pressed Up 


       if (_rotated) 
       { 
        lb._position[0].X -= 16; 
        lb._position[0].Y -= 16; 
        lb._position[2].X += 16; 
        lb._position[2].Y += 16; 
        lb._position[3].X += 32; 
        lb._position[3].Y += 32; 
        _rotated = false; 
       } 

       else if (!_rotated) 
       { 
        lb._position[0].X += 16; 
        lb._position[0].Y += 16; 
        lb._position[2].X -= 16; 
        lb._position[2].Y -= 16; 
        lb._position[3].X -= 32; 
        lb._position[3].Y -= 32; 
        _rotated = true; 
       } 


      } 
      if (newState.IsKeyDown(Keys.Up) && oldState.IsKeyDown(Keys.Up)) 
      { 
       // the player is holding the key down 
       if (gameTime.ElapsedGameTime.TotalSeconds >=1) 
       { 
        if (_rotated) 
        { 
         lb._position[0].X -= 16; 
         lb._position[0].Y -= 16; 
         lb._position[2].X += 16; 
         lb._position[2].Y += 16; 
         lb._position[3].X += 32; 
         lb._position[3].Y += 32; 
         _rotated = false; 
        } 

        else if (!_rotated) 
        { 
         lb._position[0].X += 16; 
         lb._position[0].Y += 16; 
         lb._position[2].X -= 16; 
         lb._position[2].Y -= 16; 
         lb._position[3].X -= 32; 
         lb._position[3].Y -= 32; 
         _rotated = true; 

        } 
        _elapsedSeconds2 = 0; 
       } 

      } 
+0

我有同样的问题,但在Silverlight应用程序。这必须是面向操作系统的,因为我也发现这个问题在winforms太 – Rumplin 2011-08-16 11:39:07

问题是您的gameTime检查仅检查自上一次打勾后已经过了多长时间。

你需要存储他们第一次按下按键的时间,然后比较它和当前时间的差异。

ElapsedGameTime是自上次调用Game.Update()以来的时间。所以如果你的游戏循环以每秒60次的速度运行,ElapsedGameTime总是1/60秒。您需要在最初按下该键时记录TotalGameTime,并将其用于将来更新中的比较。

+0

你有什么好的例子提供??即时通讯真的很新 – bld 2009-12-04 00:43:18

+0

http://creators.xna.com有很多资源,入门套件,样本等。 – Michael 2009-12-04 00:44:18

+0

您可以用几乎相同的方式来存储旧状态。 – 2009-12-04 00:46:56

@迈克尔是正确的,你需要做的是这样

// where integertype is int or long etc 
integertype startPress = 0; 

public void RotateBlocks(loadBlock lb, KeyboardState newState, GameTime gameTime) { 

    _elapsedSeconds2 += (float)gameTime.ElapsedGameTime.TotalSeconds; 

    if (lb._name.Equals("block1")) 
     { 
      if (newState.IsKeyDown(Keys.Up) && !oldState.IsKeyDown(Keys.Up)) 
      { 
       // the player just pressed Up 
startPress = GameTime.ElapsedGameTime.TotalSeconds; 

       if (_rotated) 
       { 
        lb._position[0].X -= 16; 
        lb._position[0].Y -= 16; 
        lb._position[2].X += 16; 
        lb._position[2].Y += 16; 
        lb._position[3].X += 32; 
        lb._position[3].Y += 32; 
        _rotated = false; 
       } 

       else if (!_rotated) 
       { 
        lb._position[0].X += 16; 
        lb._position[0].Y += 16; 
        lb._position[2].X -= 16; 
        lb._position[2].Y -= 16; 
        lb._position[3].X -= 32; 
        lb._position[3].Y -= 32; 
        _rotated = true; 
       } 


      } 
      if (newState.IsKeyDown(Keys.Up) && oldState.IsKeyDown(Keys.Up)) 
      { 
       // the player is holding the key down 
       if (gameTime.ElapsedGameTime.TotalSeconds - startPress >=1) 
       { 
        if (_rotated) 
        { 
         lb._position[0].X -= 16; 
         lb._position[0].Y -= 16; 
         lb._position[2].X += 16; 
         lb._position[2].Y += 16; 
         lb._position[3].X += 32; 
         lb._position[3].Y += 32; 
         _rotated = false; 
        } 

        else if (!_rotated) 
        { 
         lb._position[0].X += 16; 
         lb._position[0].Y += 16; 
         lb._position[2].X -= 16; 
         lb._position[2].Y -= 16; 
         lb._position[3].X -= 32; 
         lb._position[3].Y -= 32; 
         _rotated = true; 

        } 
        _elapsedSeconds2 = 0; 
       } 

      }