如何在按键保持一定时间后重复操作?

时间:2013-02-11 12:20:33

标签: c# xna keyboard repeat

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

  1. 当用户按下键
  2. 用户按住键1秒后,每隔0.25秒。
  3. 我已经实施了第一个:

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

    我该怎么做其他动作? 我有以下想法:

    • 一个Queue<KeyboardState>,跟踪上一个KeyboardState

    • 保存上次按键的时间及其释放时间(GameTime

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

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

    提前致谢!

3 个答案:

答案 0 :(得分: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();
    }   
}

答案 1 :(得分:0)

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

  1. 您创建一个计时器,将其间隔设置为1秒,然后在mousedown(在您的情况下为keydown)启用它。您将在keyup上重置和禁用它。
  2. 第二步是将您的行为与Tick()事件联系起来。
  3. 第三步是在Tick()处理程序内检查Keys.Right的状态是否已关闭,如果没有,则重置计时器。

答案 2 :(得分:0)

我建议你制作自己的Key和Keyboard课程。在键盘中你可以创建方法updateInput(),它会更新每个Key的状态,你可以使用这样的advenced函数。 在Key类中,您可以使用

  

保存上次按下按键的时间以及按下按键的时间   (GameTime)

@JuannStrauss 肯定不是计时器。