3

我目前正在使用 XNA/C# 进行开发。当用户按下一个键 ( Keys.Right) 时,我需要移动一个对象。我希望这发生

  1. 当用户按键时
  2. 1 秒后,用户按住键,然后每 0.25 秒。

我已经实现了第一个:

_kbOld = _kbNew;
_kbNew = _kb.GetState();
if(_kbNew.IsKeyDown(Keys.Right) &&
   _kbOld.IsKeyUp(Keys.Right))
{
    //Do something
}

我将如何执行其他操作?我有以下想法:

  • A Queue<KeyboardState>, 跟踪最后KeyboardState的 s

  • 保存最后一次按下按键和松开按键的时间 ( GameTime)

它应该像 Windows 中的文本输入一样工作:当你拿着一个字母时,它会在一定时间后重复。

我应该使用哪种方式?你有其他想法吗?

提前致谢!

4

3 回答 3

2

我会简单地存储最后一次推送时间,就像你建议的那样:

if (IsPressed())
{
    // Key has just been pushed
    if (!WasPressed())
    {
        // Store the time
        pushTime = GetCurrentTime();

        // Execute the action once immediately
        // like a letter being printed when the button is pressed
        Action();
    }

    // Enough time has passed since the last push time
    if (HasPassedDelay())
    {
        Action();
    }   
}
于 2013-02-11T12:36:52.493 回答
0

我记得在 javascript 中做类似的事情

  1. 您创建一个计时器,将其间隔设置为 1 秒,然后在 mousedown 上启用它(在您的情况下为 keydown)。您将在 keyup 上重置并禁用它。
  2. 第二步是将您的行为与 Tick() 事件联系起来。
  3. 第三步是在 Tick() 处理程序中检查 Keys.Right 的状态是否为关闭,如果不是,则重置计时器。
于 2013-02-11T12:28:30.353 回答
0

我建议您制作自己的 Key and Keyboard 课程。在键盘中,您可以创建方法 updateInput() 来更新每个键的状态,您可以在其中使用这样的高级功能。在 Key 类中,您可以使用

保存最后一次按下键和释放键的时间 (GameTime)

@JuannStrauss 当然不是计时器。

于 2013-02-11T12:31:57.953 回答