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.