2

我需要检查“D”或“A”键是否被快速按下两次,以便精灵改变和动画。一旦放开那个键,精灵应该回到它的原始形式。我有一个简笔图,一旦按下任何一个键,它应该向下俯冲并开始向任一方向“滚动”,具体取决于按下哪个键。任何帮助,将不胜感激!

4

3 回答 3

7

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

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

当一个KeyDown事件和一个KeyUp事件连续发生时按下一个键。我通常为此存储两种状态:

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

Keys是一个枚举。它包含键盘键的枚举。例如,键盘中的字母 A 用 表示Keys.A。键盘键 PageDown 是Keys.PageDown。例如,我想知道是否按下了字母 B,我只需使用以下语句调用上述方法:

isKeyPressed( Keys.B ); //returns true or false

现在我们知道是否按下了某个键。这就是您的问题所在:我们如何知道一个键是否被快速按下了两次。你需要定义什么是快速。对于此示例,假设在第一次按下后 1000 毫秒内按下某个键时会发生快速按下某个键。

回想一下,您的主游戏循环接收一个参数GameTime gameTime.,您可以使用它,如Paul_R所建议的,使用以下语句获取上次更新和上次更新之间经过的时间:

elapsedTime = gameTime.ElapsedGameTime.TotalMilliseconds;

注意到我们使用了Milliseconds属性,而不是Seconds. 这只是为了保持一致性。gameTime.ElapsedGameTime.TotalMilliseconds是自上次更新以来经过的游戏时间量(以毫秒为单位)。

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

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

elapsedTime每次isKeyPressed(key)返回时都会重置true。在主游戏循环中递增elapsedTime,直到按下另一个键。的值lastKeyPressed是你按下的最后一个键。我会把剩下的留给你。干杯,玩得开心!

于 2013-07-07T03:21:36.820 回答
1

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

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

于 2013-07-07T01:56:29.610 回答
1

您必须存储最后按下的键和按下的时间

按键时:

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
于 2013-07-07T01:59:53.003 回答