¿Te resulta más fácil leer con fondo crema, un tono de color, más contraste o un texto más grande? Elige tus colores y tu texto una sola vez, para todas las páginas.

Lección gratuita

Fundamentos del bucle de juego

Aquí está la lección completa para leer. Crea una cuenta gratuita para practicarla en un laboratorio en vivo.

Laboratorio de contenedores13 min de lectura7 comandos

Un juego es un bucle

Piensa en un cuaderno de dibujos que se hojea. Cada página es una imagen, y al pasarlas rápido las cosas parecen moverse. Un juego funciona igual: sesenta veces por segundo calcula dónde está cada cosa, dibuja una imagen y vuelve a empezar. Catch the stars es un juego pequeño de ese tipo. Caen estrellas desde arriba, tú deslizas una caja por abajo para atraparlas y pierdes una vida por cada estrella que pasa de largo.

Al terminar esta lección

Nota

Puedo decir qué hace un bucle de juego en cada fotograma, y comprobar la gravedad y las colisiones de un juego con un script corto.

Palabras clave

  • Fotograma (frame): una imagen del juego, dibujada muchas veces por segundo.
  • Bucle de juego: el código que se ejecuta una vez por fotograma: actualizar y luego dibujar.
  • Constante: un número con nombre al principio del código, como GRAVITY, que cambias en un solo sitio.
  • Gravedad: un número que se suma a la velocidad de algo que cae, en cada fotograma.
  • Colisión: dos cosas que se tocan, detectada comparando sus cajas.
  • Estado del juego: lo que el juego recuerda, como la puntuación y las vidas.

Para empezar: lo que ya sabes

Nota

Responde en tu cabeza. 1. Si se suelta una pelota, ¿cae a la misma velocidad hasta el suelo? 2. ¿Cómo sabrías que dos cajas dibujadas en un papel se solapan? 3. ¿Qué te gustaría que un juego te mostrara cuando has perdido? Respuestas: no, va más deprisa; mirar si una empieza antes de que acabe la otra, a lo ancho y a lo alto; un mensaje y una forma de volver a jugar.

Antes de empezar

Nota

Pulsa Iniciar el laboratorio en la barra de arriba de la lección y espera a que diga que está en marcha. Hay un solo contenedor, jupyter, y el terminal llega a su Python con docker exec jupyter, que ejecuta una orden dentro de él. Tiene dos enlaces. JupyterLab, el primero, es el editor, en el puerto 8888. Preview (la vista previa), el segundo, es el propio juego, en el puerto 8000: ábrelo en una pestaña de tu navegador y juega una partida ahora. Cada botón Ejecutar de abajo escribe su orden en el terminal de tu laboratorio, una detrás de otra en la misma sesión. Para verlas o escribir las tuyas, pulsa Abrir terminal (pestaña nueva) en la barra.

Un juego son unos pocos archivos sencillos

ls game lista los tres archivos del juego: index.html para la página, style.css para el aspecto y game.js para las reglas. La segunda orden muestra sus tamaños: 667, 442 y 4399 bytes, 5508 en total. Casi todo el juego está en game.js. No hay motor ni biblioteca, solo lo que el navegador ya trae.

Comando
docker exec jupyter ls game

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Comando
docker exec jupyter python3 steps/sizes.py

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

El bucle de juego

El script lee game.js y muestra las constantes con nombre del principio: GRAVITY vale 0.15, PLAYER_SPEED vale 6 y SPAWN_EVERY vale 50, una estrella nueva cada 50 fotogramas. Después lista las funciones. Dos son las más importantes. update mueve todo y comprueba lo que ha pasado, y draw pinta la imagen. La función loop llama a las dos y luego pide al navegador que la vuelva a llamar para el siguiente fotograma, con requestAnimationFrame. Esa llamada interminable es el bucle de juego.

Comando
docker exec jupyter python3 steps/loop.py

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Compruébalo

Consejo

¿Qué hace el bucle en cada fotograma, y qué constante fija cada cuánto aparece una estrella nueva? Respuesta: actualiza el juego y luego lo dibuja; SPAWN_EVERY.

Constantes y una tabla de niveles

Un buen juego guarda sus números donde se encuentran. LEVELS es una tabla de datos: cuatro filas, Drizzle, Shower, Storm y Meteors, que empiezan en las puntuaciones 0, 5, 12 y 20. Cada fila escala los números base, y el script calcula el resultado: la gravedad pasa de 0.150 a 0.360 y el hueco entre estrellas baja de 50 fotogramas a 25. Así el juego se vuelve más difícil cambiando datos y no código. Pruébalo: cambia GRAVITY en game.js, guarda, vuelve a ejecutar el script y juega en Preview.

