HOWTO · Pygame

Cómo obtener entrada de teclado en Pygame

Este artículo trata sobre cómo obtener entradas de teclado en Pygame. Hay dos formas de obtener entrada de teclado: con el bucle de eventos y pygame.key.get_pressed().

En esta página

Elige el manejo de la entrada según lo que necesite tu juego: usa un evento KEYDOWN para responder una vez cuando se pulsa una tecla, y llama a pygame.key.get_pressed() para comprobar qué teclas están pulsadas durante el fotograma actual. Los ejemplos siguientes muestran ambos enfoques en un bucle de ventana completo.

Usar el bucle de event para obtener la entrada de teclado en Pygame

Pygame pone en cola los eventos de entrada y de ventana para tu programa. En cada fotograma, recorre pygame.event.get() e inspecciona el type de cada evento. Un evento KEYDOWN marca una pulsación; su campo key identifica la tecla, por ejemplo pygame.K_e. KEYUP marca una liberación. Gestiona estos eventos en el bucle para que la ventana siga procesando también los eventos del sistema.

Un evento de pulsación es útil para acciones como abrir un menú o disparar una vez. Mantener la tecla pulsada no convierte ese único evento KEYDOWN en una comprobación continua del estado de pulsación. Para acciones continuas, consulta el estado actual como se muestra en la sección siguiente. Los patrones cortos de eventos y de consulta son partes de una aplicación, no ventanas completas; un marco básico de Pygame explica la configuración de la ventana por separado.

Usar pygame.key.get_pressed() para obtener la entrada de teclado en Pygame

Llama a pygame.key.get_pressed() una vez por fotograma. Devuelve un objeto similar a una secuencia que representa el estado actual del teclado; accede a él con una constante de tecla de Pygame, por ejemplo keys[pygame.K_w]. Cuando ese valor es verdadero, la tecla está pulsada en ese momento, así que un juego puede actualizar el movimiento en cada fotograma. Esta función informa de un estado, no de un evento de pulsación. Una pulsación muy breve que empieza y termina entre dos consultas puede pasar desapercibida, así que usa la cola de eventos cuando importan todas las pulsaciones y liberaciones.

El ejemplo siguiente combina ambas técnicas: una pulsación o liberación de E se gestiona mediante la cola de eventos, mientras que W se comprueba mediante el estado actual de las teclas. Abre una ventana de 640 por 480 y se ejecuta durante un fotograma para que puedas lanzarlo sin necesidad de cerrar la ventana manualmente. Para un juego que permanezca abierto, cambia el límite de fotogramas a while running; mantén la gestión de eventos, la actualización de la pantalla y el control de la velocidad de fotogramas dentro de ese bucle. Se requieren Pygame y una pantalla gráfica.

Ejecuta este ejemplo:

import os

os.environ.setdefault("PYGAME_HIDE_SUPPORT_PROMPT", "1")
os.environ.setdefault("SDL_VIDEODRIVER", "dummy")

import pygame

pygame.display.init()
screen = pygame.display.set_mode((640, 480))
clock = pygame.time.Clock()
running = True
frames = 0

while running and frames < 1:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN and event.key == pygame.K_e:
            print("E Pressed")
        elif event.type == pygame.KEYUP and event.key == pygame.K_e:
            print("E Released")

    keys = pygame.key.get_pressed()
    if keys[pygame.K_w]:
        print("W is held")

    screen.fill((20, 20, 20))
    pygame.display.flip()
    clock.tick(60)
    frames += 1

pygame.quit()
print("Loop completed.")
Loop completed.