Зняття затримки при запуску натискання клавіші


11

Я роблю просту гру, і одна з проблем, з якою я стикався, - це дратівлива затримка при постійному натисканні клавіші.

Отже, коли я натискаю (дуже тривалий час), наприклад Up, мій об’єкт рухатиметься на 1 одиницю вгору, а не рухається (приблизно 1 секунду), а потім переміщується на 1 одиницю вгору (без жодних затримок).

В даний час я використовую це для переміщення об'єкта (SDL2):

while (SDL_PollEvent(&event))
{
    switch (event.type)
    {
    case SDL_KEYDOWN:
        switch (event.key.keysym.sym)
        {
        case SDLK_UP:
            //Move object 1 unit up
            break;
        //Other unrelated things omitted
        }
        break;
    //Omitted other cases
    }
}

Я хотів би мати зняти затримку, щоб об’єкт міг одразу Upдуже швидко переміститися . Чи можна це зробити?

Відповіді:


19

Чекаючи, коли події клавіші будуть видалені, ви, швидше за все, на користь швидкості повторення ключових подій, яку контролює ОС (і яку користувачі можуть самі вказати).

Натомість, ви можете зателефонувати SDL_GetKeyboardStateу верхній частині циклу оновлення гри (частина оновлення, що відбувається у кожному кадрі, незалежно від того, чи відбулася подія чи ні), щоб дізнатися про стан клавіатури та перевірити, чи не з'явилося клавіша вниз або не під час будь-якого окремого кадру.


Не було б краще слухати віконні повідомлення? Використовуючи опитування, я іноді пропускаю дуже короткі натискання клавіш, і ця проблема посилюється, коли частота кадрів низька.
Рой Т.

@RoyT. Це дійсно залежить від вашої гри та виду дії, яке ви хочете запустити за допомогою клавіші. Якщо натискання клавіші - це разова річ, як клавіша "дії", яка закриває діалогове вікно, тоді черга з повідомленнями - це правильний підхід - ви хочете слухати атомну подію. - Якщо, з іншого боку, статус ключа являє собою стан, що триває, як клавіша "переміщення", логіка зазвичай while key UP is down move 30 units per second- і за секунду має сенс лише тоді, коли у вас є вимірюваний час між клавішею вниз і вгору - зазвичай більше одного кадру.
Фалько

@RoyT. Ви також можете слухати повідомлення (і використовувати їх для оновлення власного масиву стану клавіатури); Я вирішив запропонувати цей підхід для його простоти. Ви, звичайно, можете написати ще одну відповідь. Важлива частина полягає лише у тому, щоб не покладатися на повідомлення ОС, щоб перевірити, чи ключ постійно працює , тому що саме це прив'язує вас до швидкості повторення ключа ОС.

І під кадром ви маєте на увазі ігровий галочок, а не кадр для відео, правда? Тому що ми не робимо плебс і кодує логіку гри в циклі візуалізації. :-)
corsiKa

@JoshPetrie Я повністю згоден, просто хотів вказати на цей невеликий застереження, якщо вам потрібно перевірити "натискання" замість "натискання". :)
Рой Т.

10

Альтернативним способом (підхід Джоша теж чудовий!) Було б встановити булевий SDL_KEYDOWNі, можливо, також ігнорувати всі повторювані ключові події. Це можна зробити, перевіривши repeatучасника ключової події.

Тоді ви зможете реалізувати свій власний таймер, який не повинен бути нічого фантазійним, і здійснити повторення клавіш. Ви можете або запустити дію безпосередньо з таймера, або навіть генерувати SDL_KEYDOWNподію та уніфікувати рішення.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.