Comando
docker exec jupyter python3 steps/levels.py

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

La gravedad es un número que se suma en cada fotograma

La gravedad no mueve una estrella por sí sola. En cada fotograma suma un poco a la velocidad de la estrella, y luego la velocidad mueve la estrella. El script sigue una estrella durante diez fotogramas a partir de la constante de game.js: la velocidad crece 0.15 en cada fotograma, hasta 1.50, y la estrella ha caído 8.25 píxeles en total. Cada fotograma da un paso mayor que el anterior, por eso una estrella parece acelerar al caer.

Comando
docker exec jupyter python3 steps/fall.py

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Una colisión es una pregunta sobre dos cajas

Para atrapar una estrella, el juego pregunta si dos cajas se solapan. Se solapan cuando cada una empieza antes de que acabe la otra, a lo ancho y a lo alto. El script hace la misma prueba en Python con seis pares fijos: las cajas que se solapan y una caja dentro de otra dan True, las cajas lejanas dan False, y también las que solo comparten un borde. El juego hace la prueba con cada estrella en cada fotograma.

Comando
docker exec jupyter python3 steps/collide.py

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Servir el juego y jugarlo

Preview es un servidor de archivos sencillo. El script le pide la página, el script del juego y la hoja de estilo, como hace un navegador, y cada uno responde 200. Nada en el laboratorio puede jugar por ti, porque no hay navegador dentro. Abre Preview en tu propia pestaña: usa las flechas izquierda y derecha, o los botones, para deslizar la caja. Tras tres estrellas perdidas, el juego dice Game over, y con Espacio o Restart empieza otra partida.

Comando
docker exec jupyter python3 steps/serve.py

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Un error frecuente

Advertencia

Mucha gente piensa que un número más grande hace mejor un juego. No es así. Si GRAVITY es demasiado grande, las estrellas caen más deprisa de lo que nadie puede reaccionar, y si PLAYER_SPEED es demasiado pequeño, la caja no llega a ponerse debajo. Cambia un solo número cada vez, juega y anota lo que viste antes de cambiar otro.

Las mismas comprobaciones en un cuaderno

Abre JupyterLab desde la barra y haz doble clic en start.ipynb. Sus celdas leen las constantes, hacen la prueba de solapamiento con dos cajas y piden la página a Preview. Haz clic en una celda y pulsa Mayús e Intro para ejecutarla. La última celda es para tu propio cambio: cambia GRAVITY, guarda y calcula dónde está una estrella tras diez fotogramas.

Comprobación final

Consejo

Responde sin mirar atrás. 1. ¿Qué dos trabajos hace el bucle de juego en cada fotograma? 2. ¿Qué cambia la gravedad en cada fotograma, la posición o la velocidad? 3. ¿Cuándo se solapan dos cajas? 4. ¿Por qué es mejor una tabla de niveles que escribir cada nivel en el código? Respuestas: actualizar y dibujar; la velocidad, y luego la velocidad mueve la estrella; cuando cada una empieza antes de que acabe la otra, a lo ancho y a lo alto; se cambian los datos y no el código.

Para el profesorado

Consejo

Esta lección es un pequeño ejemplo de una lección practicada en un laboratorio: los pasos y los botones Ejecutar son la lección, y el laboratorio es la copia propia de cada alumno. El laboratorio es un solo servicio, JupyterLab con una copia en directo de un juego pequeño, y nada de lo que hay aquí se corrige solo: el alumno entrega su propia versión de los tres archivos de game, descargados desde JupyterLab, y una frase sobre un número que cambió y lo que hizo. Ideas clave: 1. Un juego es un bucle de actualizar y dibujar. 2. La gravedad cambia la velocidad, y la velocidad cambia la posición. 3. Una colisión es una prueba sobre cajas, y los números van en constantes con nombre y en tablas. Error frecuente: cambiar varios números a la vez. Material: el laboratorio y un navegador, porque el laboratorio no tiene ninguno y el juego se juega en el del alumno. Consejo: pida al alumnado que prediga qué hará un cambio antes de recargar. El juego y los scripts se escriben a partir de un texto fijo, así que todas las copias dan los mismos números, pero el lugar donde empieza una estrella es aleatorio. Cópiela en su propio módulo y modifíquela, o cree una desde cero con el menú Laboratorio del constructor de lecciones.

Sobre este laboratorio y su código: Laboratorio de desarrollo de juegos: bucle de juego, gravedad y colisiones en el navegador

¿Enseñas a una clase? Asigna estas lecciones a tus estudiantes con calificación y un laboratorio para cada uno.