domingo, 13 de abril de 2025

Herramientas. PyGame.

Segunda sección. Game loop.

Curiosamente el game loop, que es el corazón del script y el componente fundamental de su segunda sección, es posible que no esté presente, o no del modo en que se espera, en determinados usos de PyGame. Usos poco frecuentes y posiblemente no especialmente ajustados a las posibilidades de esta biblioteca, pero no por ello menos posibles.



La sección 2 se asocia normalmente al bucle infinito del juego (game loop) y es, a su vez, la parte más compleja del script PyGame, estando conformado, normalmente por las siguientes secciones:
  • Manejo de eventos
  • Actualización de pantalla
  • Dibujar nuevo contenido
El game loop se suele formular mediante el bucle while (while not salir:), ya que este bucle se ejecuta mientras se cumpla determinada condición, la cual suele establecerse a priori (salir = False). 

En este nuestro ejemplo se formula el game loop y su bucle while mediante una doble negación, lo cual no suele ser la norma, la cual simplifica esta formulación que suele hacerse en positivo (vg):
  • running = True
  • while running:
La primera parte del game loop es el manejo de los eventos que se producen en la pantalla, los cuales pueden ser objeto de un tratamiento muy simple o de mucha complejidad. En el script que nos sirve de referencia se manejan eventos del modo más sencillo posible, y está bien que así sea para empezar, pero en posteriores ejemplos veremos algunas de las múltiples posibilidades que presenta el manejo de eventos. De momento nos servirá saber que se requieren un segundo bucle (en esta caso un bucle for (for event in pygame.event.get():) que se complementa con estructuras condicionales (vg. if event.type == pygame.QUIT:), las cuales capturan los eventos y, en función de ellos, se toman decisiones (en este caso salir = True, que equivale a salir del game loop).

Además del acceso a los eventos de pantalla, el game loop también incluye otras dos partes, ambas fuera del bucle for de captura de eventos: la actualización de la pantalla (screen.blit(imgBackground, (0, 0))) y dibujar en la pantalla lo creado previamente (pygame.display.flip()). Estas instrucciones son obligadas y en ese mismo orden. En caso de ausencia o de inversión del orden se altera el correcto funcionamiento del script.

Curiosamente ambas afectan más al funcionamiento del script que el propio game loop. Lo digo en el sentido de que su ausencia invalida el script, pero no la ausencia del game loop, aunque ésta impide la creación de un juego como tal, pero no el uso de PyGame para otras utilidades. 

Para ejemplificar la posibilidad de crear un script PyGame sin game loop pondré un ejemplo muy sencillo aunque : la sucesión de pantallas de diferentes colores. Para ello repetiré una secuencia de cuatro instrucciones tres veces, mostrando así tres pantallas de tres colores diferentes. Y todo ello sin utilizar ni el bucle while (game loop) ni el bucle for (asociado en game loop a la captura de eventos. 

El script completo está accesible desde [este enlace], pero paso a explicar la composición de estas estructuras que, en esta ocasión se repiten tres veces.

imgBackground.fill((0, 0, 255))
screen.blit(imgBackground, (0, 0))
pygame.display.flip()
pygame.time.delay(2000)

La primera instrucción es, si recuerdas, la tercera del bloque de tres instrucciones situadas en la sección 1ª del script modelo dedicadas a establecer el fondo de pantalla. La segunda y tercera son las mismas que ubicamos dentro del game loop para actualizar la pantalla y la cuarta nos permite establecer un tiempo de espera que facilita apreciar el funcionamiento del script: en esta caso establecemos una demora de 2 segundos, usando para ello la función delay() asociada al objeto time de la biblioteca pygame.

Realmente este script no es más que un ejercicio que que demuestra que es posible trabajar con PyGame  sin usar game loop, pero no tiene una utilidad inmediata. Para que sí la tenga necesitamos aprender aun unas cuantas cosas. Cuando lo hagamos y estemos en condiciones de demostrar lo que ahora adelanto, prometo que lo pondremos en práctica.

No hay comentarios:

Publicar un comentario

Comenta esta entrada