Как повторить действия после удержания клавиши в течение определенного времени?

В настоящее время я разрабатываю 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>, отслеживание последних KeyboardStates

  • Сохранение времени последнего нажатия и отпускания клавиши (GameTime)

Это должно работать как ввод текста в Windows: когда вы удерживаете букву, она повторяется через определенное время.

Какой способ я должен использовать? У вас есть другие идеи?

Заранее спасибо!


person pascalhein    schedule 11.02.2013    source источник
comment
Я бы порекомендовал использовать хуки Windows, чтобы получить фактические нажатия клавиш, минуя управление вводом XNA.   -  person user1306322    schedule 12.02.2013
comment
Потому что это не только решит эту проблему, но и захватит символы с любой раскладки клавиатуры (разные языки).   -  person user1306322    schedule 12.02.2013


Ответы (3)


Я бы просто сохранил время последнего нажатия, как вы предложили:

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();
    }   
}
person Lucius    schedule 11.02.2013
comment
Спасибо, мне пришлось добавить еще несколько условий (Нажал этот кадр, Отпустил этот кадр, Задержка завершена, Повтор), но в основном это то, что вы предложили. - person pascalhein; 11.02.2013

Я помню, как делал что-то подобное в javascript, что

  1. вы создаете таймер, устанавливаете его интервал на 1 секунду, а затем включаете его при нажатии кнопки мыши (в вашем случае нажатие клавиши). Вы сбросите и отключите его при нажатии клавиши.
  2. Второй шаг — связать свое поведение с событием Tick().
  3. Третий шаг — проверить внутри вашего обработчика Tick(), не работает ли состояние Keys.Right, и если нет, то сбросить таймер.
person Captain Kenpachi    schedule 11.02.2013

Я предлагаю вам создать свой собственный класс Key and Keyboard. В клавиатуре вы можете создать метод updateInput(), который будет обновлять состояние каждой клавиши, где вы можете использовать такие расширенные функции, как эта. В классе Key вы можете использовать

Сохранение времени последнего нажатия клавиши и времени ее отпускания (GameTime)

@JuannStrauss Точно не таймер.

person Mateusz Krzaczek    schedule 11.02.2013