Как да повторя действията след задържане на клавиша за определено време?

В момента разработвам в XNA/C#. Когато потребителят натисне клавиш (Keys.Right), трябва да преместя обект. Искам това да се случи

  1. когато потребителят натисне клавиша
  2. след 1 секунда, докато потребителят държи ключа и след това на всеки .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

Предлагам ви да направите свой собствен клас за ключове и клавиатури. В Keyboard можете да направите метод updateInput(), който да актуализира състоянието на всеки клавиш, където можете да използвате разширени функции като тази. В Key class можете да използвате

Запазване на времето, когато клавишът е натиснат последно и кога е бил освободен (GameTime)

@JuannStrauss Със сигурност не таймер.

person Mateusz Krzaczek    schedule 11.02.2013