Как проверить ввод с клавиатуры, продолжая обновлять и рисовать игровые элементы

Я использую Allegro и C++ для разработки базовой игры. Я обнаружил, что распространенным ответом на ввод с клавиатуры является строка

al_wait_for_event(event_queue, &ev);

однако, что мне не нравится, так это то, что ваша программа вынуждена ждать ввода. Если положение метеора нужно постоянно обновлять, то я не хочу, чтобы моя клавиатура останавливала его движение.

По моему опыту работы с XNA, я бы просто обновлял внешний вид клавиатуры каждый тик и спрашивал, была ли нажата клавиша. Какой метод я мог бы использовать для продолжения обновления и рисования моей игры, продолжая проверять ввод, подобно тому, как это обрабатывал XNA?


person TheNextGuy    schedule 08.06.2013    source источник


Ответы (3)


Вместо al_wait_for_event вы должны использовать al_get_next_event в цикле, пока он не вернет false. Он возвращается немедленно и возвращает false, как только событий больше нет. (Также посмотрите на al_is_event_queue_empty и al_peek_next_event, которые могут оказаться полезными.)

Когда у вас закончатся события, обновите логику игры, нарисуйте рамку и начните все сначала. (Формально это называется «игровой цикл».)

person Rick Yorgason    schedule 08.06.2013

Большинство людей настраивают цикл событий, управляемый таймером:

ALLEGRO_TIMER *timer = al_create_timer(1 / 60.0);
al_register_event_source(event_queue, al_get_timer_event_source(timer));
// register keyboard, other sources

Теперь, когда вы ожидаете события, вы будете получать отсчет таймера каждую 1/60 секунды, на который вы можете реагировать соответствующим образом и обновлять логическую рамку.

person Matthew    schedule 08.06.2013

Аллегро al_get_keyboard_state делает именно это: возвращает текущее состояние клавиатуры во время звонка.

person ComicSansMS    schedule 08.06.2013