Python/LibTCOD — libtcod.console_wait_for_keypress(True) срабатывает дважды для каждого ввода

Я просматриваю руководство Roguebasin по python/libtcod roguelike. Проблема, с которой я сталкиваюсь, заключается в том, что каждый раз, когда вызывается key = libtcod.console_wait_for_keypress(True), основной цикл срабатывает не один, а два раза. Код, обрабатывающий ввод с клавиатуры, выглядит следующим образом:

def handle_keys():
    #key = libtcod.console_check_for_keypress()  #real-time
    key = libtcod.console_wait_for_keypress(True)  #turn-based

    if key.vk == libtcod.KEY_ENTER and key.lalt:
        #Alt+Enter: toggle fullscreen
        libtcod.console_set_fullscreen(not libtcod.console_is_fullscreen())

    elif key.vk == libtcod.KEY_ESCAPE:
        return 'exit'  #exit game

    if game_state == 'playing':
        #movement keys
        if libtcod.console_is_key_pressed(libtcod.KEY_UP):
            player_move_or_attack(0, -1)

        elif libtcod.console_is_key_pressed(libtcod.KEY_DOWN):
            player_move_or_attack(0, 1)

        elif libtcod.console_is_key_pressed(libtcod.KEY_LEFT):
            player_move_or_attack(-1, 0)

        elif libtcod.console_is_key_pressed(libtcod.KEY_RIGHT):
            player_move_or_attack(1, 0)

        else:
            return 'didnt-take-turn'

Код взят дословно (за исключением дополнительного отступа в четыре пробела) из эта часть руководства. Обратите внимание, что на этой странице есть две версии кода. У меня есть своя версия, но я сталкиваюсь с проблемой даже при прямом копировании/вставке. Насколько я могу судить, проблема пронизывает весь учебник.

console_wait_for_keypress(True) должен ждать один ключ и помещать его в переменную «ключ», чтобы я мог на него реагировать. Все остальные входные данные должны быть сброшены. Затем новая итерация основного цикла снова вызывает console_wait_for_keypress(True), который должен ждать нового ввода, и так далее. Вместо этого каждая вторая итерация console_wait_for_keypress(True) запускается без ожидания нового ввода.

На самом деле игра работает нормально, так как второй ввод не запускает ни одно из условий console_is_key_pressed(), а функция handle_keys() возвращает 'didnt-take-turn', что говорит игровой логике ничего не делать. Это по-прежнему означает, что для каждого цикла вместо этого тратится два, что не является желаемым поведением. Проблему легко заметить, если выводить результат handle_keys() каждый цикл. Он чередуется между «Нет» и «Не по очереди».

Я честно в тупике на этом. Простое удерживание кнопки направления, по-видимому, не приводит к выводу «не по очереди», но предполагается, что эта функция используется для одиночных нажатий клавиш. Это не может быть слишком короткой задержкой, так как обычное нажатие клавиши всегда производит ровно два выхода. Документация libtcod мне не помогает.

Что мне делать, чтобы одно нажатие клавиши вызывало только один console_wait_for_keypress()?


person Mainframe    schedule 27.11.2012    source источник


Ответы (1)


Это исправлено в последнем svn: http://doryen.eptalys.net/forum/index.php?topic=1500.msg8507#msg8507

или здесь: https://bitbucket.org/jice/libtcod

person Abalieno    schedule 27.11.2012
comment
А, так это было прослушивание. Спасибо. Я думаю, что все равно перейду на wait_for_event, но теперь я знаю, что с кодом все в порядке. Ваша помощь была превосходной. - person Mainframe; 29.11.2012