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()
?
1 ответ
Это исправлено в последнем svn: http://doryen.eptalys.net/forum/index.php?topic=1500.msg8507
или здесь: https://bitbucket.org/jice/libtcod