我需要检查"D"或"A"键是否被快速按下两次,以便精灵更改和动画.一旦该键被释放,精灵应该回到它的原始形式.我有一个简笔画,一旦按下任一键,它应该向下蹲并开始向任一方向"滚动",这取决于按下了哪个键.任何帮助,将不胜感激!
Paul_R和Nikola实际上已经为你回答了这个问题,但是既然你说你是XNA的新手(阅读:还没有阅读所有文档)请允许我介绍一些重要的课程:
我们知道键盘基本上可以触发两种类型的事件:( KeyDown在发布之前按下)和KeyUp(发布时).
当KeyDown事件和KeyUp事件连续发生时按下键.我通常为此存储2个状态:
private KeyboardState previousKeyboardState;
private KeyboardState currentKeyboardState;
Run Code Online (Sandbox Code Playgroud)
确保您还导入必要的包以使用这些类.
using Microsoft.Xna.Framework.Input;
Run Code Online (Sandbox Code Playgroud)
虽然你可能只有一个监听器可能效率低下,但我在主游戏循环中更新了这两个状态:
protected override void Update(GameTime gameTime){
previousKeyboardState = currentKeyboardState;
currentKeyboardState = Keyboard.GetState();
}
Run Code Online (Sandbox Code Playgroud)
如果我想知道是否按下某个键,我只需调用此函数:
public bool isKeyPressed( Keys key ){
return previousKeyboardState.IsKeyDown(key) && currentKeyboardState.IsKeyUp(key);
}
Run Code Online (Sandbox Code Playgroud)
Keys是一个枚举.它包含键盘键的枚举.例如,键盘中的字母A表示为Keys.A.键盘键PageDown是Keys.PageDown.例如,我想知道是否按下了字母B,我只是使用以下语句调用上述方法:
isKeyPressed( Keys.B ); //returns true or false
Run Code Online (Sandbox Code Playgroud)
现在我们知道是否按下了一个键.这就是您的问题所在:我们如何知道密钥是否被快速按下两次.您需要定义快速的内容.对于此示例,假设在第一次按下后1000毫秒内按下某个键时,会快速按下某个键.
回想一下您的主游戏循环接收参数GameTime gameTime.您可以使用此参数,如Paul_R所建议的那样,使用此语句获取上次更新和上次更新之间的经过时间:
elapsedTime = gameTime.ElapsedGameTime.TotalMilliseconds;
Run Code Online (Sandbox Code Playgroud)
注意到我们使用的是Milliseconds财产,而不是Seconds.这只是为了保持一致性.gameTime.ElapsedGameTime.TotalMilliseconds是自上次更新以来经过的游戏时间量(以毫秒为单位).
这不是一个优雅的方式来做到这一点,但只是这样你就可以得到这个想法,这是我用来检查一个键是否被快速按下的方法:
public bool isKeyPressedRapidly( Keys key ){
return isKeyPressed(key) && elapsedTime <= 1000 && lastKeyPressed == key;
}
Run Code Online (Sandbox Code Playgroud)
elapsedTime每次isKeyPressed(key)返回都会重置true.elapsedTime主游戏循环增加,直到按下另一个键.值,lastKeyPressed是你按下的最后一个键.我会把剩下的留给你.干杯,玩得开心!
| 归档时间: |
|
| 查看次数: |
1883 次 |
| 最近记录: |