Un nivel es una fila de datos
Un nivel de un videojuego se puede describir como datos. Es una fila de una tabla, y cada fila dice desde qué puntuación empieza y cómo cambian la velocidad y el ritmo. Así, hacer el juego más difícil es cambiar la tabla y no reescribir el código.
Al final sabrás leer una tabla de niveles y calcular cuándo aparece cada objeto. Lo harás con las cuatro filas del juego del laboratorio.
Al terminar esta lección
Nota
Puedo describir los niveles de un juego como datos y calcular cuándo aparece cada objeto en cada nivel.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Nivel | una etapa del juego con sus propias reglas de dificultad | Storm |
| Dificultad | lo difícil que es el juego en cada momento | |
| Escala | un número por el que se multiplica un valor base | gravityScale |
| Intervalo de aparición | cada cuántos fotogramas sale un objeto nuevo | SPAWN_EVERY |
| Plan de aparición | la lista de fotogramas en que sale cada objeto |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Más dificultad es cambiar datos
Si escribes cada nivel dentro del código, cambiar uno obliga a tocar muchas líneas. Es mejor una tabla.
Cada fila tiene un nombre, la puntuación desde la que vale y dos escalas. El código solo busca la fila que toca. Para añadir un nivel se añade una fila.
La tabla de niveles del laboratorio
var LEVELS = [
{ name: "Drizzle", from: 0, gravityScale: 1.0, spawnScale: 1.0 },
{ name: "Shower", from: 5, gravityScale: 1.4, spawnScale: 1.25 },
{ name: "Storm", from: 12, gravityScale: 1.8, spawnScale: 1.6 },
{ name: "Meteors", from: 20, gravityScale: 2.4, spawnScale: 2.0 }
];Toca la última fila alcanzada
El juego recorre la tabla en orden. Empieza por la primera fila. Cada vez que la puntuación llega al from de una fila, esa fila pasa a ser la elegida.
Con 7 puntos se alcanzan las filas de 0 y de 5, pero no la de 12. La última alcanzada es Shower.
Buscar el nivel que toca
function levelFor(points) {
var found = LEVELS[0];
for (var i = 0; i < LEVELS.length; i++) {
if (points >= LEVELS[i].from) {
found = LEVELS[i];
}
}
return found;
}Cada cuántos fotogramas sale una estrella
La base es SPAWN_EVERY = 50: una estrella cada 50 fotogramas. La spawnScale del nivel la acelera: 50 dividido entre la escala, redondeado al entero más cercano.
Con escala 1,25 salen cada 40 fotogramas. Con 1,6, cada 31, porque 50 entre 1,6 son 31,25. Los fotogramas múltiplos de ese intervalo son los que sacan una estrella.
Un ejemplo con números: cada nivel
| Nivel | Desde | Gravedad | Una estrella cada |
|---|---|---|---|
| Drizzle | 0 | 0,15 por 1,0 = 0,150 | 50 fotogramas |
| Shower | 5 | 0,15 por 1,4 = 0,210 | 40 fotogramas |
| Storm | 12 | 0,15 por 1,8 = 0,270 | 31 fotogramas |
| Meteors | 20 | 0,15 por 2,4 = 0,360 | 25 fotogramas |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Calcula los cuatro niveles en el laboratorio
El laboratorio tiene un script que lee la tabla de game.js y calcula el resultado de cada fila, justo como la tabla de arriba. Escribe en inglés: levels: 4 y una línea por nivel, con from score y a star every.
Si cambias un número de LEVELS en game.js y repites el comando, las líneas cambian.
Calcular gravedad y ritmo de cada nivel
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.
Dónde está la tabla dentro del código
La palabra LEVELS aparece en pocas líneas: donde se declara la tabla y donde la recorre levelFor. El comando las busca. Escribe cinco líneas con su número: 15, 28, 29, 30 y 31.
Esa corta lista demuestra la idea de la lección: los niveles viven en un solo sitio.
Buscar dónde se usa la tabla LEVELS
docker exec jupyter grep -n "LEVELS" game/game.jsSe 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 cree que un nivel más difícil es el que más cosas lanza. Un juego con demasiados enemigos a la vez es injusto, no difícil. Sube un número cada vez, juega y comprueba que sigue siendo posible ganar.