Entrada de p5 y loop del juego
Objetivo: entender cómo el launcher entra al módulo, qué significan p y ctx, y por qué el archivo devuelve una función.
1. Registro del módulo
El juego se registra dentro de window.__gameRegistry. El launcher no necesita conocer funciones internas como update() o drawGame(); solo busca la clave space-invaders y ejecuta la función asociada.
window.__gameRegistry = window.__gameRegistry || {};
window.__gameRegistry['space-invaders'] = function(p, ctx) {p es la instancia de p5.js. Desde ahí salen funciones como p.createCanvas(), p.background(), p.random(), p.millis(), p.keyIsDown() y p.text(). ctx pertenece al sitio y permite conectar el juego con el contenedor, el marcador externo y el estado activo.
2. Refresco por frames
p5 trabaja redibujando el canvas muchas veces por segundo. En este proyecto, el módulo devuelve una función que el sistema llama en cada frame. Esa función decide si la partida está pausada, terminada o activa.
return function() {
if (!active) { drawGame(); drawPaused(); return; }
if (gameOver) { drawGame(); drawGameOver(); return; }
update();
drawGame();
};Cuando active es falso, el juego dibuja la escena y encima el overlay de pausa, pero no llama a update(). Cuando gameOver es verdadero, dibuja la escena y encima el overlay de derrota. Solo en una partida activa se ejecuta update() antes de drawGame().
3. Update no es render
update() modifica el estado: posiciones, balas, enemigos, colisiones, vidas, score y partículas. drawGame() representa ese estado en pantalla. Separar estas dos ideas evita confundir reglas de juego con dibujo.