Now with kids mode
This commit is contained in:
@@ -10,8 +10,9 @@ class Asteroid {
|
||||
this.pos = createVector(random(width), random(height));
|
||||
}
|
||||
}
|
||||
this.vel = p5.Vector.random2D();
|
||||
this.vel.mult(random(1, 3));
|
||||
this.baseVel = p5.Vector.random2D();
|
||||
this.speed = window.kidMode ? random(0.2, 1.5) : random(1, 3);
|
||||
this.vel = this.baseVel.copy().mult(this.speed);
|
||||
this.total = floor(random(5, 15));
|
||||
this.offset = [];
|
||||
for (let i = 0; i < this.total; i++) {
|
||||
@@ -19,10 +20,12 @@ class Asteroid {
|
||||
}
|
||||
this.isGolden = isGolden;
|
||||
this.hitsLeft = isGolden ? 3 : 1;
|
||||
console.log(`Spawned asteroid, isGolden: ${isGolden}, hitsLeft: ${this.hitsLeft}`);
|
||||
console.log(`Spawned asteroid, isGolden: ${isGolden}, hitsLeft: ${this.hitsLeft}, speed: ${this.speed}`);
|
||||
}
|
||||
|
||||
update() {
|
||||
this.speed = window.kidMode ? random(0.2, 1.5) : random(1, 3);
|
||||
this.vel = this.baseVel.copy().mult(this.speed);
|
||||
this.pos.add(this.vel);
|
||||
}
|
||||
|
||||
|
@@ -2,11 +2,14 @@ class Hamburger {
|
||||
constructor(pos, r) {
|
||||
this.pos = pos.copy();
|
||||
this.r = r ? r / 2 : random(20, 30);
|
||||
this.vel = p5.Vector.random2D();
|
||||
this.vel.mult(random(1, 3));
|
||||
this.baseVel = p5.Vector.random2D();
|
||||
this.speed = window.kidMode ? random(0.5, 1.5) : random(1, 3);
|
||||
this.vel = this.baseVel.copy().mult(this.speed);
|
||||
}
|
||||
|
||||
update() {
|
||||
this.speed = window.kidMode ? random(0.5, 1.5) : random(1, 3);
|
||||
this.vel = this.baseVel.copy().mult(this.speed);
|
||||
this.pos.add(this.vel);
|
||||
}
|
||||
|
||||
|
7
pizza.js
7
pizza.js
@@ -10,8 +10,9 @@ class Pizza {
|
||||
this.pos = createVector(random(width), random(height));
|
||||
}
|
||||
}
|
||||
this.vel = p5.Vector.random2D();
|
||||
this.vel.mult(random(1, 3));
|
||||
this.baseVel = p5.Vector.random2D();
|
||||
this.speed = window.kidMode ? random(0.5, 1.5) : random(1, 3);
|
||||
this.vel = this.baseVel.copy().mult(this.speed);
|
||||
this.total = floor(random(8, 12)); // For potential future use
|
||||
this.offset = [];
|
||||
for (let i = 0; i < this.total; i++) {
|
||||
@@ -20,6 +21,8 @@ class Pizza {
|
||||
}
|
||||
|
||||
update() {
|
||||
this.speed = window.kidMode ? random(0.5, 1.5) : random(1, 3);
|
||||
this.vel = this.baseVel.copy().mult(this.speed);
|
||||
this.pos.add(this.vel);
|
||||
}
|
||||
|
||||
|
117
ship.js
117
ship.js
@@ -1,15 +1,48 @@
|
||||
class Ship {
|
||||
constructor() {
|
||||
this.pos = createVector(width / 2, height / 2);
|
||||
constructor(safeSpawn = false) {
|
||||
if (safeSpawn) {
|
||||
this.pos = createVector(random(width), random(height));
|
||||
let safe = false;
|
||||
while (!safe) {
|
||||
safe = true;
|
||||
for (let asteroid of asteroids) {
|
||||
if (dist(this.pos.x, this.pos.y, asteroid.pos.x, asteroid.pos.y) < 100) {
|
||||
safe = false;
|
||||
this.pos = createVector(random(width), random(height));
|
||||
break;
|
||||
}
|
||||
}
|
||||
for (let pizza of pizzas) {
|
||||
if (dist(this.pos.x, this.pos.y, pizza.pos.x, pizza.pos.y) < 100) {
|
||||
safe = false;
|
||||
this.pos = createVector(random(width), random(height));
|
||||
break;
|
||||
}
|
||||
}
|
||||
for (let hamburger of hamburgers) {
|
||||
if (dist(this.pos.x, this.pos.y, hamburger.pos.x, hamburger.pos.y) < 100) {
|
||||
safe = false;
|
||||
this.pos = createVector(random(width), random(height));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
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.shieldStart = 0;
|
||||
this.quadShotActive = false;
|
||||
this.quadShotEndTime = 0;
|
||||
this.quadShotStart = 0;
|
||||
}
|
||||
|
||||
boosting(b) {
|
||||
this.isBoosting = b;
|
||||
}
|
||||
|
||||
update() {
|
||||
@@ -17,12 +50,16 @@ class Ship {
|
||||
this.boost();
|
||||
}
|
||||
this.pos.add(this.vel);
|
||||
this.vel.mult(0.99); // Friction
|
||||
this.vel.mult(0.99);
|
||||
this.heading += this.rotation;
|
||||
if (this.shieldActive && millis() > this.shieldEndTime) {
|
||||
|
||||
// Check shield duration
|
||||
if (this.shieldActive && millis() - this.shieldStart > 10000) {
|
||||
this.shieldActive = false;
|
||||
}
|
||||
if (this.quadShotActive && millis() > this.quadShotEndTime) {
|
||||
|
||||
// Check quad shot duration
|
||||
if (this.quadShotActive && millis() - this.quadShotStart > 10000) {
|
||||
this.quadShotActive = false;
|
||||
}
|
||||
}
|
||||
@@ -38,54 +75,52 @@ class Ship {
|
||||
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;
|
||||
activateShield() {
|
||||
this.shieldActive = true;
|
||||
this.shieldStart = millis();
|
||||
}
|
||||
|
||||
activateQuadShot() {
|
||||
this.quadShotActive = true;
|
||||
this.quadShotStart = millis();
|
||||
}
|
||||
|
||||
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);
|
||||
noFill();
|
||||
stroke(255);
|
||||
if (this.quadShotActive) {
|
||||
fill(0, 255, 0); // Green fill for quad-shot
|
||||
let quadTimeLeft = 10000 - (millis() - this.quadShotStart);
|
||||
if (quadTimeLeft < 2000) {
|
||||
let alpha = 255 * (1 + sin(millis() * 0.01)) / 2;
|
||||
fill(0, 255, 0, alpha);
|
||||
}
|
||||
}
|
||||
triangle(-this.r, this.r, this.r, this.r, 0, -this.r);
|
||||
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
|
||||
stroke(0, 255, 255);
|
||||
let shieldTimeLeft = 10000 - (millis() - this.shieldStart);
|
||||
if (shieldTimeLeft < 2000) {
|
||||
let scaleFactor = 1 + 0.2 * sin(millis() * 0.01);
|
||||
scale(scaleFactor);
|
||||
}
|
||||
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();
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
26
sketch.js
26
sketch.js
@@ -5,7 +5,7 @@ let hamburgers = [];
|
||||
let bullets = [];
|
||||
let shieldOrb = null;
|
||||
let greenOrb = null;
|
||||
let lives = 100;
|
||||
let lives = 30;
|
||||
let score = 0;
|
||||
let gameOver = false;
|
||||
let lastShieldSpawn = 0;
|
||||
@@ -13,6 +13,7 @@ let lastGreenSpawn = 0;
|
||||
let pizzaImg, hamburgerImg;
|
||||
let level = 1;
|
||||
let initialObjects = 5;
|
||||
let kidMode = true;
|
||||
|
||||
function preload() {
|
||||
pizzaImg = loadImage('pizza.png', () => console.log('Pizza image loaded'), () => console.error('Failed to load pizza.png'));
|
||||
@@ -21,6 +22,7 @@ function preload() {
|
||||
|
||||
function setup() {
|
||||
createCanvas(800, 600);
|
||||
window.kidMode = kidMode; // Set global kidMode before spawning
|
||||
ship = new Ship();
|
||||
spawnObjects(initialObjects);
|
||||
}
|
||||
@@ -28,7 +30,7 @@ function setup() {
|
||||
function spawnObjects(numObjects) {
|
||||
for (let i = 0; i < numObjects; i++) {
|
||||
let rand = random();
|
||||
if (rand < 0.25) {
|
||||
if (rand < 0.15) {
|
||||
pizzas.push(new Pizza());
|
||||
console.log(`Spawned pizza at level ${level}, total pizzas: ${pizzas.length}`);
|
||||
} else if (rand < 0.25) {
|
||||
@@ -53,12 +55,13 @@ function draw() {
|
||||
return;
|
||||
}
|
||||
|
||||
// Display lives, score, and level
|
||||
// Display lives, score, level, and kid mode
|
||||
textSize(20);
|
||||
fill(255);
|
||||
text("Lives: " + lives, 50, 30);
|
||||
text("Score: " + score, 50, 60);
|
||||
text("Level: " + level, 50, 90);
|
||||
text("Kid Mode: " + (kidMode ? "ON" : "OFF"), 70, 120);
|
||||
|
||||
// Handle continuous key input (WASD and Arrow Keys)
|
||||
if (keyIsDown(65) || keyIsDown(LEFT_ARROW)) { // A or Left Arrow
|
||||
@@ -134,7 +137,7 @@ function draw() {
|
||||
if (lives <= 0) {
|
||||
gameOver = true;
|
||||
} else {
|
||||
ship = new Ship(); // Reset ship position
|
||||
ship = new Ship(true); // Reset ship with safe spawn
|
||||
}
|
||||
}
|
||||
|
||||
@@ -165,7 +168,7 @@ function draw() {
|
||||
if (lives <= 0) {
|
||||
gameOver = true;
|
||||
} else {
|
||||
ship = new Ship(); // Reset ship position
|
||||
ship = new Ship(true); // Reset ship with safe spawn
|
||||
}
|
||||
}
|
||||
|
||||
@@ -196,7 +199,7 @@ function draw() {
|
||||
if (lives <= 0) {
|
||||
gameOver = true;
|
||||
} else {
|
||||
ship = new Ship(); // Reset ship position
|
||||
ship = new Ship(true); // Reset ship with safe spawn
|
||||
}
|
||||
}
|
||||
|
||||
@@ -218,7 +221,7 @@ function draw() {
|
||||
level++;
|
||||
initialObjects = Math.ceil(initialObjects * 1.1); // Increase by 10%
|
||||
bullets = []; // Clear bullets
|
||||
ship = new Ship(); // Reset ship position
|
||||
ship = new Ship(true); // Reset ship with safe spawn
|
||||
spawnObjects(initialObjects);
|
||||
console.log(`Starting Level ${level} with ${initialObjects} objects`);
|
||||
}
|
||||
@@ -237,7 +240,7 @@ function keyPressed() {
|
||||
}
|
||||
}
|
||||
if (keyCode === 82 && gameOver) { // R to restart
|
||||
lives = 100;
|
||||
lives = 30;
|
||||
score = 0;
|
||||
level = 1;
|
||||
initialObjects = 5;
|
||||
@@ -247,12 +250,17 @@ function keyPressed() {
|
||||
bullets = [];
|
||||
shieldOrb = null;
|
||||
greenOrb = null;
|
||||
ship = new Ship();
|
||||
ship = new Ship(true); // Safe spawn on restart
|
||||
lastShieldSpawn = millis();
|
||||
lastGreenSpawn = millis();
|
||||
spawnObjects(initialObjects);
|
||||
gameOver = false;
|
||||
}
|
||||
if (keyCode === 75) { // K to toggle Kid Mode
|
||||
kidMode = !kidMode;
|
||||
window.kidMode = kidMode; // Update global kidMode
|
||||
console.log(`Kid Mode: ${kidMode ? 'ON' : 'OFF'}`);
|
||||
}
|
||||
}
|
||||
|
||||
function keyReleased() {
|
||||
|
Reference in New Issue
Block a user