12 de octubre de 2026 · En War Zone
War Zone: la granada que parecía frenarse en el aire
«En los tiros largos y altos, la granada como que se ralentiza.» El juego no iba lento: con la CPU seis veces más lenta seguía a 30 cuadros por segundo. Lo que frenaba era la cámara.
La queja llegó así, con un «a veces» y un «como que». Lo primero fue descartar lo obvio: se corrió el juego de verdad en Chrome, con su propio bucle y la CPU frenada cuatro y seis veces, como un teléfono de gama media y uno de gama baja, y se lanzó la granada más larga y más alta que permite el castillo. Treinta ticks de simulación por segundo, y ni un cuadro por encima de 33,5 ms. El juego no se ralentizaba.
Entonces se midió lo que ve el jugador: la velocidad de la granada en píxeles de pantalla, cuadro a cuadro. Ahí estaba. Al lanzar, la cámara se abría de 2x a 1x y se centraba entre el que tira y la granada, persiguiéndola con un suavizado de 12 a 15 % por cuadro. Las tres cosas restan: al abrirse, la granada se ve a la mitad de tamaño y de velocidad; al seguirla, la cámara se lleva la mitad del movimiento; y como llegaba tarde, la granada se salía de cuadro por arriba.
tick pantalla (x, y) px por cuadro
6 143, 39 6,4
12 144, 16 2,6
18 142, 8 0,7 <- ya detrás del marcador
24 143, 8 0,4
36 153, 13 1,4La solución no fue seguirla mejor, sino no tener que seguirla. La simulación es determinista y no depende de la cámara, así que en el momento del tiro ya se sabe todo el vuelo: se simula una copia del proyectil con la misma física, sin tocar el mundo, y la cámara encuadra el recorrido entero desde el primer cuadro. Casi no se mueve, y la granada cruza la pantalla. Si el vuelo no cabe ni abierto a 1x, la cámara la acompaña en el mismo cuadro en que se acerca al borde, sin retraso.
/** Lo que le queda por volar, con la misma física y sin tocar el mundo. */
vueloRestante(p, n = 240) {
const c = { ...p }, pts = [];
for (let i = 0; i < n && c.viva; i++) {
const fin = this.pasoProyectil(c, false); // false: nada estalla de verdad
pts.push({ x: c.x, y: c.y });
if (fin) break;
}
return pts;
}La misma medición sacó otro bug que también se había reportado como otra cosa: «cuando la cámara se sale del mapa se ve una distorsión». El límite del mapa se aplicaba al destino de la cámara, no a la cámara: mientras el zoom se abría cerca del borde derecho o de abajo, el destino se recorría hacia adentro y la cámara, suavizada, llegaba tarde. La vista se pasaba del mapa hasta 22 píxeles, ahí no se dibujaba nada y el canvas conservaba el cuadro anterior: rayas. En la cueva pasaba en el 39 % de los cuadros. Ahora la cámara se encierra en sus límites con el zoom de ese mismo cuadro, el cielo y el mar se pintan también fuera del mapa, y sólo se asoma afuera, 48 píxeles como mucho, para seguir algo que de verdad se sale: una bomba que se va por el borde o un monigote que cae al vacío.
Y una tercera, de regalo, al revisar la queja del castillo («se vuelve una batalla de granadas a distancia»): el pico, la herramienta para abrir camino, nunca dejó pasar a nadie. Cavaba círculos de radio 5 empezando a 4 píxeles de la mano, y en el túnel quedaba un píxel de tierra en la boca, a los pies y a la altura de la cabeza de un monigote que mide 10. Ninguna prueba caminaba por el túnel después de cavarlo. Ahora una lo hace a 0°, ±20° y 35°, y el castillo tiene además un portón que lo atraviesa.
Las tres quejas eran ciertas y las tres describían otra cosa. Lo que las separó fue medir lo que ve el jugador, y no lo que uno cree que hace el código. War Zone 1.0.6 se juega en dailychallenge.click/warzone.