我需要检查“D”或“A”键是否被快速按下两次,以便精灵更改和动画。一旦该键被释放,精灵应该回到它的原始形式。我有一个简笔画,一旦按下任一键,它应该向下蹲并开始向任一方向“滚动”,这取决于按下了哪个键。任何帮助,将不胜感激!
答案 0 :(得分:7)
Paul_R 和 Nikola 实际上已经为您解答了这个问题,但是因为您说您是XNA新手(请阅读:未阅读所有文档)允许我要介绍一些重要的课程:
我们知道键盘基本上可以触发两种类型的事件:KeyDown
(在发布之前按下)和KeyUp
(发布时)。
当KeyDown
事件和KeyUp
事件连续发生时,会按下某个键。我通常会为此存储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);
}
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
的值就是您按下的最后一个键。我会把剩下的留给你。干杯,玩得开心!
答案 1 :(得分:1)
有一个计时器,只要它触发,就会将布尔变量设置为false。将此变量设置为false,并且计时器停止,直到用户按下D或A键。然后启动计时器。在计时器的tick事件处理程序中 - 将变量设置为false,然后禁用计时器。这样,您可以将计时器的间隔设置为您想要的小。如果用户按A或D,并且布尔变量已经为真 - 那么你知道它最近被按下了(在你为计时器分配的任何时间间隔内)。这只是许多方法中的一种。
这很好,因为它使用内置的事件处理,并会自动将其推送到后台线程,因此它会异步运行,并允许您对允许的间隔进行任意控制 - 您甚至可以构建'双按敏感度'设置进入游戏调整这个间隔。
答案 2 :(得分: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