Ir a los juegos
Hadukis

Blog

Por qué nuestros fuertes se caían solos

· 4 min de lectura

Un juego de demolición con física hace una promesa que va antes que cualquier otra: lo que estás a punto de tirar está en pie. En las primeras versiones de ScaleSling, algunos fuertes temblaban al cargar el nivel, y unos cuantos sencillamente se caían mientras el jugador todavía apuntaba el primer disparo.

Es muy fácil echarle la culpa al motor de física y ponerse a ajustar la fricción y la densidad hasta que deja de tambalearse. Estuvimos a punto. Ninguna de las causas resultó ser el motor.

Veinticuatro pares de bloques, nacidos uno dentro del otro

Cada nivel es una lista de bloques con una posición y un tamaño, y cada uno de esos números se escribió a mano. Un tablón de 42 píxeles de ancho colocado a 32 píxeles de su vecino se solapa con él diez píxeles. En pantalla, diez píxeles de solape no se ven: los sprites solo parecen tocarse.

Dos cuerpos rígidos no pueden ocupar el mismo espacio. En el primer paso de la simulación, el motor los encuentra solapados y los separa, con fuerza. Ese empujón era lo que el jugador veía como un temblor, y en una pila alta bastaba para tirarla entera.

Un script que lee todos los niveles encontró 24 pares solapados en 16 de los 24 niveles, con solapes de 3 a 11 píxeles. Un segundo script separa cada par a lo largo del eje en el que se solapan menos (casi siempre el eje por el que el autor del nivel quería que se tocaran), la mitad de la distancia cada uno, en varias pasadas para que arreglar un par no cree otro. Deja en paz los bloques girados, porque la huella real de un tablón inclinado no es su ancho y su alto.

Una valla a la que le faltaba un poste

Cinco niveles compartían una valla que se había copiado de uno a otro: una viga de 130 píxeles de largo apoyada en un solo poste. Su centro de masas quedaba 39 píxeles más allá del apoyo. Se volcaba, siempre, y caía 48 píxeles antes de que nadie la tocara.

La primera idea fue deslizar la viga hacia atrás, encima del poste. Se probó, y la metió dentro de otra viga más larga que tenía al lado, que es peor. La viga no era demasiado larga; a la valla le faltaba el poste del otro extremo. Añadirlo arregló los cinco niveles de una vez.

Cómo sabemos que está arreglado

En vez de jugar los niveles y dar por bueno que se veían bien, añadimos una comprobación de estabilidad que carga cada nivel en el motor de física real, no dispara nada, espera cuatro segundos simulados y mide cuánto se ha movido cada bloque.

Antes de los arreglos, seis niveles se derrumbaban solos y el peor bloque se movía 48 píxeles. Después, ninguno, y el mayor movimiento en cualquier sitio es de 10 píxeles: el asentamiento normal de una pila que busca su reposo. La comprobación se ejecuta sin navegador, así que se ejecuta cada vez que cambia un nivel.

El bloque que salía la mitad más alto

Una de las causas no estaba en los datos de los niveles. Un tablón pedido de 26 por 88 píxeles llegaba al mundo con 26 por 131. Un trol con un radio de colisión de 27 tenía un radio de 20.

El framework sobre el que está hecho el juego escala el cuerpo físico de un objeto junto con su imagen. Declarar el cuerpo con el tamaño correcto y luego redimensionar el sprite para que encajara escalaba el cuerpo una segunda vez, en la proporción entre el archivo de imagen y el tamaño pedido. No salía ningún error. Las torres simplemente descansaban veinte píxeles por encima del suelo, y los disparos atravesaban cosas que parecían sólidas.

El arreglo es dimensionar primero la imagen y luego sustituir el cuerpo por uno exacto. La única forma en que encontramos el problema fue midiendo los cuerpos directamente en vez de leer el código, que parecía correcto, y así es como se comprueba ahora cada tipo de objeto nuevo.

Una trampa más: las estrellas

Cada nivel da tres estrellas al llegar al 95% de los puntos totales del tablero. Ese objetivo se escribe en el archivo del nivel cuando se genera el nivel, no se calcula al arrancar el juego.

Cuando se quitaron los dirigibles de seis niveles, cada uno perdió 900 puntos de cosas que destruir, pero el objetivo de tres estrellas seguía pidiéndolos. Seis niveles que se podían completar a la perfección pasaron a ser niveles que no, y el cambio parecía un solo objeto borrado. Ahora, cualquier cambio en lo que hay en el tablero de un nivel recalcula sus estrellas en el mismo cambio.

La lección general

Una estructura que se cae parece un problema de física, así que invita a arreglos de física: más fricción, bloques más pesados, una simulación más lenta. Cualquiera de ellos habría escondido los fallos reales y habría hecho que golpear se sintiera peor. Las causas estaban en los datos (coordenadas escritas a mano, una valla copiada, un número caducado), y lo que las encontró fue medir, no ajustar.

Los fuertes de ScaleSling ahora aguantan en pie hasta que los tiras. Prueba a tirar uno.