diff --git a/asteroid.js b/asteroid.js index 33d06de..6d36cf6 100644 --- a/asteroid.js +++ b/asteroid.js @@ -19,6 +19,7 @@ class Asteroid { } this.isGolden = isGolden; this.hitsLeft = isGolden ? 3 : 1; + console.log(`Spawned asteroid, isGolden: ${isGolden}, hitsLeft: ${this.hitsLeft}`); } update() { diff --git a/hamburger.js b/hamburger.js new file mode 100644 index 0000000..f2fa95c --- /dev/null +++ b/hamburger.js @@ -0,0 +1,46 @@ +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)); + } + + update() { + this.pos.add(this.vel); + } + + 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; + } + + hits(bullet) { + let d = dist(this.pos.x, this.pos.y, bullet.pos.x, bullet.pos.y); + return d < this.r; + } + + show() { + push(); + translate(this.pos.x, this.pos.y); + // Rotate to align with velocity + let angle = atan2(this.vel.y, this.vel.x); + rotate(angle); + // Draw hamburger image (10 points) + if (hamburgerImg) { + imageMode(CENTER); + let scaleFactor = (this.r * 2) / hamburgerImg.width; // Scale to match radius + scale(scaleFactor); + image(hamburgerImg, 0, 0); + } else { + // Fallback if image fails to load + fill(200, 150, 100); // Brighter brown for hamburger + stroke(255); + ellipse(0, 0, this.r * 2); + console.log('Hamburger image not loaded, using fallback'); + } + pop(); + } +} \ No newline at end of file diff --git a/hamburger.png b/hamburger.png new file mode 100644 index 0000000..58b1396 Binary files /dev/null and b/hamburger.png differ diff --git a/index.html b/index.html index e367bcf..1e985cb 100644 --- a/index.html +++ b/index.html @@ -8,6 +8,8 @@ + + diff --git a/pizza.js b/pizza.js new file mode 100644 index 0000000..eeff1cb --- /dev/null +++ b/pizza.js @@ -0,0 +1,68 @@ +class Pizza { + constructor(pos, r) { + if (pos) { + this.pos = pos.copy(); + this.r = r ? r / 2 : random(40, 60); + } else { + this.pos = createVector(random(width), random(height)); + this.r = random(40, 60); + while (dist(this.pos.x, this.pos.y, ship.pos.x, ship.pos.y) < 100) { + this.pos = createVector(random(width), random(height)); + } + } + this.vel = p5.Vector.random2D(); + this.vel.mult(random(1, 3)); + this.total = floor(random(8, 12)); // For potential future use + this.offset = []; + for (let i = 0; i < this.total; i++) { + this.offset[i] = random(-this.r * 0.3, this.r * 0.3); + } + } + + update() { + this.pos.add(this.vel); + } + + 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; + } + + hits(bullet) { + let d = dist(this.pos.x, this.pos.y, bullet.pos.x, bullet.pos.y); + return d < this.r; + } + + breakup() { + let newHamburgers = []; + if (this.r > 20) { + newHamburgers.push(new Hamburger(this.pos, this.r)); + newHamburgers.push(new Hamburger(this.pos, this.r)); + } + return newHamburgers; + } + + show() { + push(); + translate(this.pos.x, this.pos.y); + // Rotate to align with velocity + let angle = atan2(this.vel.y, this.vel.x); + rotate(angle); + // Draw pizza image (20 points) + if (pizzaImg) { + imageMode(CENTER); + let scaleFactor = (this.r * 2) / pizzaImg.width; // Scale to match radius + scale(scaleFactor); + image(pizzaImg, 0, 0); + } else { + // Fallback if image fails to load + fill(255, 100, 100); // Brighter red for pizza + stroke(255); + ellipse(0, 0, this.r * 2); + console.log('Pizza image not loaded, using fallback'); + } + pop(); + } +} \ No newline at end of file diff --git a/pizza.png b/pizza.png new file mode 100644 index 0000000..228a22f Binary files /dev/null and b/pizza.png differ diff --git a/sketch.js b/sketch.js index 8128389..2e85b8d 100644 --- a/sketch.js +++ b/sketch.js @@ -1,5 +1,7 @@ let ship; let asteroids = []; +let pizzas = []; +let hamburgers = []; let bullets = []; let shieldOrb = null; let greenOrb = null; @@ -8,12 +10,29 @@ let score = 0; let gameOver = false; let lastShieldSpawn = 0; let lastGreenSpawn = 0; +let pizzaImg, hamburgerImg; +let level = 1; +let initialObjects = 5; + +function preload() { + pizzaImg = loadImage('pizza.png', () => console.log('Pizza image loaded'), () => console.error('Failed to load pizza.png')); + hamburgerImg = loadImage('hamburger.png', () => console.log('Hamburger image loaded'), () => console.error('Failed to load hamburger.png')); +} function setup() { createCanvas(800, 600); ship = new Ship(); - for (let i = 0; i < 5; i++) { - asteroids.push(new Asteroid()); + spawnObjects(initialObjects); +} + +function spawnObjects(numObjects) { + for (let i = 0; i < numObjects; i++) { + if (random() < 0.15) { + pizzas.push(new Pizza()); + console.log(`Spawned pizza at level ${level}, total pizzas: ${pizzas.length}`); + } else { + asteroids.push(new Asteroid()); + } } } @@ -29,11 +48,12 @@ function draw() { return; } - // Display lives and score + // Display lives, score, and level textSize(20); fill(255); text("Lives: " + lives, 50, 30); text("Score: " + score, 50, 60); + text("Level: " + level, 50, 90); // Handle continuous key input (WASD) if (keyIsDown(65)) { // A key @@ -121,11 +141,82 @@ function draw() { asteroids.splice(i, 1); bullets.splice(j, 1); asteroids.push(...newAsteroids); - score += isGolden ? 20 : 10; // Use stored isGolden value + score += isGolden ? 50 : 10; // 50 points for golden, 10 for regular break; // Exit bullet loop after collision } } } + + // Update and show pizzas + for (let i = pizzas.length - 1; i >= 0; i--) { + if (!pizzas[i]) continue; // Skip if pizza is undefined + pizzas[i].update(); + pizzas[i].show(); + pizzas[i].edges(); + + // Check collision with ship + if (ship.hits(pizzas[i]) && !ship.shieldActive) { + lives--; + if (lives <= 0) { + gameOver = true; + } else { + ship = new Ship(); // Reset ship position + } + } + + // Check collision with bullets + for (let j = bullets.length - 1; j >= 0; j--) { + if (pizzas[i] && pizzas[i].hits(bullets[j])) { + let newHamburgers = pizzas[i].breakup(); + pizzas.splice(i, 1); + bullets.splice(j, 1); + hamburgers.push(...newHamburgers); + score += 20; // 20 points for pizza + console.log(`Pizza destroyed, spawned ${newHamburgers.length} hamburgers, total hamburgers: ${hamburgers.length}`); + break; // Exit bullet loop after collision + } + } + } + + // Update and show hamburgers + for (let i = hamburgers.length - 1; i >= 0; i--) { + if (!hamburgers[i]) continue; // Skip if hamburger is undefined + hamburgers[i].update(); + hamburgers[i].show(); + hamburgers[i].edges(); + + // Check collision with ship + if (ship.hits(hamburgers[i]) && !ship.shieldActive) { + lives--; + if (lives <= 0) { + gameOver = true; + } else { + ship = new Ship(); // Reset ship position + } + } + + // Check collision with bullets + for (let j = bullets.length - 1; j >= 0; j--) { + if (hamburgers[i] && hamburgers[i].hits(bullets[j])) { + hamburgers.splice(i, 1); + bullets.splice(j, 1); + score += 10; // 10 points for hamburger + console.log(`Hamburger destroyed, total hamburgers: ${hamburgers.length}`); + break; // Exit bullet loop after collision + } + } + } + + // Check for level completion + if (asteroids.length === 0 && pizzas.length === 0 && hamburgers.length === 0 && !gameOver) { + console.log(`Level ${level} completed! Asteroids: ${asteroids.length}, Pizzas: ${pizzas.length}, Hamburgers: ${hamburgers.length}`); + level++; + initialObjects = Math.ceil(initialObjects * 1.1); // Increase by 10% + bullets = []; // Clear bullets + ship = new Ship(); // Reset ship position + spawnObjects(initialObjects); + console.log(`Starting Level ${level} with ${initialObjects} objects`); + } } function keyPressed() { @@ -143,16 +234,18 @@ function keyPressed() { if (keyCode === 82 && gameOver) { // R to restart lives = 3; score = 0; + level = 1; + initialObjects = 5; asteroids = []; + pizzas = []; + hamburgers = []; bullets = []; shieldOrb = null; greenOrb = null; ship = new Ship(); lastShieldSpawn = millis(); lastGreenSpawn = millis(); - for (let i = 0; i < 5; i++) { - asteroids.push(new Asteroid()); - } + spawnObjects(initialObjects); gameOver = false; } }