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.