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 y 3 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()


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow