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.
docker exec jupyter ls gameSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
docker exec jupyter python3 steps/sizes.pySe 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.
docker exec jupyter python3 steps/loop.pySe 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.
docker exec jupyter python3 steps/levels.pySe 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.
docker exec jupyter python3 steps/fall.pySe 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.
docker exec jupyter python3 steps/collide.pySe 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.
docker exec jupyter python3 steps/serve.pySe 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.