C# 检测某个键是否快速按下两次

C# 检测某个键是否快速按下两次,c#,xna,C#,Xna,我需要检查是否两次快速按下“D”或“A”键,以便精灵更改和设置动画。一旦放开钥匙,精灵就会恢复到原来的状态。我有一个棒状的图形,一旦按下任何一个键,它就会俯冲下来,开始向任何一个方向“滚动”,这取决于按下了哪个键。任何帮助都将不胜感激 有一个计时器,可以在布尔变量触发时将其设置为false。将此变量设置为false,计时器停止,直到用户按下D或键。然后启动计时器。在计时器的tick事件处理程序中-将变量设置为false,然后禁用计时器。通过这种方式,您可以将计时器的间隔设置为所需的最小值。如果用

我需要检查是否两次快速按下“D”或“A”键,以便精灵更改和设置动画。一旦放开钥匙,精灵就会恢复到原来的状态。我有一个棒状的图形,一旦按下任何一个键,它就会俯冲下来,开始向任何一个方向“滚动”,这取决于按下了哪个键。任何帮助都将不胜感激

有一个计时器,可以在布尔变量触发时将其设置为false。将此变量设置为false,计时器停止,直到用户按下D或键。然后启动计时器。在计时器的tick事件处理程序中-将变量设置为false,然后禁用计时器。通过这种方式,您可以将计时器的间隔设置为所需的最小值。如果用户按下A或D,并且布尔变量已经为真-那么您知道它是最近按下的(在您为计时器分配的任何时间间隔内)。这只是许多方法中的一种


这很好,因为它使用内置事件处理,并将自动将其推到后台线程上,因此它将异步运行,并且可以对允许的时间间隔进行任意控制-您甚至可以在游戏中设置“双按键敏感度”来调整此时间间隔。

您必须存储上次按下的按键和按下的时间

按键时:

1.Check the pressed key and compare with previous (stored in variable)
2.If keys matched then subtract the keypress time from lastpressed and previous pressed key
您必须以毫秒为单位定义时间,以检查是否更改精灵和动画

3. if the difference in time is less than the defined time then you have to animate
4. Dont forget to set your last pressed key in variable for next keypress comparison

Paul_RNikola实际上已经为你回答了这个问题,但是既然你说你是新来的XNA(阅读:还没有阅读所有的文档),请允许我介绍一些重要的课程:

我们知道,键盘基本上可以触发两种类型的事件:
KeyDown
(在释放前按)和
keydup
(在释放时)

KeyDown
事件和
keydup
事件连续发生时,按键被按下。我通常为此存储2个状态:

private KeyboardState previousKeyboardState;
private KeyboardState currentKeyboardState;
确保还导入了使用这些类所需的包

using Microsoft.Xna.Framework.Input; 
虽然可能效率很低,因为您只需要一个侦听器,但我会更新主游戏循环中的这两个状态:

 protected override void Update(GameTime gameTime){
    previousKeyboardState = currentKeyboardState;
    currentKeyboardState = Keyboard.GetState();
}
如果我想知道是否按下了某个键,我只需调用此函数:

public bool isKeyPressed( Keys key ){
    return previousKeyboardState.IsKeyDown(key) && currentKeyboardState.IsKeyUp(key);
}
是一个枚举。它包含键盘键的枚举。例如,键盘中的字母A由
键表示。A
。键盘键PageDown是
键。PageDown
。例如,我想知道字母B是否被按下,我只是使用以下语句调用上面的方法:

isKeyPressed( Keys.B ); //returns true or false
elapsedTime = gameTime.ElapsedGameTime.TotalMilliseconds;
现在我们知道是否按下了一个键。这就是你的问题所在:我们如何知道一个键是否被快速按了两次。您需要快速定义什么是。在本例中,假设在第一次按键后1000毫秒内按下一个键时,会发生快速按键

回想一下,您的主游戏循环接收到一个参数
GameTime GameTime。
您可以按照Paul\R
的建议,使用以下语句获取上一次更新和上一次更新之间经过的时间:

isKeyPressed( Keys.B ); //returns true or false
elapsedTime = gameTime.ElapsedGameTime.TotalMilliseconds;
注意,我们使用了
毫秒
属性,而不是
。这只是为了保持一致性
gameTime.ElapsedGameTime.TotalMillistics
是自上次更新以来经过的游戏时间(以毫秒为单位)

这并不是一种优雅的方法,但为了让您了解这一点,我使用了一种方法来检查按键是否快速按下:

public bool isKeyPressedRapidly( Keys key ){
    return isKeyPressed(key) && elapsedTime <= 1000 && lastKeyPressed == key;
}
public bool快速按键(按键){

返回键按下(键)&&elapsedTime对不起,我有点新-但我如何在XNA中设置计时器?@TheUnrealMegashark你不需要计时器,只需将按键时间存储在变量中并减去时间。我不知道你正在使用XNA,因此正在处理一个紧凑的框架。然而,基本上所有计时器都是一个自身递增的变量。我相信ve您可以将以下内容与XNA一起使用,以返回自上次更新以来的时间()。试试:
gameTime.ElapsedGameTime.TotalSeconds;
就是这样的时刻,我真的觉得自己很愚蠢……对不起,我仍然很困惑。你能给我举个例子吗?我无法让计时器停止……我将时间变量重置为0,但重置后它会继续上升。