Development Log
Articles, tutorials, and thoughts on programming and game development.
Articles, tutorials, and thoughts on programming and game development.
El desarrollo web tradicional a veces puede sentirse... estático. Cuando me propuse rediseñar mi rincón en internet, tenía una regla de oro: debía sentirse como un videojuego, pero funcionar como una web moderna.
En este artículo te cuento paso a paso cómo logré unir el mundo del DOM con el renderizado de alto rendimiento de HTML5 Canvas.
Para este proyecto, decidí mantener las dependencias al mínimo y aprovechar las herramientas nativas. Mi stack principal fue:
Next.js 15: Para el enrutamiento, SSR y el motor del blog.
React: Gestión de estado y ciclo de vida de la UI.
HTML5 Canvas: Todo el sistema de partículas, estrellas y colisiones.
CSS Modules: Estilado encapsulado (nada de Tailwind esta vez, quería control total píxel por píxel).
El mayor desafío no fue dibujar las estrellas, sino asegurar que el juego corriera a 60 FPS constantes sin bloquear los hilos de React.
Para lograrlo, utilicé requestAnimationFrame encapsulado dentro de un useEffect. Aquí un fragmento simplificado de cómo se inicializa el motor:
useEffect(() => {
constcanvas=canvasRef.current;
if (!canvas)return;
constctx=canvas.getContext("2d");
letanimationId:number;
functionanimate() {
animationId=requestAnimationFrame(animate);
// 1. Limpiamos el frame anterior
ctx.clearRect(0,0,canvas.width,canvas.height);
// 2. Calculamos físicas y colisiones
updatePhysics();
// 3. Dibujamos la nueva escena
drawBackground(ctx);
drawShip(ctx);
}
animate();// ¡Arrancamos el motor!
return () =>cancelAnimationFrame(animationId);
}, []);
Comments