Capítulo 05
Disparos del jugador y disparos enemigos
Objetivo: diferenciar creación de disparos, movimiento vertical y temporizador enemigo.
1. Crear disparo del jugador
El disparo se crea en p.keyPressed, no en p.keyIsDown(). Así una pulsación de espacio crea un disparo, en vez de crear uno por cada frame mientras la tecla siga sostenida.
Disparo con espacio
if (active && p.key === ' ') {
if (bullets.length < 4) bullets.push({ x: player.x, y: player.y - shipH / 2 });
return false;
}El disparo nace en la misma x que la nave y justo sobre ella. El límite bullets.length < 4 controla la cadencia del jugador.
2. Mover proyectiles
Disparo jugador sube, disparo enemigo baja
Movimiento de disparos
for (let i = bullets.length - 1; i >= 0; i--) {
bullets[i].y -= bulletSpd;
if (bullets[i].y < -10) bullets.splice(i, 1);
}
for (let i = enemyBullets.length - 1; i >= 0; i--) {
enemyBullets[i].y += 4;
if (enemyBullets[i].y > H + 10) enemyBullets.splice(i, 1);
}Los disparos del jugador suben porque restan velocidad a y. Los disparos enemigos bajan porque suman a y. Ambos se recorren de atrás hacia adelante para poder usar splice() sin saltar elementos.
3. Selección del enemigo que dispara
Temporizador enemigo
if (p.millis() - lastEnemyShot > p.max(600, 1800 - level * 100)) {
let alive = enemies.filter(e => e.alive);
if (alive.length > 0) {
let s = p.random(alive);
enemyBullets.push({ x: s.x, y: s.y + s.h / 2 });
lastEnemyShot = p.millis();
}
}p.millis() mide tiempo desde el inicio. El intervalo baja con el nivel, pero p.max() impide que sea menor a 600 ms. Solo enemigos vivos pueden disparar.