Capítulo 03

Reset y creación de enemigos

Objetivo: entender cómo se prepara una partida y cómo se construye la formación enemiga.

1. Reinicio de partida

reset()
function reset() {
    player = { x: W / 2, y: H - 36 };
    bullets = [];
    enemyBullets = [];
    particles = [];
    score = 0;
    lives = 3;
    gameOver = false;
    enemyDir = 1;
    enemySpeed = 0.5;
    lastEnemyShot = p.millis();
    spawnEnemies();
}

La nave vuelve al centro inferior. Los arreglos se vacían para eliminar balas y partículas anteriores. lastEnemyShot toma el tiempo actual con p.millis() para que el temporizador enemigo empiece desde el reinicio. La llamada final a spawnEnemies() crea la primera oleada.

2. Tamaño de la oleada

Filas, columnas y origen
let cols = 8 + p.min(level - 1, 4);
let rows = 3 + p.min(level - 1, 3);
let ew = 34, eh = 26, gap = 10;
let ox = (W - cols * (ew + gap)) / 2 + gap / 2;

cols y rows crecen con el nivel, pero tienen límite gracias a p.min(). ew y eh son el tamaño de cada enemigo. gap separa las celdas. ox centra la formación en el canvas.

3. Filas, columnas y tipo

Oleada generada por filas y columnas
Creación de enemigos
for (let r = 0; r < rows; r++) {
    for (let c = 0; c < cols; c++) {
        enemies.push({
            x: ox + c * (ew + gap), y: 50 + r * (eh + gap),
            w: ew, h: eh, alive: true,
            type: r === 0 ? 2 : (r < 3 ? 1 : 0)
        });
    }
}

Cada enemigo guarda posición, tamaño, estado alive y tipo. El tipo depende de la fila: la fila superior vale más y usa color distinto durante el render.