Захват клавиш для игры (питон) - PullRequest
3 голосов
/ 27 марта 2012

Кто-нибудь знает, как записывать нажатия клавиш для игры (т. Е. Использовать клавиатуру для навигации по простой игре на основе ASCII, где 8 = вверх, 2 = вниз, 4 влево и т. Д ... и нажимать клавишу возврата не нужно, перемещаясь в цель - одно нажатие клавиши.) Я нашел этот код, который выглядит как хорошая идея, но у меня над головой. Добавление комментариев или отправка меня в статью на эту тему и т. Д. Было бы очень полезно. Я знаю, у многих есть этот вопрос. Заранее спасибо?

    try:
        from msvcrt import kbhit
    except ImportError:
        import termios, fcntl, sys, os
        def kbhit():
            fd = sys.stdin.fileno()
            oldterm = termios.tcgetattr(fd)
            newattr = termios.tcgetattr(fd)
            newattr[3] = newattr[3] & ~termios.ICANON & ~termios.ECHO
            termios.tcsetattr(fd, termios.TCSANOW, newattr)
            oldflags = fcntl.fcntl(fd, fcntl.F_GETFL)
            fcntl.fcntl(fd, fcntl.F_SETFL, oldflags | os.O_NONBLOCK)
            try:
                while True:
                    try:
                        c = sys.stdin.read(1)
                        return True
                    except IOError:
                        return False
            finally:
                termios.tcsetattr(fd, termios.TCSAFLUSH, oldterm)
                fcntl.fcntl(fd, fcntl.F_SETFL, oldflags)

Ответы [ 2 ]

1 голос
/ 27 марта 2012

Хорошо, если вы хотите понять, как управлять этим напрямую, начните с подробного изучения справочных страниц по Linux (или OS X) для termios, fcntl и stty. Это много вещей, но вы увидите, для чего все эти флаги.

Обычно ваш ввод с клавиатуры буферизуется: драйвер терминала собирает его, пока вы не нажмете return. Флаг ~termios.ICANON отвечает за отключение буферизации линии, поэтому вы можете сразу увидеть, что пользователь вводит.

С другой стороны, если вы хотите, чтобы ваша программа отвечала только тогда, когда пользователь нажимает клавишу, вы НЕ ХОТИТЕ os.O_NONBLOCK: это означает, что ваша программа не будет блокироваться при чтении с клавиатуры, но ваша чтение вернет пустую строку. Это подходит для игр с живым действием, в которых все происходит независимо от того, реагирует пользователь или нет.

1 голос
/ 27 марта 2012

Pygame хорошее место для начала, документация действительно хорошая. Вот способ, которым вы можете получить вывод с клавиатуры:

import pygame    
pygame.init()
screen = pygame.display.set_mode((100, 100))
while 1:
    for event in pygame.event.get():
        if event.type == pygame.KEYDOWN and event.key <= 256:
            print event.key, chr(event.key)

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

Создание чего-то в Pygame - это действительно хороший способ начать изучение программирования, так как на сайте множество примеров.

...