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.