pygame
Manejo de eventos
Buscar..
Bucle de eventos
Pygame registrará todos los eventos del usuario en una cola de eventos que puede recibirse con el código pygame.event.get()
. Cada elemento de esta cola es un objeto de Event
y todos tendrán el type
atributo, que es un número entero que representa qué tipo de evento es. En el módulo de pygame hay constantes enteras predefinidas que representan el tipo. Excepto por este atributo, los eventos tienen atributos diferentes.
Nombre constante | Atributos |
---|---|
DEJAR | ninguna |
Evento activo | ganancia, estado |
Tecla de abajo | Unicode, clave, mod |
TECLA ARRIBA | clave, mod |
MOUSEMOCION | pos, rel, botones |
MOUSEBUTTONUP | pos, botón |
MOUSEBUTTONDOWN | pos, botón |
JOYAXISMOTION | alegría, eje, valor |
JOYBALLMOTION | alegría, pelota, rel |
Alegria | alegría, sombrero, valor |
JOYBUTTONUP | alegría botón |
JOYBUTTONDOWN | alegría botón |
VIDEORESIZAR | tamaño, w, h |
Videoexpuesto | ninguna |
USEREVENT | código |
Ejemplo
Para manejar nuestros eventos, simplemente recorramos la cola, verificamos qué tipo es (con la ayuda de las constantes predefinidas en el módulo de pygame) y luego realizamos alguna acción. Este código verificará si el usuario ha presionado el botón de cerrar en la esquina superior de la pantalla y, si es así, finalizar el programa.
for event in pygame.event.get():
if event.type == pygame.QUIT:
# Close the program any way you want, or troll users who want to close your program.
raise SystemExit
ATENCIÓN : ¡Debes llamar a la cola de eventos regularmente cuando usas pygame! Además de obtener los eventos disponibles, llamar a la cola de eventos también es la forma en que Pygame interactúa con el sistema operativo internamente. Si la cola de eventos no se llama regularmente, su sistema operativo asumirá que su programa ya no funciona correctamente y posiblemente hará que parezca que el programa se bloqueó (en Windows la ventana se vuelve blanca). Si no quieres hacer nada con los eventos, debes llamar a pygame.event.pump()
cada ciclo del juego para hacer que pygame procese los eventos internamente.
Eventos del teclado
Hay dos tipos de eventos clave en pygame: KEYDOWN
y KEYUP
. Estos eventos tienen una key
atributo que es un número entero que representa una clave en el teclado. El módulo pygame tiene constantes enteras predefinidas que representan todas las claves comunes. Las constantes se nombran con una K
mayúscula, un guión bajo y el nombre de la clave. Por ejemplo, <- se llama K_BACKSPACE
, a se llama K_a
y F4 se denomina K_F4
.
Ejemplo
Este código verificará si el usuario ha presionado w , a , s o d .
for event in pygame.event.get():
if event.type == pygame.QUIT: # Usually wise to be able to close your program.
raise SystemExit
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_w:
print("Player moved up!")
elif event.key == pygame.K_a:
print("Player moved left!")
elif event.key == pygame.K_s:
print("Player moved down!")
elif event.key == pygame.K_d:
print("Player moved right!")
Modificadores
No hay una constante entera para mayúsculas. En su lugar, los eventos clave tienen otro atributo llamado mod
, que son los modificadores ( shift , ctrl , alt etc.) que se presionan simultáneamente como la tecla. El atributo mod
es un número entero que representa el modificador que se presiona. El valor entero de cada modificador se almacena en el módulo pygame con el nombre de KMOD_
y su nombre. Por ejemplo, el desplazamiento a la izquierda se llama KMOD_LSHIFT
, la pestaña se llama KMOD_TAB
y Ctrl se llama KMOD_CTRL
.
Ejemplo
Este código será comprobado si el usuario pulsa una, desviación a la izquierda + a + o gorras a.
for event in pygame.event.get():
if event.type == pygame.QUIT: # It's still wise to be able to close your program.
raise SystemExit
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_a:
if event.mod == 0: # No modifier.
print("You pressed 'a'")
elif event.mod == pygame.KMOD_LSHIFT or event.mod == pygame.KMOD_CAPS:
print("You pressed 'A'")
else:
print("You pressed 'a' with another modifier than right shift or caps.")
Eventos del mouse
Hay tres tipos de eventos de mouse en pygame MOUSEMOTION
, MOUSEBUTTONDOWN
y MOUSEBUTTONUP
. Pygame registrará estos eventos cuando se haya establecido un modo de visualización.
MOUSEMOTION
se recibe cuando el usuario mueve su mouse en la pantalla. Tiene los buttons
atributos, pos
y rel
.
-
buttons
es una tupla que representa si los botones del mouse (left
,mouse-wheel
,right
) se presionan o no. -
pos
es la posición absoluta (x
,y
) del cursor en píxeles. -
rel
es la posición relativa a la posición anterior (rel_x
,rel_y
) en píxeles.
MOUSEBUTTONDOWN
y MOUSEBUTTONUP
se reciben cuando el usuario presiona o suelta un botón del mouse. Tienen el button
atributos y pos
.
-
button
es un número entero que representa el botón que se presiona.1
para el botón izquierdo, 2 para la rueda del ratón y3
para el botón derecho. -
pos
es la posición absoluta del mouse (x
,y
) cuando el usuario presionó el botón del mouse.
Ejemplo
Aquí hay un breve ejemplo que utiliza algunos de los atributos de cada evento del mouse:
for event in pygame.event.get():
if event.type == pygame.QUIT: # Close your program if the user wants to quit.
raise SystemExit
elif event.type == pygame.MOUSEMOTION:
if event.rel[0] > 0: # 'rel' is a tuple (x, y). 'rel[0]' is the x-value.
print("You're moving the mouse to the right")
elif event.rel[1] > 0: # pygame start y=0 at the top of the display, so higher y-values are further down.
print("You're moving the mouse down")
elif event.type == pygame.MOUSEBUTTONDOWN:
if event.button == 1:
print("You pressed the left mouse button")
elif event.button == 3:
print("You pressed the right mouse button")
elif event.type == pygame.MOUSEBUTTONUP:
print("You released the mouse button")
Como no hay constantes predefinidas para el atributo de botón del mouse en el módulo de pygame, aquí están los valores para cada uno:
Botón | Valor |
---|---|
Boton izquierdo del raton | 1 |
Botón de la rueda del ratón | 2 |
Botón derecho del mouse | 3 |
Rueda del ratón desplazarse hacia arriba | 4 |
La rueda del mouse se desplaza hacia abajo | 5 |
Al desplazar el botón del mouse se generarán los eventos pygame.MOUSEBUTTONDOWN
y pygame.MOUSEBUTTONUP
.
Comprobación del estado
Es posible llamar a funciones desde el módulo pygame.key
y pygame.mouse
para recibir el estado de la tecla y el mouse. Sin embargo, no es la forma recomendada de procesar eventos en pygame, ya que existen algunos defectos:
Recibirá los estados cuando se llame a la función, lo que significa que puede perder eventos entre las llamadas si el usuario está presionando los botones rápidamente.
No se puede determinar el orden de los eventos.
Aún debes llamar a una de las funciones de eventos de pygame para que pygame interactúe internamente con el sistema operativo, de lo contrario, advertirá que el programa no responde. Las funciones que puedes llamar son:
-
pygame.event.get()
para obtener todos los eventos o tipos de eventos (pasando los tipos como un argumento) de la cola. -
pygame.event.poll()
para obtener un solo evento de la cola. -
pygame.event.wait()
para esperar un solo evento de la cola. -
pygame.event.clear()
para borrar todos los eventos en la cola. -
pygame.event.pump()
para permitir que pygame maneje acciones internas (las funciones anteriores lo llaman implícitamente).
-
Eventos del teclado
El módulo de claves tiene una función pygame.key.get_pressed()
que devuelve una lista del estado de todas las claves. La lista contiene 0
para todas las teclas que no se presionan y 1
para todas las teclas que se presionan. Su índice en la lista está definido por constantes en el módulo de pygame, todos con el prefijo K_
y el nombre de la clave.
pygame.event.pump() # Allow pygame to handle internal actions.
key = pygame.key.get_pressed()
if key[pygame.K_a]:
print("You pressed 'a'")
if key[pygame.K_F1]:
print("You pressed 'F1'")
if key[pygame.K_LSHIFT]:
print("You pressed 'left shift'")
if key[pygame.K_q]: # Press 'q' to exit the program
quit()
Si desea verificar una sola pulsación de tecla en lugar de si la tecla se mantiene presionada, puede almacenar el estado anterior de todas las teclas en una variable temporal y verificar si el valor cambia:
pygame.event.pump() # Allow pygame to handle internal actions.
key = pygame.key.get_pressed()
if key[pygame.K_q] and not previous_key[pygame.K_q]:
print("You pressed 'q'")
if key[pygame.K_p] and not previous_key[pygame.K_p]:
print("You pressed 'p'")
previous_key = key
La instrucción se evalúa como verdadera solo cuando se presiona la tecla actual y no se presiona la tecla anterior. Para verificar si el usuario soltó la clave, solo tiene que cambiar la palabra clave not
( if not key[pygame.K_q] and previous_key[pygame.K_q]
). Para que esto funcione correctamente, debes configurar la variable previous_key = pygame.key.get_pressed()
antes del ciclo del juego, de lo contrario recibirás un NameError
.
Eventos del mouse
El módulo del mouse tiene funciones que nos permiten verificar y establecer la posición del mouse, así como también verificar los botones que se presionan. La función pygame.mouse.get_pressed()
devuelve una tupla de tupla que representa si los botones del mouse (izquierda, rueda del mouse, derecha) se presionan o no.
pygame.event.pump() # Allow pygame to handle internal actions.
mouse_pos = pygame.mouse.get_pos()
mouse_buttons = pygame.mouse.get_pressed()
if mouse_pos[0] > 100:
pygame.mouse.set_pos(10, mouse_pos[1]) # Reset the mouse's x-position to 10.
print("YOU SHALL NOT PASS!")
if mouse_buttons[2]:
print("I'm right, right?")
if mouse_buttons[0]: # Press left mouse button to exit.
print("Program left")
quit()