Ir al contenido
Ayotl

← Todas las notas

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,4
El mismo tiro, antes: de 6,4 a 0,4 píxeles por cuadro, y casi un segundo fuera de cuadro.

La 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;
}
Ahora el mismo tiro va a entre 2 y 6 píxeles por cuadro, y se ve entero.

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.

Todas las notas