9 de octubre de 2026 · En War Zone
War Zone: píxeles gordos que llegan nítidos al teléfono
Un juego dibujado a 320 por 180 con la paleta del Atari 2600, y el icono salía borroso en Android. No era el dibujo: eran tres reescalados que nadie pidió.
War Zone es artillería por turnos con monigotes: un lienzo de 320 por 180, la paleta de 128 colores del chip de vídeo del 2600, una fuente de 3 por 5 y una calavera de 13 por 13 píxeles como logo. Todo se dibuja con rectángulos, sin un solo PNG, y el canvas se escala con image-rendering: pixelated. En el navegador, impecable. En el teléfono, la primera queja fue «el logo al iniciar no tiene mucha calidad».
El icono y la pantalla de arranque no los dibuja el juego: los genera una herramienta a partir de un PNG de 1024 píxeles, reescalándolo a cada densidad de Android con un filtro Lanczos. Es lo correcto para una foto y lo peor para una calavera de 13 celdas: cada borde se vuelve un degradado de dos o tres píxeles. Luego Android 12 toma el icono adaptable, pensado para 108 dp, y lo pinta a 240 dp en la pantalla de arranque con filtro bilineal: un segundo reescalado, hacia arriba, de 2,2 veces. Y por el camino el icono adaptable recorta un 16,7 % por lado para la máscara. Tres transformaciones, ninguna entera.
// celda de un número entero de píxeles, para que la calavera
// quepa en el círculo visible de cada recurso
const celdaEnCirculo = (diametro, aire = 0.92) =>
Math.max(1, Math.floor(diametro / 2 / radio * aire));
for (const [d, k] of Object.entries({ mdpi: 1, hdpi: 1.5, xhdpi: 2, xxhdpi: 3, xxxhdpi: 4 })) {
const fg = Math.round(108 * k), sp = Math.round(288 * k);
escribir(`mipmap-${d}/ic_launcher_foreground.png`, calavera(fg, celdaEnCirculo(fg)));
escribir(`mipmap-${d}/splash_icono_fg.png`, calavera(sp, celdaEnCirculo(sp * 2 / 3)));
}La pantalla de arranque de Android 12 admite un icono propio (windowSplashScreenAnimatedIcon), así que se le da uno de 288 dp con la calavera dentro del círculo visible de 192 dp, en vez de dejar que agrande el del lanzador. Y el fondo de la ventana mientras carga el WebView, que como PNG se estiraba a la pantalla, pasa a ser un layer-list: color plano y el mismo bitmap centrado, sin escalar. Se comprobó con capturas por adb nada más lanzar la app, con dos trampas de regalo: con la pantalla apagada las capturas salen negras, y la del arranque sale girada, porque el sistema la dibuja en vertical aunque el juego sea apaisado.
Lo mismo que limita al 2600 es lo que le da el estilo, y el juego lo usa a propósito:
- Cambiar el color entre línea y línea era gratis y un degradado horizontal, imposible: por eso los cielos a bandas.
- Dos sprites de 8 píxeles por línea, de un solo color; más que eso, parpadeo. Los fondos van en bloques de 4 por 2, el «playfield» de 40 columnas.
- Animar era apuntar a otra tabla de bytes: el monigote tiene un cuadro por pose, de 7 por 10, y se espeja para mirar al otro lado.
- Un sprite azul sobre un cielo azul no se ve. La consola no tenía contorno; el juego sí: un halo negro de un píxel alrededor de cada monigote.
Y el ojo chueco. Con todo ya nítido, el logo seguía raro: la cuenca derecha de la calavera iba corrida un píxel desde el primer día. A 5 píxeles no se nota; a 50, en la pantalla de arranque, sí, y lo vio Adrián nada más verla grande. La nitidez también sirve para eso: para que los errores se vean.
War Zone se juega en dailychallenge.click/warzone y está entrando a Google Play en prueba cerrada.