Непрерывные движения клавиатуры

Сейчас я делаю игру, где по обеим сторонам экрана (т.е. слева и справа) стоят две тарелки. И мяч, который отскакивает от экрана. Когда он касается любой из пластин, он отскакивает назад. Но если он касается левого или правого края экрана, игра окончена. Мы должны управлять пластинами клавишами со стрелками или стандартными клавишами (W, A, S, D). Теперь моя проблема в том, что когда я нажимаю W или любую клавишу движения, она перемещается один раз, а затем останавливается.

Приходится много раз нажимать, чтобы он двигался. Я хочу непрерывного движения, когда я нажимаю и удерживаю любую из моих клавиш движения. Я использую allegro 5 с Dev C++ на ПК с Windows 7.


person Divyesh Ladva    schedule 13.11.2016    source источник
comment
Сделайте переключатель, движение включается при обнаружении события нажатия клавиши и отключается при обнаружении события нажатия клавиши.   -  person Nonanon    schedule 13.11.2016


Ответы (3)


Вам нужно отслеживать состояние ключей. Когда вы получаете событие нажатия клавиши, установите для параметра keydown значение true. Когда вы получаете событие key up, установите для keydown значение false.

Затем в вашей функции обновления проверьте, нажата ли клавиша, а затем переместите.

Что-то вроде этого делает это очень легко:

bool keys[ALLEGRO_KEY_MAX] = {0};

/// In event loop
if (ev.type == ALLEGRO_EVENT_KEY_DOWN) {
   keys[ev.keyboard.keycode] = true;
}
else if (ev.type == ALLEGRO_EVENT_KEY_UP) {
   keys[ev.keyboard.keycode] = false;
}

if (ev.type == ALLEGRO_EVENT_TIMER) {
   if (keys[ALLEGRO_KEY_W]) {
      player.y -= YSPEED;
   }
   if (keys[ALLEGRO_KEY_S]) {
      player.y += YSPEED;
   }
}

Вы также можете отслеживать состояние клавиатуры с помощью al_get_keyboard_state, но это не гарантирует точности из-за разницы во времени между тем, когда allegro получает ключевое событие, и когда вы это делаете.

person BugSquasher    schedule 22.03.2019

Логика обработки событий должна реагировать на нажатия клавиш и обновлять скорость пластины, а логика обновления должна перемещать пластину в соответствии со скоростью. Вот некоторый псевдокод:

while running:
    # event processing
    for event in queue:
        if event is keypress:
            if key is W:
                velocityY -= 10
            if key is S:
                velocityY += 10
        if event is keyrelease:
            if key is W:
                velocityY += 10
            if key is S:
                velocityY -= 10

    # update
    posY += velocityY * elapsedTime
person rcorre    schedule 13.11.2016
comment
Это именно то, что я сделал @rcorre, но затем, когда я нажимаю клавишу со стрелкой вверх, она перемещается один раз, а когда я отпускаю ее, она перемещается назад и возвращается на расстояние, которое она ранее преодолела. - person Divyesh Ladva; 15.11.2016

привет в псевдокоде, если нажатие клавиши события (Allegro_event_key down) должно обнаруживать нажатие клавиши, а соответствующая клавиша будет выполнять свою логику в allegro_event_key_up, вы должны остановить логику от выполнения действий.

Например, если клавиша нажата, сделайте что-нибудь, а когда клавиша нажата, перестаньте что-то делать.

Надеюсь, это поможет. С уважением и спасибо.

person guest    schedule 22.01.2021