Really cool game

This commit is contained in:
Eric Ratliff
2025-06-25 22:14:38 -05:00
commit 694cc903c8
7 changed files with 425 additions and 0 deletions

91
ship.js Normal file
View File

@@ -0,0 +1,91 @@
class Ship {
constructor() {
this.pos = createVector(width / 2, height / 2);
this.r = 20;
this.heading = 0;
this.rotation = 0;
this.vel = createVector(0, 0);
this.isBoosting = false;
this.shieldActive = false;
this.shieldEndTime = 0;
this.quadShotActive = false;
this.quadShotEndTime = 0;
}
update() {
if (this.isBoosting) {
this.boost();
}
this.pos.add(this.vel);
this.vel.mult(0.99); // Friction
this.heading += this.rotation;
if (this.shieldActive && millis() > this.shieldEndTime) {
this.shieldActive = false;
}
if (this.quadShotActive && millis() > this.quadShotEndTime) {
this.quadShotActive = false;
}
}
boost() {
let force = p5.Vector.fromAngle(this.heading);
force.mult(0.1);
this.vel.add(force);
}
hits(obj) {
let d = dist(this.pos.x, this.pos.y, obj.pos.x, obj.pos.y);
return d < this.r + obj.r;
}
edges() {
if (this.pos.x > width + this.r) this.pos.x = -this.r;
else if (this.pos.x < -this.r) this.pos.x = width + this.r;
if (this.pos.y > height + this.r) this.pos.y = -this.r;
else if (this.pos.y < -this.r) this.pos.y = height + this.r;
}
setRotation(a) {
this.rotation = a;
}
boosting(b) {
this.isBoosting = b;
}
activateShield() {
this.shieldActive = true;
this.shieldEndTime = millis() + 10000; // 10 seconds
}
activateQuadShot() {
this.quadShotActive = true;
this.quadShotEndTime = millis() + 10000; // 10 seconds
}
show() {
push();
translate(this.pos.x, this.pos.y);
rotate(this.heading + PI / 2);
if (this.shieldActive) {
// Pulsing shield effect in last 2 seconds
let timeLeft = (this.shieldEndTime - millis()) / 1000;
let scaleFactor = this.shieldActive && timeLeft < 2 ? 1 + 0.1 * sin(millis() / 100) : 1;
scale(scaleFactor);
noFill();
stroke(0, 255, 255); // Cyan shield
ellipse(0, 0, this.r * 2.5);
}
// Ship fill: green if quad-shot active, else black
if (this.quadShotActive) {
let timeLeft = (this.quadShotEndTime - millis()) / 1000;
let alpha = this.quadShotActive && timeLeft < 2 ? map(sin(millis() / 100), -1, 1, 100, 255) : 255;
fill(0, 255, 0, alpha);
} else {
fill(0);
}
stroke(255);
triangle(-this.r, this.r, this.r, this.r, 0, -this.r);
pop();
}
}