User prompt
me equivoque, quería decir que la velocidad de recarga aumente, es decir que tarde mas en disparar, de paso quiero que arregles cuando pasas el nivel y te manda al selector de mejora, el personaje sigue disparando
User prompt
bueno, ahora quiero que la velocidad de los disparos del personaje aumente, pero que la velocidad de recarga disminuya, de paso que el personaje dispare automaticamente
User prompt
ahora, con respecto a las estadisticas enemigas, quiero que el pez enemigo de nivel 1 tenga 2 de vida, y que sus disparos causen 1 de daño
User prompt
cuando ya completes un nivel y mates a todos los peces enemigos, quiero que los disparos que aun sigan en la pantalla desaparescan
User prompt
bien, quiero que para la vida, en cada nivel el personaje recupere el maximo de su salud, obviamente aumentando esta conforme elijas la mejora de salud
User prompt
cuando mates a todos los enemigos de la pantalla, que esta se pause para hacerte elegir la mejora, de paso, haz que los enemigos en lugar de simplemente avanzar, que se queden en la zona superior disparando
Code edit (1 edits merged)
Please save this source code
User prompt
Bubble Defense: Ocean Depths
Initial prompt
bien, quiero que el juego trate de un shooter de naves en vertical, en lugar de naves quiero que trate acerca de peces en el oceano, el protagonista es un pequeño pez que se defenderá disparando burbujas que hacen daño a los enemigos, habrá 10 niveles, en los cuales aparecerán cada vez mas enemigos y mas dificiles, en el decimo apareciendo el pez jefe final malvado, los peces enemigos se mantendrán arriba disparando así como el jugador, para hacerlo mas justo, al finalizar cada nivel, el jugador podrá elegir o una mejora para aumentar la salud, o una mejora para aumentar el daño de los disparos del jugador, digamos que inicias teniendo 3 de vida y 1 de daño, cuando elijes la mejora de vida obtienes +2 de vida, y cuando elijes la mejora de daño obtienes +1 de daño
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ var BossFish = Container.expand(function () { var self = Container.call(this); var fishGraphics = self.attachAsset('bossFish', { anchorX: 0.5, anchorY: 0.5 }); self.health = 15; self.speed = 1; self.shootCooldown = 30; self.moveDirection = 1; self.update = function () { self.x += self.speed * self.moveDirection; if (self.x <= 100 || self.x >= 2048 - 100) { self.moveDirection *= -1; } if (self.shootCooldown > 0) { self.shootCooldown--; } else { self.shootEnemy(); self.shootCooldown = 20; } }; self.shootEnemy = function () { for (var i = 0; i < 3; i++) { var bullet = new EnemyBullet(); bullet.x = self.x + (i - 1) * 50; bullet.y = self.y + 70; enemyBullets.push(bullet); game.addChild(bullet); } }; self.takeDamage = function (damage) { self.health -= damage; LK.effects.flashObject(self, 0xffffff, 200); if (self.health <= 0) { LK.getSound('enemyHit').play(); return true; } return false; }; return self; }); var Bubble = Container.expand(function () { var self = Container.call(this); var bubbleGraphics = self.attachAsset('bubble', { anchorX: 0.5, anchorY: 0.5 }); self.speed = -12; self.damage = 1; self.update = function () { self.y += self.speed; }; return self; }); var EnemyBullet = Container.expand(function () { var self = Container.call(this); var bulletGraphics = self.attachAsset('enemyBullet', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 4; self.damage = 1; self.update = function () { self.y += self.speed; }; return self; }); var EnemyFish = Container.expand(function () { var self = Container.call(this); var fishGraphics = self.attachAsset('enemyFish', { anchorX: 0.5, anchorY: 0.5 }); self.health = 2; self.speed = 2; self.shootCooldown = Math.random() * 120 + 60; self.update = function () { // Keep enemy fish in upper zone (y between 100-400) if (self.y < 100) { self.y = 100; } else if (self.y > 400) { self.y = 400; } // Move horizontally instead of vertically if (self.moveDirection === undefined) { self.moveDirection = Math.random() > 0.5 ? 1 : -1; self.horizontalSpeed = 1; } self.x += self.horizontalSpeed * self.moveDirection; // Bounce off screen edges if (self.x <= 50 || self.x >= 2048 - 50) { self.moveDirection *= -1; } if (self.shootCooldown > 0) { self.shootCooldown--; } else { self.shootEnemy(); self.shootCooldown = Math.random() * 120 + 60; } }; self.shootEnemy = function () { if (self.y > 0 && self.y < 2732 - 200) { var bullet = new EnemyBullet(); bullet.x = self.x; bullet.y = self.y + 40; enemyBullets.push(bullet); game.addChild(bullet); } }; self.takeDamage = function (damage) { self.health -= damage; LK.effects.flashObject(self, 0xffffff, 200); if (self.health <= 0) { LK.getSound('enemyHit').play(); return true; } return false; }; return self; }); var PlayerFish = Container.expand(function () { var self = Container.call(this); var fishGraphics = self.attachAsset('playerFish', { anchorX: 0.5, anchorY: 0.5 }); self.health = 3; self.damage = 1; self.maxHealth = 3; self.shootCooldown = 0; self.update = function () { if (self.shootCooldown > 0) { self.shootCooldown--; } else { // Auto shoot every 20 frames to match cooldown self.shoot(); } }; self.takeDamage = function (damage) { if (damage === undefined) damage = 1; self.health -= damage; LK.effects.flashObject(self, 0xff0000, 500); LK.getSound('playerHit').play(); if (self.health <= 0) { LK.showGameOver(); } }; self.shoot = function () { if (self.shootCooldown <= 0) { var bubble = new Bubble(); bubble.x = self.x; bubble.y = self.y - 50; bubble.damage = self.damage; bubbles.push(bubble); game.addChild(bubble); self.shootCooldown = 20; LK.getSound('bubbleShoot').play(); } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x001F3F }); /**** * Game Code ****/ var player; var enemies = []; var bubbles = []; var enemyBullets = []; var currentLevel = 1; var maxLevel = 10; var enemiesSpawned = 0; var enemiesKilled = 0; var spawnTimer = 0; var gameState = 'playing'; var boss = null; // UI Elements var healthText = new Text2('Health: 3', { size: 60, fill: 0xFFFFFF }); healthText.anchor.set(0, 0); healthText.x = 150; healthText.y = 50; LK.gui.topLeft.addChild(healthText); var levelText = new Text2('Level: 1', { size: 60, fill: 0xFFFFFF }); levelText.anchor.set(0.5, 0); LK.gui.top.addChild(levelText); var damageText = new Text2('Damage: 1', { size: 60, fill: 0xFFFFFF }); damageText.anchor.set(1, 0); damageText.x = -50; damageText.y = 50; LK.gui.topRight.addChild(damageText); // Upgrade UI (hidden initially) var upgradeContainer = new Container(); upgradeContainer.visible = false; LK.gui.center.addChild(upgradeContainer); var upgradeTitle = new Text2('Choose Upgrade:', { size: 80, fill: 0xFFFFFF }); upgradeTitle.anchor.set(0.5, 0.5); upgradeTitle.y = -150; upgradeContainer.addChild(upgradeTitle); var healthUpgradeButton = LK.getAsset('playerFish', { anchorX: 0.5, anchorY: 0.5, x: -200, y: 0, scaleX: 1.5, scaleY: 1.5 }); upgradeContainer.addChild(healthUpgradeButton); var healthUpgradeText = new Text2('+2 Health', { size: 50, fill: 0xFFFFFF }); healthUpgradeText.anchor.set(0.5, 0); healthUpgradeText.x = -200; healthUpgradeText.y = 80; upgradeContainer.addChild(healthUpgradeText); var damageUpgradeButton = LK.getAsset('bubble', { anchorX: 0.5, anchorY: 0.5, x: 200, y: 0, scaleX: 2, scaleY: 2 }); upgradeContainer.addChild(damageUpgradeButton); var damageUpgradeText = new Text2('+1 Damage', { size: 50, fill: 0xFFFFFF }); damageUpgradeText.anchor.set(0.5, 0); damageUpgradeText.x = 200; damageUpgradeText.y = 80; upgradeContainer.addChild(damageUpgradeText); // Initialize player player = game.addChild(new PlayerFish()); player.x = 1024; player.y = 2500; function updateUI() { healthText.setText('Health: ' + player.health); levelText.setText('Level: ' + currentLevel); damageText.setText('Damage: ' + player.damage); } function spawnEnemy() { var enemy; if (currentLevel === 10 && !boss) { boss = new BossFish(); boss.x = 1024; boss.y = 200; enemies.push(boss); game.addChild(boss); } else if (currentLevel < 10) { enemy = new EnemyFish(); enemy.x = Math.random() * (2048 - 200) + 100; enemy.y = Math.random() * 200 + 100; // Spawn in upper zone (100-300) enemies.push(enemy); game.addChild(enemy); enemiesSpawned++; } } function getEnemiesForLevel(level) { return Math.min(5 + level * 2, 20); } function startLevel() { enemiesSpawned = 0; enemiesKilled = 0; spawnTimer = 0; gameState = 'playing'; boss = null; // Restore player health to maximum at start of each level player.health = player.maxHealth; if (currentLevel === 10) { spawnEnemy(); // Spawn boss immediately } } function showUpgradeScreen() { gameState = 'upgrading'; upgradeContainer.visible = true; } function hideUpgradeScreen() { upgradeContainer.visible = false; } function selectHealthUpgrade() { if (gameState === 'upgrading') { player.health += 2; player.maxHealth += 2; hideUpgradeScreen(); nextLevel(); } } function selectDamageUpgrade() { if (gameState === 'upgrading') { player.damage += 1; hideUpgradeScreen(); nextLevel(); } } function nextLevel() { currentLevel++; if (currentLevel > maxLevel) { LK.showYouWin(); return; } startLevel(); updateUI(); } // Event handlers healthUpgradeButton.down = function (x, y, obj) { selectHealthUpgrade(); }; damageUpgradeButton.down = function (x, y, obj) { selectDamageUpgrade(); }; game.down = function (x, y, obj) { // Player now shoots automatically, no manual shooting needed }; game.move = function (x, y, obj) { if (gameState === 'playing') { player.x = Math.max(60, Math.min(2048 - 60, x)); player.y = Math.max(2000, Math.min(2732 - 60, y)); } }; // Start first level startLevel(); updateUI(); // Play background music LK.playMusic('oceanAmbient'); game.update = function () { if (gameState !== 'playing') { // Stop player from shooting when not in playing state player.shootCooldown = 20; return; } // Spawn enemies if (currentLevel < 10) { spawnTimer++; var maxEnemies = getEnemiesForLevel(currentLevel); if (spawnTimer >= 90 && enemiesSpawned < maxEnemies) { spawnEnemy(); spawnTimer = 0; } } // Update bubbles for (var i = bubbles.length - 1; i >= 0; i--) { var bubble = bubbles[i]; if (bubble.lastY === undefined) bubble.lastY = bubble.y; // Remove off-screen bubbles if (bubble.lastY >= -30 && bubble.y < -30) { bubble.destroy(); bubbles.splice(i, 1); continue; } // Check bubble-enemy collisions var hit = false; for (var j = enemies.length - 1; j >= 0; j--) { var enemy = enemies[j]; if (bubble.intersects(enemy)) { if (enemy.takeDamage(bubble.damage)) { enemy.destroy(); enemies.splice(j, 1); enemiesKilled++; } bubble.destroy(); bubbles.splice(i, 1); hit = true; break; } } if (!hit) { bubble.lastY = bubble.y; } } // Update enemy bullets for (var i = enemyBullets.length - 1; i >= 0; i--) { var bullet = enemyBullets[i]; if (bullet.lastY === undefined) bullet.lastY = bullet.y; // Remove off-screen bullets if (bullet.lastY <= 2732 + 30 && bullet.y > 2732 + 30) { bullet.destroy(); enemyBullets.splice(i, 1); continue; } // Check bullet-player collision if (bullet.intersects(player)) { player.takeDamage(bullet.damage); bullet.destroy(); enemyBullets.splice(i, 1); continue; } bullet.lastY = bullet.y; } // Update enemies for (var i = enemies.length - 1; i >= 0; i--) { var enemy = enemies[i]; if (enemy.lastY === undefined) enemy.lastY = enemy.y; // Remove off-screen enemies (not boss) if (enemy !== boss && enemy.lastY <= 2732 + 50 && enemy.y > 2732 + 50) { enemy.destroy(); enemies.splice(i, 1); continue; } // Check enemy-player collision if (enemy.intersects(player)) { player.takeDamage(1); } enemy.lastY = enemy.y; } // Check level completion if (currentLevel < 10) { var maxEnemies = getEnemiesForLevel(currentLevel); if (enemiesKilled >= maxEnemies && enemies.length === 0) { // Clear all enemy bullets when level is completed for (var k = enemyBullets.length - 1; k >= 0; k--) { enemyBullets[k].destroy(); enemyBullets.splice(k, 1); } showUpgradeScreen(); } } else { // Boss level if (enemies.length === 0) { // Clear all enemy bullets when boss is defeated for (var k = enemyBullets.length - 1; k >= 0; k--) { enemyBullets[k].destroy(); enemyBullets.splice(k, 1); } LK.showYouWin(); } } updateUI(); };
===================================================================
--- original.js
+++ change.js
@@ -141,9 +141,9 @@
self.update = function () {
if (self.shootCooldown > 0) {
self.shootCooldown--;
} else {
- // Auto shoot every 10 frames
+ // Auto shoot every 20 frames to match cooldown
self.shoot();
}
};
self.takeDamage = function (damage) {
@@ -162,9 +162,9 @@
bubble.y = self.y - 50;
bubble.damage = self.damage;
bubbles.push(bubble);
game.addChild(bubble);
- self.shootCooldown = 8;
+ self.shootCooldown = 20;
LK.getSound('bubbleShoot').play();
}
};
return self;
@@ -353,8 +353,10 @@
// Play background music
LK.playMusic('oceanAmbient');
game.update = function () {
if (gameState !== 'playing') {
+ // Stop player from shooting when not in playing state
+ player.shootCooldown = 20;
return;
}
// Spawn enemies
if (currentLevel < 10) {
Water Bubble. In-Game asset. High contrast. No shadows. 2D
a orange water bubble. In-Game asset. 2d. High contrast. No shadows
a orange fish seen from top to bottom. In-Game asset. 2d. High contrast. No shadows
a blue fish seen from above, looking up. In-Game asset. 2d. High contrast. No shadows
a purple evil fish seen from top to bottom. In-Game asset. 2d. High contrast. No shadows
a red fish seen from top to bottom. In-Game asset. 2d. High contrast. No shadows
a gold fish seen from top to bottom. In-Game asset. 2d. High contrast. No shadows
a gold dark fish seen from top to bottom. In-Game asset. 2d. High contrast. No shadows
image of the ocean bottom. In-Game asset. 2d. High contrast. No shadows
image of the bottom of the ocean, dark background. In-Game asset. 2d. High contrast. No shadows