asteroids/models/alien.js
2025-12-30 17:18:16 -05:00

89 lines
2.4 KiB
JavaScript

class Alien extends Particle {
constructor() {
super();
if (random(0, 1) > 0.5) {
this.pos = createVector(0, random(50, 500));
this.vel = createVector(2, 0);
} else {
this.pos = createVector(width - 1, random(50, 500));
this.vel = createVector(-2, 0);
}
this.w = 50;
this.h = 40;
this.rw = 70;
this.rh = 15;
this.p = 100; //points
}
main(idx) {
this.display();
// destroy ship if collides with alien
if (int(dist(ship.pos.x, ship.pos.y, alien[idx].pos.x, alien[idx].pos.y)) <= 35){
if (ship.shield !== true){
explode(ship.pos.x, ship.pos.y, 50);
ship.die();
}
}
// alien shoots on time interval
if (frameCount % (175 - level * 5) === 0) {
this.fire();
}
// pop alien if it goes off screen
if (this.pos.x >= width){
alien.shift(alien[idx]);
frameCount = 0;
}
};
display() {
this.show();
this.update();
};
fire() {
//aim at the ship
var dir = p5.Vector.sub(ship.pos, this.pos);
dir.normalize();
//create pew
alienPew.push(new Flame(this.pos.x, this.pos.y, dir));
}
getShot(entity, idx) {
if (int(dist(entity.pos.x, entity.pos.y, this.pos.x, this.pos.y)) <= 50) {
handlePoints(this.p);
explode(this.pos.x, this.pos.y, 100);
generatePowerup(idx);
pew.shift(entity);
alien.shift(alien[idx]);
}
};
show() {
push();
noStroke();
fill(128, 128, 128);
rectMode(CENTER);
rect(this.pos.x, this.pos.y+8, this.rw, this.rh, 20);
noFill();
stroke(77.6, 88.6, 89);
strokeWeight(3);
fill(77.6, 88.6, 89);
arc(this.pos.x, this.pos.y, this.w, this.h, PI, TWO_PI);
strokeWeight(0);
fill(random(255), random(255), random(255));
ellipse(this.pos.x, this.pos.y+8, 7, 7);
fill(random(255), random(255), random(255));
ellipse(this.pos.x+20, this.pos.y+8, 7, 7);
fill(random(255), random(255), random(255));
ellipse(this.pos.x-20, this.pos.y+8, 7, 7);
pop();
}
}