diff --git a/asteroid.js b/asteroid.js index 6d36cf6..618a988 100644 --- a/asteroid.js +++ b/asteroid.js @@ -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); } diff --git a/hamburger.js b/hamburger.js index f2fa95c..52a5a7f 100644 --- a/hamburger.js +++ b/hamburger.js @@ -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); } diff --git a/pizza.js b/pizza.js index eeff1cb..e5dc58b 100644 --- a/pizza.js +++ b/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); } diff --git a/ship.js b/ship.js index 45b115d..14c98ea 100644 --- a/ship.js +++ b/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; + } } \ No newline at end of file diff --git a/sketch.js b/sketch.js index feb710a..85e4734 100644 --- a/sketch.js +++ b/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() {