Capture keystrokes for a game (python)

你离开我真会死。 提交于 2019-12-23 19:17:51

问题


Does anyone know how to capture keystrokes for a game (i.e. using the keypad to navigate a simple ascii based game where 8 = up, 2 = down, 4 left, etc... and pressing return is not necessary, moving in a single keystroke is the goal.)? I found this code, which looks like a good idea, but is over my head. Adding comments, or sending me to an article on the subject etc, would be great help. I know a lot of people have this question. Thanks in advance?

    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)

回答1:


Pygame is a good place to start, the documentation is really good. Here is a way you can get keyboard output:

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)

You have to initialise pygame and create an active window to do this. I don't think there is any way to avoid hitting the 'return' key without doing something along these lines.

Making something in Pygame is actually a pretty good way to start learning programming, as the site has loads of examples.




回答2:


Ok, if you want to understand how to control this directly, start by taking a good look at the Linux (or OS X) manual pages for termios, fcntl, and stty. It's a lot of stuff but you'll see what all those flags are for.

Normally, your keyboard input is line-buffered: The terminal driver collects it until you hit return. The flag ~termios.ICANON is the one responsible for turning off line buffering, so you can immediately see what the user types.

On the other hand, if you want your program to only respond when the user presses a key, you DON'T want os.O_NONBLOCK: It means that your program won't block when it reads from the keyboard, but your reads will return an empty string. This is appropriate for live action games where things keep happening whether or not the user reacts.



来源:https://stackoverflow.com/questions/9882985/capture-keystrokes-for-a-game-python

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!