Cómo hicimos La Pecera de Píxeles

Un pez que crece, se alimenta y usa accesorios, dibujado enteramente por código. Cero imágenes, cero archivos de audio, todo corre en tu navegador.

Un pez sin una sola imagen

Todo el pez —cuerpo, cola, aletas, ojo, sombrero, corona— se dibuja con ctx.fillRect(), rectángulo por rectángulo, en una cuadrícula invisible. No hay ningún archivo .png ni .svg involucrado. La ventaja: el pez pesa prácticamente cero, y cambiarle el color por etapa es literalmente cambiar una variable, no editar una imagen.

El truco central es describir cada parte del cuerpo como un perfil de anchos: un arreglo donde cada número dice cuántas celdas de ancho tiene esa fila. Un óvalo, por ejemplo, es angosto arriba, ancho al medio y angosto abajo:

const BODY_WIDTHS = [4, 8, 10, 10, 8, 4]; // celdas de ancho, fila por fila

BODY_WIDTHS.forEach((width, row) => {
  const startCol = rightEdge - width;       // centrado hacia el mismo borde derecho
  ctx.fillRect(startCol * CELL, row * CELL, width * CELL, CELL);
});

La cola bifurcada usa el mismo truco, pero dibujando dos puntas separadas por una fila vacía en el medio, justo donde el cuerpo es más ancho —así se ve como una cola de verdad, no como un bloque pegado al costado—.

Cómo crece, sin servidor

El pez evoluciona según cuántas veces lo has alimentado, y desbloquea accesorios según cuánto tiempo real llevas con la pestaña activa —no importa si es hoy o en tres visitas distintas—. Ambos números se guardan en localStorage, en el navegador de cada persona. No hay base de datos ni cuenta de usuario: tu pez es tuyo, vive en tu computador.

El tiempo activo se cuenta con cuidado: solo suma mientras la pestaña está realmente visible (document.visibilityState), para no premiar a alguien por dejar quince pestañas abiertas en segundo plano.

El efecto de que "sale de la pantalla"

El marco de la pecera usa perspective y rotateX/rotateY de CSS, ajustados en tiempo real según la posición del mouse. El resultado es que el tanque parece inclinarse hacia ti, como si flotara delante de la página en vez de estar pegado a ella. Sumamos un translateZ pequeño y una sombra de color debajo para reforzar la sensación de profundidad.

En celular, donde no hay mouse, el efecto se desactiva solo —queda plano, sin inclinación—, porque seguirle el dedo a alguien en una pantalla táctil se siente raro, no elegante.

Sonido sin un solo archivo de audio

Los sonidos —el splash al alimentar, el "ñam" al comer, la fanfarria al evolucionar— se generan con la Web Audio API: osciladores que suben o bajan de frecuencia en unos cien milisegundos, sin depender de ningún .mp3. Es la misma técnica que enseñamos en nuestro curso de JavaScript, aplicada aquí para algo real.

¿Quieres algo interactivo así, con tu marca? Lo armamos a medida.

Cotizar un proyecto