User prompt
Que los miners te den menos dinero
User prompt
Pone un contador de canto dinero tenes
User prompt
Que el botón de el miner este arriba de los ortos botones
User prompt
Crea una tropa qué te da dinero (100) coste:35
User prompt
Más separados
User prompt
Pone todos los botones separados
User prompt
Crea una tropa qué rispare muy rápido pero sus balas no asen mucho daño (0.5)
User prompt
Crea una tropa qué lanza bombas
User prompt
Pone un botón para cada uno
User prompt
Crea una tropa qué rispare a los zombies
User prompt
Pone una topa que tega resistencia muy grande y si los zombies lo tocan les ace daño
User prompt
Quiero que las towers puedan dispara
Code edit (1 edits merged)
Please save this source code
User prompt
Zombie City Defense
Initial prompt
Taber difen de zombies en una ciudad
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var Bullet = Container.expand(function () { var self = Container.call(this); var bulletGraphics = self.attachAsset('bullet', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 8; self.target = null; self.update = function () { if (!self.target || zombies.indexOf(self.target) === -1) { self.destroy(); var index = bullets.indexOf(self); if (index > -1) { bullets.splice(index, 1); } return; } // Move toward target var dx = self.target.x - self.x; var dy = self.target.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < 10) { // Hit target self.target.takeDamage(); self.destroy(); var index = bullets.indexOf(self); if (index > -1) { bullets.splice(index, 1); } } else { self.x += dx / distance * self.speed; self.y += dy / distance * self.speed; } }; return self; }); var Tower = Container.expand(function () { var self = Container.call(this); var towerGraphics = self.attachAsset('tower', { anchorX: 0.5, anchorY: 0.5 }); self.range = 150; self.shootCooldown = 0; self.shootRate = 30; // frames between shots self.level = 1; self.update = function () { if (self.shootCooldown > 0) { self.shootCooldown--; return; } // Find nearest zombie in range var nearestZombie = null; var nearestDistance = Infinity; for (var i = 0; i < zombies.length; i++) { var zombie = zombies[i]; var dx = zombie.x - self.x; var dy = zombie.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance <= self.range && distance < nearestDistance) { nearestDistance = distance; nearestZombie = zombie; } } if (nearestZombie) { self.shoot(nearestZombie); self.shootCooldown = self.shootRate; } }; self.shoot = function (target) { var bullet = new Bullet(); bullet.x = self.x; bullet.y = self.y; bullet.target = target; bullets.push(bullet); game.addChild(bullet); LK.getSound('shoot').play(); }; self.upgrade = function () { if (gamePoints >= self.getUpgradeCost()) { gamePoints -= self.getUpgradeCost(); self.level++; self.range += 20; self.shootRate = Math.max(10, self.shootRate - 5); towerGraphics.tint = 0x2e7d32; // Green tint for upgraded towers updateUI(); } }; self.getUpgradeCost = function () { return self.level * 15; }; return self; }); var Zombie = Container.expand(function () { var self = Container.call(this); var zombieGraphics = self.attachAsset('zombie', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 1; self.health = 1; self.targetX = cityCenter.x; self.targetY = cityCenter.y; self.update = function () { // Move toward city center var dx = self.targetX - self.x; var dy = self.targetY - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance > 5) { self.x += dx / distance * self.speed; self.y += dy / distance * self.speed; } }; self.takeDamage = function () { self.health--; if (self.health <= 0) { self.die(); } }; self.die = function () { LK.getSound('zombieHit').play(); gamePoints += 5; updateUI(); // Remove from zombies array var index = zombies.indexOf(self); if (index > -1) { zombies.splice(index, 1); } self.destroy(); }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x2e2e2e }); /**** * Game Code ****/ // Game variables var towers = []; var zombies = []; var bullets = []; var gamePoints = 50; var wave = 1; var zombiesSpawned = 0; var zombiesToSpawn = 5; var spawnTimer = 0; var waveComplete = true; var gridSize = 80; var towerCost = 20; // Create city center var cityCenter = game.addChild(LK.getAsset('cityCenter', { anchorX: 0.5, anchorY: 0.5, x: 1024, y: 1366 })); // Create UI elements var pointsText = new Text2('Points: 50', { size: 60, fill: 0xFFFFFF }); pointsText.anchor.set(0, 0); LK.gui.topRight.addChild(pointsText); var waveText = new Text2('Wave: 1', { size: 60, fill: 0xFFFFFF }); waveText.anchor.set(0.5, 0); LK.gui.top.addChild(waveText); var instructionText = new Text2('Tap to place tower (Cost: 20)', { size: 40, fill: 0xFFFFFF }); instructionText.anchor.set(0.5, 1); LK.gui.bottom.addChild(instructionText); function updateUI() { pointsText.setText('Points: ' + gamePoints); waveText.setText('Wave: ' + wave); } function snapToGrid(value) { return Math.floor(value / gridSize) * gridSize + gridSize / 2; } function canPlaceTower(x, y) { // Check if position is too close to city center var dx = x - cityCenter.x; var dy = y - cityCenter.y; var distanceToCenter = Math.sqrt(dx * dx + dy * dy); if (distanceToCenter < 150) { return false; } // Check if there's already a tower at this position for (var i = 0; i < towers.length; i++) { var tower = towers[i]; if (Math.abs(tower.x - x) < gridSize / 2 && Math.abs(tower.y - y) < gridSize / 2) { return false; } } return true; } function placeTower(x, y) { if (gamePoints >= towerCost && canPlaceTower(x, y)) { var tower = new Tower(); tower.x = x; tower.y = y; towers.push(tower); game.addChild(tower); gamePoints -= towerCost; updateUI(); } } function getTowerAt(x, y) { for (var i = 0; i < towers.length; i++) { var tower = towers[i]; var dx = Math.abs(tower.x - x); var dy = Math.abs(tower.y - y); if (dx < gridSize / 2 && dy < gridSize / 2) { return tower; } } return null; } function spawnZombie() { var zombie = new Zombie(); // Spawn from random edge var edge = Math.floor(Math.random() * 4); switch (edge) { case 0: // Top zombie.x = Math.random() * 2048; zombie.y = 0; break; case 1: // Right zombie.x = 2048; zombie.y = Math.random() * 2732; break; case 2: // Bottom zombie.x = Math.random() * 2048; zombie.y = 2732; break; case 3: // Left zombie.x = 0; zombie.y = Math.random() * 2732; break; } // Increase speed and health with waves zombie.speed = 1 + (wave - 1) * 0.2; zombie.health = 1 + Math.floor((wave - 1) / 3); zombies.push(zombie); game.addChild(zombie); } function startNextWave() { wave++; zombiesToSpawn = 5 + wave * 2; zombiesSpawned = 0; waveComplete = false; spawnTimer = 0; updateUI(); } game.down = function (x, y, obj) { var gridX = snapToGrid(x); var gridY = snapToGrid(y); var existingTower = getTowerAt(gridX, gridY); if (existingTower) { // Try to upgrade tower existingTower.upgrade(); } else { // Try to place new tower placeTower(gridX, gridY); } }; game.update = function () { // Spawn zombies for current wave if (!waveComplete) { spawnTimer++; if (spawnTimer >= 60 && zombiesSpawned < zombiesToSpawn) { // Spawn every second spawnZombie(); zombiesSpawned++; spawnTimer = 0; } if (zombiesSpawned >= zombiesToSpawn && zombies.length === 0) { waveComplete = true; LK.setTimeout(startNextWave, 2000); // Start next wave after 2 seconds } } // Check if zombies reached city center for (var i = zombies.length - 1; i >= 0; i--) { var zombie = zombies[i]; var dx = zombie.x - cityCenter.x; var dy = zombie.y - cityCenter.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < 100) { // Game over LK.showGameOver(); return; } } // Update score LK.setScore(gamePoints + (wave - 1) * 100); }; // Start first wave after 3 seconds LK.setTimeout(startNextWave, 3000);
===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,319 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+
+/****
+* Classes
+****/
+var Bullet = Container.expand(function () {
+ var self = Container.call(this);
+ var bulletGraphics = self.attachAsset('bullet', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 8;
+ self.target = null;
+ self.update = function () {
+ if (!self.target || zombies.indexOf(self.target) === -1) {
+ self.destroy();
+ var index = bullets.indexOf(self);
+ if (index > -1) {
+ bullets.splice(index, 1);
+ }
+ return;
+ }
+ // Move toward target
+ var dx = self.target.x - self.x;
+ var dy = self.target.y - self.y;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ if (distance < 10) {
+ // Hit target
+ self.target.takeDamage();
+ self.destroy();
+ var index = bullets.indexOf(self);
+ if (index > -1) {
+ bullets.splice(index, 1);
+ }
+ } else {
+ self.x += dx / distance * self.speed;
+ self.y += dy / distance * self.speed;
+ }
+ };
+ return self;
+});
+var Tower = Container.expand(function () {
+ var self = Container.call(this);
+ var towerGraphics = self.attachAsset('tower', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.range = 150;
+ self.shootCooldown = 0;
+ self.shootRate = 30; // frames between shots
+ self.level = 1;
+ self.update = function () {
+ if (self.shootCooldown > 0) {
+ self.shootCooldown--;
+ return;
+ }
+ // Find nearest zombie in range
+ var nearestZombie = null;
+ var nearestDistance = Infinity;
+ for (var i = 0; i < zombies.length; i++) {
+ var zombie = zombies[i];
+ var dx = zombie.x - self.x;
+ var dy = zombie.y - self.y;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ if (distance <= self.range && distance < nearestDistance) {
+ nearestDistance = distance;
+ nearestZombie = zombie;
+ }
+ }
+ if (nearestZombie) {
+ self.shoot(nearestZombie);
+ self.shootCooldown = self.shootRate;
+ }
+ };
+ self.shoot = function (target) {
+ var bullet = new Bullet();
+ bullet.x = self.x;
+ bullet.y = self.y;
+ bullet.target = target;
+ bullets.push(bullet);
+ game.addChild(bullet);
+ LK.getSound('shoot').play();
+ };
+ self.upgrade = function () {
+ if (gamePoints >= self.getUpgradeCost()) {
+ gamePoints -= self.getUpgradeCost();
+ self.level++;
+ self.range += 20;
+ self.shootRate = Math.max(10, self.shootRate - 5);
+ towerGraphics.tint = 0x2e7d32; // Green tint for upgraded towers
+ updateUI();
+ }
+ };
+ self.getUpgradeCost = function () {
+ return self.level * 15;
+ };
+ return self;
+});
+var Zombie = Container.expand(function () {
+ var self = Container.call(this);
+ var zombieGraphics = self.attachAsset('zombie', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 1;
+ self.health = 1;
+ self.targetX = cityCenter.x;
+ self.targetY = cityCenter.y;
+ self.update = function () {
+ // Move toward city center
+ var dx = self.targetX - self.x;
+ var dy = self.targetY - self.y;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ if (distance > 5) {
+ self.x += dx / distance * self.speed;
+ self.y += dy / distance * self.speed;
+ }
+ };
+ self.takeDamage = function () {
+ self.health--;
+ if (self.health <= 0) {
+ self.die();
+ }
+ };
+ self.die = function () {
+ LK.getSound('zombieHit').play();
+ gamePoints += 5;
+ updateUI();
+ // Remove from zombies array
+ var index = zombies.indexOf(self);
+ if (index > -1) {
+ zombies.splice(index, 1);
+ }
+ self.destroy();
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x2e2e2e
+});
+
+/****
+* Game Code
+****/
+// Game variables
+var towers = [];
+var zombies = [];
+var bullets = [];
+var gamePoints = 50;
+var wave = 1;
+var zombiesSpawned = 0;
+var zombiesToSpawn = 5;
+var spawnTimer = 0;
+var waveComplete = true;
+var gridSize = 80;
+var towerCost = 20;
+// Create city center
+var cityCenter = game.addChild(LK.getAsset('cityCenter', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: 1024,
+ y: 1366
+}));
+// Create UI elements
+var pointsText = new Text2('Points: 50', {
+ size: 60,
+ fill: 0xFFFFFF
+});
+pointsText.anchor.set(0, 0);
+LK.gui.topRight.addChild(pointsText);
+var waveText = new Text2('Wave: 1', {
+ size: 60,
+ fill: 0xFFFFFF
+});
+waveText.anchor.set(0.5, 0);
+LK.gui.top.addChild(waveText);
+var instructionText = new Text2('Tap to place tower (Cost: 20)', {
+ size: 40,
+ fill: 0xFFFFFF
+});
+instructionText.anchor.set(0.5, 1);
+LK.gui.bottom.addChild(instructionText);
+function updateUI() {
+ pointsText.setText('Points: ' + gamePoints);
+ waveText.setText('Wave: ' + wave);
+}
+function snapToGrid(value) {
+ return Math.floor(value / gridSize) * gridSize + gridSize / 2;
+}
+function canPlaceTower(x, y) {
+ // Check if position is too close to city center
+ var dx = x - cityCenter.x;
+ var dy = y - cityCenter.y;
+ var distanceToCenter = Math.sqrt(dx * dx + dy * dy);
+ if (distanceToCenter < 150) {
+ return false;
+ }
+ // Check if there's already a tower at this position
+ for (var i = 0; i < towers.length; i++) {
+ var tower = towers[i];
+ if (Math.abs(tower.x - x) < gridSize / 2 && Math.abs(tower.y - y) < gridSize / 2) {
+ return false;
+ }
+ }
+ return true;
+}
+function placeTower(x, y) {
+ if (gamePoints >= towerCost && canPlaceTower(x, y)) {
+ var tower = new Tower();
+ tower.x = x;
+ tower.y = y;
+ towers.push(tower);
+ game.addChild(tower);
+ gamePoints -= towerCost;
+ updateUI();
+ }
+}
+function getTowerAt(x, y) {
+ for (var i = 0; i < towers.length; i++) {
+ var tower = towers[i];
+ var dx = Math.abs(tower.x - x);
+ var dy = Math.abs(tower.y - y);
+ if (dx < gridSize / 2 && dy < gridSize / 2) {
+ return tower;
+ }
+ }
+ return null;
+}
+function spawnZombie() {
+ var zombie = new Zombie();
+ // Spawn from random edge
+ var edge = Math.floor(Math.random() * 4);
+ switch (edge) {
+ case 0:
+ // Top
+ zombie.x = Math.random() * 2048;
+ zombie.y = 0;
+ break;
+ case 1:
+ // Right
+ zombie.x = 2048;
+ zombie.y = Math.random() * 2732;
+ break;
+ case 2:
+ // Bottom
+ zombie.x = Math.random() * 2048;
+ zombie.y = 2732;
+ break;
+ case 3:
+ // Left
+ zombie.x = 0;
+ zombie.y = Math.random() * 2732;
+ break;
+ }
+ // Increase speed and health with waves
+ zombie.speed = 1 + (wave - 1) * 0.2;
+ zombie.health = 1 + Math.floor((wave - 1) / 3);
+ zombies.push(zombie);
+ game.addChild(zombie);
+}
+function startNextWave() {
+ wave++;
+ zombiesToSpawn = 5 + wave * 2;
+ zombiesSpawned = 0;
+ waveComplete = false;
+ spawnTimer = 0;
+ updateUI();
+}
+game.down = function (x, y, obj) {
+ var gridX = snapToGrid(x);
+ var gridY = snapToGrid(y);
+ var existingTower = getTowerAt(gridX, gridY);
+ if (existingTower) {
+ // Try to upgrade tower
+ existingTower.upgrade();
+ } else {
+ // Try to place new tower
+ placeTower(gridX, gridY);
+ }
+};
+game.update = function () {
+ // Spawn zombies for current wave
+ if (!waveComplete) {
+ spawnTimer++;
+ if (spawnTimer >= 60 && zombiesSpawned < zombiesToSpawn) {
+ // Spawn every second
+ spawnZombie();
+ zombiesSpawned++;
+ spawnTimer = 0;
+ }
+ if (zombiesSpawned >= zombiesToSpawn && zombies.length === 0) {
+ waveComplete = true;
+ LK.setTimeout(startNextWave, 2000); // Start next wave after 2 seconds
+ }
+ }
+ // Check if zombies reached city center
+ for (var i = zombies.length - 1; i >= 0; i--) {
+ var zombie = zombies[i];
+ var dx = zombie.x - cityCenter.x;
+ var dy = zombie.y - cityCenter.y;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ if (distance < 100) {
+ // Game over
+ LK.showGameOver();
+ return;
+ }
+ }
+ // Update score
+ LK.setScore(gamePoints + (wave - 1) * 100);
+};
+// Start first wave after 3 seconds
+LK.setTimeout(startNextWave, 3000);
\ No newline at end of file
Citycenter. In-Game asset. 2d. High contrast. No shadows
Un zombie. In-Game asset. 2d. High contrast. No shadows
Una casilla. In-Game asset. 2d. High contrast. No shadows
Toreta. In-Game asset. 2d. High contrast. No shadows
Un cañón. In-Game asset. 2d. High contrast. No shadows
Que tenga bombas
Una bomba. In-Game asset. 2d. High contrast. No shadows
Crea una torreta. In-Game asset. 2d. High contrast. No shadows
Un minero. In-Game asset. 2d. High contrast. No shadows
Un zombie gigante. In-Game asset. 2d. High contrast. No shadows
Fuego. In-Game asset. 2d. High contrast. No shadows
Un congelador. In-Game asset. 2d. High contrast. No shadows
Un zombie con un traje de limpieza. In-Game asset. 2d. High contrast. No shadows
Crea un zombie con un coche. In-Game asset. 2d. High contrast. No shadows
Un tanque. In-Game asset. 2d. High contrast. No shadows
Laserturret. In-Game asset. 2d. High contrast. No shadows
Un misile. In-Game asset. 2d. High contrast. No shadows