anthonynorton
anthonynorton

Reputation: 1173

Capture keystrokes for a game (python)

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)

Upvotes: 3

Views: 3364

Answers (2)

alexis
alexis

Reputation: 50190

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.

Upvotes: 1

fraxel
fraxel

Reputation: 35269

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.

Upvotes: 1

Related Questions