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;
}
}
答
问题是您的gameTime检查仅检查自上一次打勾后已经过了多长时间。
你需要存储他们第一次按下按键的时间,然后比较它和当前时间的差异。
答
@迈克尔是正确的,你需要做的是这样
// 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;
}
}
我有同样的问题,但在Silverlight应用程序。这必须是面向操作系统的,因为我也发现这个问题在winforms太 – Rumplin 2011-08-16 11:39:07