c# - 检测某个键是否被快速按下两次

标签 c# xna

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

最佳答案

Paul_RNikola 实际上已经为您回答了这个问题,但是由于您说您是 XNA 的新手(阅读:还没有阅读所有文档)允许我来介绍一些重要的类(class):

我们知道键盘基本上可以触发两种类型的事件: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;
}
每次 isKeyPressed(key) 返回 true 时,

elapsedTime 都会重置。在主游戏循环中增加 elapsedTime,直到按下另一个键。 lastKeyPressed 的值就是您按下的最后一个键。我会把剩下的留给你。干杯,玩得开心!

关于c# - 检测某个键是否被快速按下两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17508598/

相关文章:

c# - 如何运行Main.axml?

c# - 部署在本地sql server management studio的azure数据库的数据库备份

c# - 如何以编程方式找到 Vista 的 "Saved Games"文件夹?

design-patterns - 分解 Game1() 的好习惯是什么

c# - 使用 CSharpCodeProvider 编写 XNA C# 脚本

c# - 用于 Windows 开发的 C++ QT 与 C# .NET

c# - 在 xaml 项目中使用 CoreWindow 交换链,为什么没有绘制?

c# - SOS 不支持当前目标架构

c# - 如何计算弹跳角?

vb.net - 将 XNA + VB.Net 游戏转换为 MonoGame