User prompt
que los enemigos sean un objeto a parte
User prompt
que haya enemigos
User prompt
que el fondo del juego sean cascadas de cafe
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'x')' in or related to this line: 'bullet.x = coffeeCup.x + 100;' Line Number: 373
User prompt
que tenga un menu prinsipal
User prompt
que dispare
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'toGlobal')' in or related to this line: 'var buttonPos = LK.gui.bottomRight.toLocal(obj.parent.toGlobal(obj.position));' Line Number: 299
User prompt
que la tasa pueda disparar con un botón en pantalla
User prompt
Please fix the bug: 'TypeError: Cannot set properties of undefined (setting 'fill')' in or related to this line: 'energyTxt.style.fill = 0x00FF00; // Green' Line Number: 522
User prompt
que haya una linea de energia del get pak que si no se agarran puntos se acaba la energia y pierde ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
que luego de sierta cantidad de puntage aparesca un gefe final ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
que el personage tenga 3 vidas
User prompt
que luego de 1000 haya un boss final que la tasa tenga que destruir con obgetos que ballan callendo ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
que al bolar la tasa de café tenga una distinta animacion ↪💡 Consider importing and using the following plugins: @upit/tween.v1
Code edit (1 edits merged)
Please save this source code
User prompt
Coffee Cup's Golden Bean Quest
Initial prompt
crea un juego con la tematica de una tasa de cafe que emprende una aventura para conseguir el grano dorado
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ var Boss = Container.expand(function () { var self = Container.call(this); var bossGraphics = self.attachAsset('obstacle', { anchorX: 0.5, anchorY: 0.5, scaleX: 3, scaleY: 1.5, tint: 0x8B0000 }); self.health = 5; self.x = 1800; self.y = 500; self.moveDirection = 1; self.speed = 3; self.lastSpawnTime = 0; self.update = function () { self.y += self.moveDirection * self.speed; if (self.y <= 300) { self.y = 300; self.moveDirection = 1; } if (self.y >= 2400) { self.y = 2400; self.moveDirection = -1; } // Spawn falling objects every 60 frames if (LK.ticks - self.lastSpawnTime > 60) { spawnFallingObject(); self.lastSpawnTime = LK.ticks; } }; return self; }); var Bullet = Container.expand(function () { var self = Container.call(this); var bulletGraphics = self.attachAsset('regularBean', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.8, scaleY: 0.8, tint: 0x8B4513 }); self.speed = 12; self.update = function () { self.x += self.speed; bulletGraphics.rotation += 0.3; }; return self; }); var CoffeeCup = Container.expand(function () { var self = Container.call(this); var cupGraphics = self.attachAsset('coffeeCup', { anchorX: 0.5, anchorY: 0.5 }); self.velocityY = 0; self.gravity = 0.8; self.jumpForce = -12; self.isRising = false; self.isInvincible = false; self.invincibleTimer = 0; self.wasRisingLastFrame = false; self.update = function () { var wasRising = self.isRising; if (self.isRising) { self.velocityY += self.jumpForce * 0.3; // Add flying animation when starting to rise if (!self.wasRisingLastFrame) { tween(cupGraphics, { rotation: -0.3, scaleX: 1.2, scaleY: 1.2 }, { duration: 200, easing: tween.easeOut }); } } else { self.velocityY += self.gravity; // Return to normal when not rising if (self.wasRisingLastFrame) { tween(cupGraphics, { rotation: 0, scaleX: 1.0, scaleY: 1.0 }, { duration: 300, easing: tween.easeOut }); } } self.wasRisingLastFrame = wasRising; self.velocityY = Math.max(-15, Math.min(15, self.velocityY)); self.y += self.velocityY; if (self.y < 100) { self.y = 100; self.velocityY = 0; } if (self.y > 2632) { self.y = 2632; self.velocityY = 0; } if (self.isInvincible) { self.invincibleTimer--; cupGraphics.alpha = self.invincibleTimer % 10 < 5 ? 0.5 : 1.0; if (self.invincibleTimer <= 0) { self.isInvincible = false; cupGraphics.alpha = 1.0; } } }; self.makeInvincible = function () { self.isInvincible = true; self.invincibleTimer = 300; }; return self; }); var CoffeeDrop = Container.expand(function () { var self = Container.call(this); var dropGraphics = self.attachAsset('regularBean', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.3, scaleY: 0.6, tint: 0x8B4513 }); self.speed = Math.random() * 3 + 2; self.alpha = Math.random() * 0.5 + 0.3; dropGraphics.alpha = self.alpha; self.update = function () { self.y += self.speed; dropGraphics.rotation += 0.05; }; return self; }); var Enemy = Container.expand(function () { var self = Container.call(this); var enemyGraphics = self.attachAsset('obstacle', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.8, scaleY: 0.8, tint: 0x8B0000 }); self.speed = -6; self.health = 2; self.moveDirection = 1; self.verticalSpeed = 2; self.update = function () { self.x += self.speed; self.y += self.moveDirection * self.verticalSpeed; if (self.y <= 200) { self.y = 200; self.moveDirection = 1; } if (self.y >= 2500) { self.y = 2500; self.moveDirection = -1; } enemyGraphics.rotation += 0.05; }; return self; }); var FallingObject = Container.expand(function () { var self = Container.call(this); var objectGraphics = self.attachAsset('regularBean', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.5, scaleY: 1.5, tint: 0xFF4500 }); self.velocityX = -6; self.velocityY = 2; self.gravity = 0.5; self.update = function () { self.x += self.velocityX; self.y += self.velocityY; self.velocityY += self.gravity; objectGraphics.rotation += 0.2; }; return self; }); var GoldenBean = Container.expand(function () { var self = Container.call(this); var beanGraphics = self.attachAsset('goldenBean', { anchorX: 0.5, anchorY: 0.5 }); self.speed = -8; self.collected = false; self.pulseTimer = 0; self.update = function () { self.x += self.speed; beanGraphics.rotation += 0.15; self.pulseTimer += 0.2; var scale = 1 + Math.sin(self.pulseTimer) * 0.2; beanGraphics.scaleX = scale; beanGraphics.scaleY = scale; }; return self; }); var Obstacle = Container.expand(function () { var self = Container.call(this); var obstacleGraphics = self.attachAsset('obstacle', { anchorX: 0.5, anchorY: 0.5 }); self.speed = -8; self.update = function () { self.x += self.speed; }; return self; }); var RegularBean = Container.expand(function () { var self = Container.call(this); var beanGraphics = self.attachAsset('regularBean', { anchorX: 0.5, anchorY: 0.5 }); self.speed = -8; self.collected = false; self.update = function () { self.x += self.speed; beanGraphics.rotation += 0.1; }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x87CEEB }); /**** * Game Code ****/ game.setBackgroundColor(0x87CEEB); // Game state var gameState = 'menu'; // 'menu' or 'playing' var menuContainer; var titleText; var playButton; var instructionsText; // Game variables var coffeeCup; var regularBeans = []; var goldenBeans = []; var obstacles = []; var gameSpeed = 1; var spawnTimer = 0; var goldenBeanTimer = 0; var highScore = storage.highScore || 0; var bossActive = false; var boss = null; var bossHealth = 5; var enemies = []; var enemySpawnTimer = 0; var fallingObjects = []; var bossSpawnTimer = 0; var lives = 3; var energy = 100; var maxEnergy = 100; var energyDecayRate = 0.2; var bullets = []; var shootButton; var coffeeDrops = []; var dropSpawnTimer = 0; // UI elements var scoreTxt = new Text2('Score: 0', { size: 80, fill: 0xFFFFFF }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); var highScoreTxt = new Text2('Best: ' + highScore, { size: 60, fill: 0xFFFF00 }); highScoreTxt.anchor.set(1, 0); highScoreTxt.x = -50; highScoreTxt.y = 100; LK.gui.topRight.addChild(highScoreTxt); var livesTxt = new Text2('Lives: ' + lives, { size: 60, fill: 0xFF69B4 }); livesTxt.anchor.set(0, 0); livesTxt.x = 50; livesTxt.y = 100; LK.gui.topLeft.addChild(livesTxt); var bossHealthTxt = new Text2('Boss Health: 5', { size: 60, fill: 0xFF0000 }); bossHealthTxt.anchor.set(0.5, 0); bossHealthTxt.x = 0; bossHealthTxt.y = 200; bossHealthTxt.visible = false; LK.gui.top.addChild(bossHealthTxt); var energyTxt = new Text2('Energy: 100', { size: 60, fill: 0x00FF00 }); energyTxt.anchor.set(0, 0); energyTxt.x = 50; energyTxt.y = 180; LK.gui.topLeft.addChild(energyTxt); // Create shoot button var shootButtonGraphic = LK.getAsset('regularBean', { anchorX: 0.5, anchorY: 0.5, scaleX: 2, scaleY: 2, tint: 0xFF4500 }); shootButton = LK.gui.bottomRight.addChild(shootButtonGraphic); shootButton.x = -150; shootButton.y = -150; var shootButtonText = new Text2('SHOOT', { size: 40, fill: 0xFFFFFF }); shootButtonText.anchor.set(0.5, 0.5); shootButton.addChild(shootButtonText); // Add shoot button event handler shootButton.down = function (x, y, obj) { shootBullet(); }; // Input handling game.down = function (x, y, obj) { if (gameState === 'menu') { // Handle menu interactions - check if play button was clicked if (playButton && Math.abs(x - playButton.x) < 100 && Math.abs(y - playButton.y) < 100) { startGame(); } return; } if (gameState === 'playing' && coffeeCup) { // Check if shoot button was pressed var globalPos = game.toGlobal({ x: 0, y: 0 }); var guiPos = LK.gui.toGlobal({ x: 0, y: 0 }); var buttonWorldX = guiPos.x + LK.gui.bottomRight.x + shootButton.x; var buttonWorldY = guiPos.y + LK.gui.bottomRight.y + shootButton.y; var gameWorldX = globalPos.x + x; var gameWorldY = globalPos.y + y; var buttonDistance = Math.sqrt((gameWorldX - buttonWorldX) * (gameWorldX - buttonWorldX) + (gameWorldY - buttonWorldY) * (gameWorldY - buttonWorldY)); if (buttonDistance < 80) { shootBullet(); } else { coffeeCup.isRising = true; } } }; game.up = function (x, y, obj) { if (gameState === 'playing' && coffeeCup) { coffeeCup.isRising = false; } }; // Spawn functions function spawnRegularBean() { var bean = new RegularBean(); bean.x = 2200; bean.y = Math.random() * 2400 + 200; regularBeans.push(bean); game.addChild(bean); } function spawnGoldenBean() { var bean = new GoldenBean(); bean.x = 2200; bean.y = Math.random() * 2400 + 200; goldenBeans.push(bean); game.addChild(bean); } function spawnObstacle() { var obstacle = new Obstacle(); obstacle.x = 2200; obstacle.y = Math.random() * 2000 + 400; obstacles.push(obstacle); game.addChild(obstacle); } function spawnBoss() { var boss = new Boss(); game.addChild(boss); return boss; } function spawnFallingObject() { var obj = new FallingObject(); obj.x = 1800 + Math.random() * 200 - 100; obj.y = 200; fallingObjects.push(obj); game.addChild(obj); } function spawnEnemy() { var enemy = new Enemy(); enemy.x = 2200; enemy.y = Math.random() * 2000 + 400; enemies.push(enemy); game.addChild(enemy); } function spawnCoffeeDrop() { var drop = new CoffeeDrop(); drop.x = Math.random() * 2048; drop.y = -50; coffeeDrops.push(drop); game.addChild(drop); } function shootBullet() { if (gameState !== 'playing' || !coffeeCup) { return; } var bullet = new Bullet(); bullet.x = coffeeCup.x + 100; bullet.y = coffeeCup.y; bullets.push(bullet); game.addChild(bullet); } // Main game loop game.update = function () { // Always update coffee waterfall background dropSpawnTimer++; if (dropSpawnTimer % 5 === 0) { spawnCoffeeDrop(); } for (var d = coffeeDrops.length - 1; d >= 0; d--) { var drop = coffeeDrops[d]; if (drop.y > 2800) { drop.destroy(); coffeeDrops.splice(d, 1); } } // Only run game logic when in playing state if (gameState !== 'playing') { return; } // Check for boss activation at score 1000 if (LK.getScore() >= 1000 && !bossActive) { bossActive = true; boss = spawnBoss(); bossHealth = boss.health; // Clear existing elements when boss appears for (var clear = obstacles.length - 1; clear >= 0; clear--) { obstacles[clear].destroy(); obstacles.splice(clear, 1); } for (var clearBeans = regularBeans.length - 1; clearBeans >= 0; clearBeans--) { regularBeans[clearBeans].destroy(); regularBeans.splice(clearBeans, 1); } for (var clearEnemies = enemies.length - 1; clearEnemies >= 0; clearEnemies--) { enemies[clearEnemies].destroy(); enemies.splice(clearEnemies, 1); } LK.effects.flashScreen(0x8B0000, 1000); } if (!bossActive) { // Update game speed gameSpeed = 1 + LK.getScore() / 100 * 0.5; // Update spawn timers spawnTimer++; goldenBeanTimer++; enemySpawnTimer++; // Spawn regular beans if (spawnTimer % Math.max(30, 60 - Math.floor(LK.getScore() / 10)) === 0) { spawnRegularBean(); } // Spawn obstacles if (spawnTimer % Math.max(80, 120 - Math.floor(LK.getScore() / 5)) === 0) { spawnObstacle(); } // Spawn enemies if (enemySpawnTimer % Math.max(100, 180 - Math.floor(LK.getScore() / 8)) === 0) { spawnEnemy(); } // Spawn golden bean (rare) if (goldenBeanTimer > 600 && Math.random() < 0.01) { spawnGoldenBean(); goldenBeanTimer = 0; } bossHealthTxt.visible = false; } else { // Show boss health during boss battle bossHealthTxt.visible = true; bossHealthTxt.setText('Boss Health: ' + bossHealth); } // Update and check regular beans for (var i = regularBeans.length - 1; i >= 0; i--) { var bean = regularBeans[i]; if (bean.x < -100) { bean.destroy(); regularBeans.splice(i, 1); continue; } if (!bean.collected && bean.intersects(coffeeCup)) { bean.collected = true; LK.setScore(LK.getScore() + 10); scoreTxt.setText('Score: ' + LK.getScore()); // Restore energy when collecting beans energy = Math.min(maxEnergy, energy + 20); energyTxt.setText('Energy: ' + Math.floor(energy)); // Update energy color based on level if (energy > 60) { energyTxt.fill = 0x00FF00; // Green } else if (energy > 30) { energyTxt.fill = 0xFFFF00; // Yellow } else { energyTxt.fill = 0xFF0000; // Red } LK.getSound('collectBean').play(); LK.effects.flashObject(bean, 0xFFFFFF, 200); tween(bean, { alpha: 0, scaleX: 2, scaleY: 2 }, { duration: 200, onFinish: function onFinish() { bean.destroy(); } }); regularBeans.splice(i, 1); } } // Update and check golden beans for (var j = goldenBeans.length - 1; j >= 0; j--) { var goldenBean = goldenBeans[j]; if (goldenBean.x < -100) { goldenBean.destroy(); goldenBeans.splice(j, 1); continue; } if (!goldenBean.collected && goldenBean.intersects(coffeeCup)) { goldenBean.collected = true; LK.setScore(LK.getScore() + 100); scoreTxt.setText('Score: ' + LK.getScore()); // Restore significant energy when collecting golden beans energy = maxEnergy; energyTxt.setText('Energy: ' + Math.floor(energy)); energyTxt.fill = 0x00FF00; // Green LK.getSound('collectGolden').play(); LK.effects.flashScreen(0xFFD700, 500); coffeeCup.makeInvincible(); tween(goldenBean, { alpha: 0, scaleX: 3, scaleY: 3 }, { duration: 500, onFinish: function onFinish() { goldenBean.destroy(); } }); goldenBeans.splice(j, 1); } } // Update and check obstacles for (var k = obstacles.length - 1; k >= 0; k--) { var obstacle = obstacles[k]; if (obstacle.x < -100) { obstacle.destroy(); obstacles.splice(k, 1); continue; } if (!coffeeCup.isInvincible && obstacle.intersects(coffeeCup)) { lives--; livesTxt.setText('Lives: ' + lives); coffeeCup.makeInvincible(); LK.effects.flashScreen(0xFF0000, 500); obstacle.destroy(); obstacles.splice(k, 1); if (lives <= 0) { // Update high score if (LK.getScore() > highScore) { highScore = LK.getScore(); storage.highScore = highScore; } LK.effects.flashScreen(0xFF0000, 1000); LK.showGameOver(); } break; } } // Update and check enemies for (var e = enemies.length - 1; e >= 0; e--) { var enemy = enemies[e]; if (enemy.x < -100) { enemy.destroy(); enemies.splice(e, 1); continue; } // Check collision with coffee cup if (!coffeeCup.isInvincible && enemy.intersects(coffeeCup)) { lives--; livesTxt.setText('Lives: ' + lives); coffeeCup.makeInvincible(); LK.effects.flashScreen(0xFF0000, 500); enemy.destroy(); enemies.splice(e, 1); if (lives <= 0) { // Update high score if (LK.getScore() > highScore) { highScore = LK.getScore(); storage.highScore = highScore; } LK.effects.flashScreen(0xFF0000, 1000); LK.showGameOver(); } break; } } // Update speed for all moving objects for (var l = 0; l < regularBeans.length; l++) { regularBeans[l].speed = -8 * gameSpeed; } for (var m = 0; m < goldenBeans.length; m++) { goldenBeans[m].speed = -8 * gameSpeed; } for (var n = 0; n < obstacles.length; n++) { obstacles[n].speed = -8 * gameSpeed; } for (var p = 0; p < enemies.length; p++) { enemies[p].speed = -6 * gameSpeed; } // Handle falling objects during boss battle if (bossActive) { for (var f = fallingObjects.length - 1; f >= 0; f--) { var fallingObj = fallingObjects[f]; if (fallingObj.y > 2800 || fallingObj.x < -100) { fallingObj.destroy(); fallingObjects.splice(f, 1); continue; } // Check collision with coffee cup if (fallingObj.intersects(coffeeCup) && !coffeeCup.isInvincible) { lives--; livesTxt.setText('Lives: ' + lives); coffeeCup.makeInvincible(); LK.effects.flashScreen(0xFF0000, 500); fallingObj.destroy(); fallingObjects.splice(f, 1); if (lives <= 0) { // Update high score if (LK.getScore() > highScore) { highScore = LK.getScore(); storage.highScore = highScore; } LK.effects.flashScreen(0xFF0000, 1000); LK.showGameOver(); } break; } // Check if falling object hits boss (coffee cup can throw objects at boss) if (fallingObj.intersects(boss) && fallingObj.velocityX < 0) { boss.health--; bossHealth = boss.health; LK.effects.flashObject(boss, 0xFF0000, 300); // Add screen shake effect when boss is hit tween(game, { x: Math.random() * 20 - 10, y: Math.random() * 20 - 10 }, { duration: 100, onFinish: function onFinish() { tween(game, { x: 0, y: 0 }, { duration: 100 }); } }); fallingObj.destroy(); fallingObjects.splice(f, 1); if (bossHealth <= 0) { // Boss defeated LK.setScore(LK.getScore() + 500); scoreTxt.setText('Score: ' + LK.getScore()); boss.destroy(); bossActive = false; boss = null; LK.effects.flashScreen(0x00FF00, 1000); LK.showYouWin(); } } } } // Update and check bullets for (var b = bullets.length - 1; b >= 0; b--) { var bullet = bullets[b]; if (bullet.x > 2200) { bullet.destroy(); bullets.splice(b, 1); continue; } // Check bullet collision with obstacles for (var o = obstacles.length - 1; o >= 0; o--) { if (bullet.intersects(obstacles[o])) { LK.effects.flashObject(obstacles[o], 0xFFFFFF, 200); obstacles[o].destroy(); obstacles.splice(o, 1); bullet.destroy(); bullets.splice(b, 1); LK.setScore(LK.getScore() + 50); scoreTxt.setText('Score: ' + LK.getScore()); break; } } // Check bullet collision with enemies for (var en = enemies.length - 1; en >= 0; en--) { if (bullet.intersects(enemies[en])) { enemies[en].health--; LK.effects.flashObject(enemies[en], 0xFFFFFF, 200); if (enemies[en].health <= 0) { enemies[en].destroy(); enemies.splice(en, 1); LK.setScore(LK.getScore() + 25); scoreTxt.setText('Score: ' + LK.getScore()); } bullet.destroy(); bullets.splice(b, 1); break; } } // Check bullet collision with boss if (bossActive && boss && bullet.intersects(boss)) { boss.health--; bossHealth = boss.health; LK.effects.flashObject(boss, 0xFF0000, 300); bullet.destroy(); bullets.splice(b, 1); if (bossHealth <= 0) { LK.setScore(LK.getScore() + 500); scoreTxt.setText('Score: ' + LK.getScore()); boss.destroy(); bossActive = false; boss = null; LK.effects.flashScreen(0x00FF00, 1000); LK.showYouWin(); } } } if (!bossActive) { energy -= energyDecayRate; energy = Math.max(0, energy); energyTxt.setText('Energy: ' + Math.floor(energy)); if (energy > 60) { energyTxt.fill = 0x00FF00; // Green } else if (energy > 30) { energyTxt.fill = 0xFFFF00; // Yellow } else { energyTxt.fill = 0xFF0000; // Red } // Game over when energy reaches zero if (energy <= 0) { // Update high score if (LK.getScore() > highScore) { highScore = LK.getScore(); storage.highScore = highScore; } LK.effects.flashScreen(0xFF0000, 1000); LK.showGameOver(); } } }; // Create main menu function createMainMenu() { menuContainer = game.addChild(new Container()); // Title text titleText = new Text2('COFFEE RUNNER', { size: 150, fill: 0xFFFFFF }); titleText.anchor.set(0.5, 0.5); titleText.x = 1024; titleText.y = 800; menuContainer.addChild(titleText); // Play button var playButtonGraphic = LK.getAsset('coffeeCup', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.5, scaleY: 1.5 }); playButton = menuContainer.addChild(playButtonGraphic); playButton.x = 1024; playButton.y = 1400; var playButtonText = new Text2('PLAY', { size: 80, fill: 0x000000 }); playButtonText.anchor.set(0.5, 0.5); playButton.addChild(playButtonText); // Instructions text instructionsText = new Text2('Tap to fly • Collect beans • Avoid obstacles', { size: 60, fill: 0xFFFFFF }); instructionsText.anchor.set(0.5, 0.5); instructionsText.x = 1024; instructionsText.y = 1800; menuContainer.addChild(instructionsText); // High score display var menuHighScoreText = new Text2('Best Score: ' + highScore, { size: 80, fill: 0xFFD700 }); menuHighScoreText.anchor.set(0.5, 0.5); menuHighScoreText.x = 1024; menuHighScoreText.y = 1200; menuContainer.addChild(menuHighScoreText); // Play button event handler playButton.down = function (x, y, obj) { startGame(); }; } function startGame() { if (gameState !== 'menu') return; gameState = 'playing'; // Hide menu if (menuContainer) { menuContainer.destroy(); menuContainer = null; } // Initialize coffee cup coffeeCup = game.addChild(new CoffeeCup()); coffeeCup.x = 400; coffeeCup.y = 1366; // Reset game variables LK.setScore(0); scoreTxt.setText('Score: 0'); lives = 3; livesTxt.setText('Lives: ' + lives); energy = 100; energyTxt.setText('Energy: 100'); energyTxt.fill = 0x00FF00; gameSpeed = 1; spawnTimer = 0; goldenBeanTimer = 0; bossActive = false; boss = null; bossHealth = 5; // Clear any existing game objects regularBeans = []; goldenBeans = []; obstacles = []; enemies = []; fallingObjects = []; bullets = []; // Keep coffee drops for background effect } // Initialize main menu createMainMenu();
===================================================================
--- original.js
+++ change.js
@@ -141,8 +141,36 @@
dropGraphics.rotation += 0.05;
};
return self;
});
+var Enemy = Container.expand(function () {
+ var self = Container.call(this);
+ var enemyGraphics = self.attachAsset('obstacle', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 0.8,
+ scaleY: 0.8,
+ tint: 0x8B0000
+ });
+ self.speed = -6;
+ self.health = 2;
+ self.moveDirection = 1;
+ self.verticalSpeed = 2;
+ self.update = function () {
+ self.x += self.speed;
+ self.y += self.moveDirection * self.verticalSpeed;
+ if (self.y <= 200) {
+ self.y = 200;
+ self.moveDirection = 1;
+ }
+ if (self.y >= 2500) {
+ self.y = 2500;
+ self.moveDirection = -1;
+ }
+ enemyGraphics.rotation += 0.05;
+ };
+ return self;
+});
var FallingObject = Container.expand(function () {
var self = Container.call(this);
var objectGraphics = self.attachAsset('regularBean', {
anchorX: 0.5,
@@ -236,8 +264,10 @@
var highScore = storage.highScore || 0;
var bossActive = false;
var boss = null;
var bossHealth = 5;
+var enemies = [];
+var enemySpawnTimer = 0;
var fallingObjects = [];
var bossSpawnTimer = 0;
var lives = 3;
var energy = 100;
@@ -377,8 +407,15 @@
obj.y = 200;
fallingObjects.push(obj);
game.addChild(obj);
}
+function spawnEnemy() {
+ var enemy = new Enemy();
+ enemy.x = 2200;
+ enemy.y = Math.random() * 2000 + 400;
+ enemies.push(enemy);
+ game.addChild(enemy);
+}
function spawnCoffeeDrop() {
var drop = new CoffeeDrop();
drop.x = Math.random() * 2048;
drop.y = -50;
@@ -426,24 +463,33 @@
for (var clearBeans = regularBeans.length - 1; clearBeans >= 0; clearBeans--) {
regularBeans[clearBeans].destroy();
regularBeans.splice(clearBeans, 1);
}
+ for (var clearEnemies = enemies.length - 1; clearEnemies >= 0; clearEnemies--) {
+ enemies[clearEnemies].destroy();
+ enemies.splice(clearEnemies, 1);
+ }
LK.effects.flashScreen(0x8B0000, 1000);
}
if (!bossActive) {
// Update game speed
gameSpeed = 1 + LK.getScore() / 100 * 0.5;
// Update spawn timers
spawnTimer++;
goldenBeanTimer++;
+ enemySpawnTimer++;
// Spawn regular beans
if (spawnTimer % Math.max(30, 60 - Math.floor(LK.getScore() / 10)) === 0) {
spawnRegularBean();
}
// Spawn obstacles
if (spawnTimer % Math.max(80, 120 - Math.floor(LK.getScore() / 5)) === 0) {
spawnObstacle();
}
+ // Spawn enemies
+ if (enemySpawnTimer % Math.max(100, 180 - Math.floor(LK.getScore() / 8)) === 0) {
+ spawnEnemy();
+ }
// Spawn golden bean (rare)
if (goldenBeanTimer > 600 && Math.random() < 0.01) {
spawnGoldenBean();
goldenBeanTimer = 0;
@@ -550,8 +596,36 @@
}
break;
}
}
+ // Update and check enemies
+ for (var e = enemies.length - 1; e >= 0; e--) {
+ var enemy = enemies[e];
+ if (enemy.x < -100) {
+ enemy.destroy();
+ enemies.splice(e, 1);
+ continue;
+ }
+ // Check collision with coffee cup
+ if (!coffeeCup.isInvincible && enemy.intersects(coffeeCup)) {
+ lives--;
+ livesTxt.setText('Lives: ' + lives);
+ coffeeCup.makeInvincible();
+ LK.effects.flashScreen(0xFF0000, 500);
+ enemy.destroy();
+ enemies.splice(e, 1);
+ if (lives <= 0) {
+ // Update high score
+ if (LK.getScore() > highScore) {
+ highScore = LK.getScore();
+ storage.highScore = highScore;
+ }
+ LK.effects.flashScreen(0xFF0000, 1000);
+ LK.showGameOver();
+ }
+ break;
+ }
+ }
// Update speed for all moving objects
for (var l = 0; l < regularBeans.length; l++) {
regularBeans[l].speed = -8 * gameSpeed;
}
@@ -560,8 +634,11 @@
}
for (var n = 0; n < obstacles.length; n++) {
obstacles[n].speed = -8 * gameSpeed;
}
+ for (var p = 0; p < enemies.length; p++) {
+ enemies[p].speed = -6 * gameSpeed;
+ }
// Handle falling objects during boss battle
if (bossActive) {
for (var f = fallingObjects.length - 1; f >= 0; f--) {
var fallingObj = fallingObjects[f];
@@ -644,8 +721,24 @@
scoreTxt.setText('Score: ' + LK.getScore());
break;
}
}
+ // Check bullet collision with enemies
+ for (var en = enemies.length - 1; en >= 0; en--) {
+ if (bullet.intersects(enemies[en])) {
+ enemies[en].health--;
+ LK.effects.flashObject(enemies[en], 0xFFFFFF, 200);
+ if (enemies[en].health <= 0) {
+ enemies[en].destroy();
+ enemies.splice(en, 1);
+ LK.setScore(LK.getScore() + 25);
+ scoreTxt.setText('Score: ' + LK.getScore());
+ }
+ bullet.destroy();
+ bullets.splice(b, 1);
+ break;
+ }
+ }
// Check bullet collision with boss
if (bossActive && boss && bullet.intersects(boss)) {
boss.health--;
bossHealth = boss.health;
@@ -766,8 +859,9 @@
// Clear any existing game objects
regularBeans = [];
goldenBeans = [];
obstacles = [];
+ enemies = [];
fallingObjects = [];
bullets = [];
// Keep coffee drops for background effect
}
una tasa de cafe caricaturesca de pixeles con un jet pak. In-Game asset. 2d. High contrast. No shadows
grano de cafe dorado de pixeles. In-Game asset. 2d. High contrast. No shadows
grano de caffe de pixeles. In-Game asset. 2d. High contrast. No shadows
pared de pinchos berticales de pixeles. In-Game asset. 2d. High contrast. No shadows