Capítulo 06

Movimiento grupal enemigo

Objetivo: explicar cómo una formación de enemigos se mueve como bloque, baja al tocar bordes y aumenta dificultad.

1. Movimiento lateral

Avance por enemigo vivo
let edgeHit = false;
let anyAlive = false;
for (let e of enemies) {
    if (!e.alive) continue;
    anyAlive = true;
    e.x += enemySpeed * enemyDir;
    if (e.x + e.w / 2 > W - 6 || e.x - e.w / 2 < 6) edgeHit = true;
}

Cada enemigo vivo suma la misma cantidad a e.x, por eso la formación conserva su estructura. enemyDir vale 1 o -1; al multiplicarlo por enemySpeed, el mismo cálculo sirve para avanzar a derecha o izquierda.

2. Borde, descenso y aceleración

Borde detectado: cambia dirección y baja
Reacción al borde
if (edgeHit) {
    enemyDir *= -1;
    for (let e of enemies) if (e.alive) e.y += 18;
    enemySpeed = p.abs(enemySpeed) * 1.06;
    enemySpeed = p.min(enemySpeed, 3.5);
}

Cuando cualquier enemigo toca un borde, toda la formación invierte dirección y desciende 18 píxeles. La velocidad aumenta un 6%, pero queda limitada a 3.5.

3. Nueva oleada

Nivel siguiente
if (!anyAlive) { level++; enemySpeed = 0.5 + level * 0.15; spawnEnemies(); }

anyAlive se vuelve verdadero si al menos un enemigo sigue vivo. Si termina el recorrido y sigue falso, no queda oleada: sube level, cambia la velocidad base y se crean enemigos nuevos.