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 Barrier = Container.expand(function () { var self = Container.call(this); var barrierGraphics = self.attachAsset('tower', { anchorX: 0.5, anchorY: 0.5 }); barrierGraphics.tint = 0x8B4513; // Brown tint for barriers self.health = 100; // Very high resistance self.maxHealth = 100; self.lastIntersecting = {}; self.update = function () { // Check collision with zombies for (var i = 0; i < zombies.length; i++) { var zombie = zombies[i]; var zombieId = zombies.indexOf(zombie); // Initialize last intersecting state if not exists if (self.lastIntersecting[zombieId] === undefined) { self.lastIntersecting[zombieId] = false; } var currentIntersecting = self.intersects(zombie); // Check if zombie just started intersecting if (!self.lastIntersecting[zombieId] && currentIntersecting) { // Damage zombie zombie.takeDamage(); // Take damage to barrier self.health -= 5; // Update barrier appearance based on health var healthPercent = self.health / self.maxHealth; if (healthPercent > 0.7) { barrierGraphics.tint = 0x8B4513; // Brown } else if (healthPercent > 0.4) { barrierGraphics.tint = 0xFF8C00; // Orange } else { barrierGraphics.tint = 0xFF0000; // Red } // Destroy barrier if health reaches 0 if (self.health <= 0) { self.destroy(); var index = barriers.indexOf(self); if (index > -1) { barriers.splice(index, 1); } return; } } // Update last intersecting state self.lastIntersecting[zombieId] = currentIntersecting; } }; return self; }); 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 barriers = []; var gamePoints = 50; var wave = 1; var zombiesSpawned = 0; var zombiesToSpawn = 5; var spawnTimer = 0; var waveComplete = true; var gridSize = 80; var towerCost = 20; var barrierCost = 30; // 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: Tower (20) | Hold: Barrier (30)', { 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; } } // Check if there's already a barrier at this position for (var i = 0; i < barriers.length; i++) { var barrier = barriers[i]; if (Math.abs(barrier.x - x) < gridSize / 2 && Math.abs(barrier.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 placeBarrier(x, y) { if (gamePoints >= barrierCost && canPlaceTower(x, y)) { var barrier = new Barrier(); barrier.x = x; barrier.y = y; barriers.push(barrier); game.addChild(barrier); gamePoints -= barrierCost; 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(); } var holdTimer = 0; var isHolding = false; var holdPosition = { x: 0, y: 0 }; game.down = function (x, y, obj) { var gridX = snapToGrid(x); var gridY = snapToGrid(y); holdPosition.x = gridX; holdPosition.y = gridY; isHolding = true; holdTimer = 0; var existingTower = getTowerAt(gridX, gridY); if (existingTower) { // Try to upgrade tower existingTower.upgrade(); isHolding = false; } }; game.up = function (x, y, obj) { if (isHolding && holdTimer < 30) { // Short tap - place tower placeTower(holdPosition.x, holdPosition.y); } isHolding = false; holdTimer = 0; }; game.update = function () { // Handle hold timer for barrier placement if (isHolding) { holdTimer++; if (holdTimer >= 30) { // Long hold - place barrier placeBarrier(holdPosition.x, holdPosition.y); isHolding = false; holdTimer = 0; } } // 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 all towers (this enables shooting) for (var i = 0; i < towers.length; i++) { towers[i].update(); } // Update all barriers (this enables damage dealing) for (var i = 0; i < barriers.length; i++) { barriers[i].update(); } // Update score LK.setScore(gamePoints + (wave - 1) * 100); }; // Start first wave after 3 seconds LK.setTimeout(startNextWave, 3000);
===================================================================
--- original.js
+++ change.js
@@ -5,8 +5,59 @@
/****
* Classes
****/
+var Barrier = Container.expand(function () {
+ var self = Container.call(this);
+ var barrierGraphics = self.attachAsset('tower', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ barrierGraphics.tint = 0x8B4513; // Brown tint for barriers
+ self.health = 100; // Very high resistance
+ self.maxHealth = 100;
+ self.lastIntersecting = {};
+ self.update = function () {
+ // Check collision with zombies
+ for (var i = 0; i < zombies.length; i++) {
+ var zombie = zombies[i];
+ var zombieId = zombies.indexOf(zombie);
+ // Initialize last intersecting state if not exists
+ if (self.lastIntersecting[zombieId] === undefined) {
+ self.lastIntersecting[zombieId] = false;
+ }
+ var currentIntersecting = self.intersects(zombie);
+ // Check if zombie just started intersecting
+ if (!self.lastIntersecting[zombieId] && currentIntersecting) {
+ // Damage zombie
+ zombie.takeDamage();
+ // Take damage to barrier
+ self.health -= 5;
+ // Update barrier appearance based on health
+ var healthPercent = self.health / self.maxHealth;
+ if (healthPercent > 0.7) {
+ barrierGraphics.tint = 0x8B4513; // Brown
+ } else if (healthPercent > 0.4) {
+ barrierGraphics.tint = 0xFF8C00; // Orange
+ } else {
+ barrierGraphics.tint = 0xFF0000; // Red
+ }
+ // Destroy barrier if health reaches 0
+ if (self.health <= 0) {
+ self.destroy();
+ var index = barriers.indexOf(self);
+ if (index > -1) {
+ barriers.splice(index, 1);
+ }
+ return;
+ }
+ }
+ // Update last intersecting state
+ self.lastIntersecting[zombieId] = currentIntersecting;
+ }
+ };
+ return self;
+});
var Bullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('bullet', {
anchorX: 0.5,
@@ -152,16 +203,18 @@
// Game variables
var towers = [];
var zombies = [];
var bullets = [];
+var barriers = [];
var gamePoints = 50;
var wave = 1;
var zombiesSpawned = 0;
var zombiesToSpawn = 5;
var spawnTimer = 0;
var waveComplete = true;
var gridSize = 80;
var towerCost = 20;
+var barrierCost = 30;
// Create city center
var cityCenter = game.addChild(LK.getAsset('cityCenter', {
anchorX: 0.5,
anchorY: 0.5,
@@ -180,9 +233,9 @@
fill: 0xFFFFFF
});
waveText.anchor.set(0.5, 0);
LK.gui.top.addChild(waveText);
-var instructionText = new Text2('Tap to place tower (Cost: 20)', {
+var instructionText = new Text2('Tap: Tower (20) | Hold: Barrier (30)', {
size: 40,
fill: 0xFFFFFF
});
instructionText.anchor.set(0.5, 1);
@@ -208,8 +261,15 @@
if (Math.abs(tower.x - x) < gridSize / 2 && Math.abs(tower.y - y) < gridSize / 2) {
return false;
}
}
+ // Check if there's already a barrier at this position
+ for (var i = 0; i < barriers.length; i++) {
+ var barrier = barriers[i];
+ if (Math.abs(barrier.x - x) < gridSize / 2 && Math.abs(barrier.y - y) < gridSize / 2) {
+ return false;
+ }
+ }
return true;
}
function placeTower(x, y) {
if (gamePoints >= towerCost && canPlaceTower(x, y)) {
@@ -221,8 +281,19 @@
gamePoints -= towerCost;
updateUI();
}
}
+function placeBarrier(x, y) {
+ if (gamePoints >= barrierCost && canPlaceTower(x, y)) {
+ var barrier = new Barrier();
+ barrier.x = x;
+ barrier.y = y;
+ barriers.push(barrier);
+ game.addChild(barrier);
+ gamePoints -= barrierCost;
+ updateUI();
+ }
+}
function getTowerAt(x, y) {
for (var i = 0; i < towers.length; i++) {
var tower = towers[i];
var dx = Math.abs(tower.x - x);
@@ -272,21 +343,47 @@
waveComplete = false;
spawnTimer = 0;
updateUI();
}
+var holdTimer = 0;
+var isHolding = false;
+var holdPosition = {
+ x: 0,
+ y: 0
+};
game.down = function (x, y, obj) {
var gridX = snapToGrid(x);
var gridY = snapToGrid(y);
+ holdPosition.x = gridX;
+ holdPosition.y = gridY;
+ isHolding = true;
+ holdTimer = 0;
var existingTower = getTowerAt(gridX, gridY);
if (existingTower) {
// Try to upgrade tower
existingTower.upgrade();
- } else {
- // Try to place new tower
- placeTower(gridX, gridY);
+ isHolding = false;
}
};
+game.up = function (x, y, obj) {
+ if (isHolding && holdTimer < 30) {
+ // Short tap - place tower
+ placeTower(holdPosition.x, holdPosition.y);
+ }
+ isHolding = false;
+ holdTimer = 0;
+};
game.update = function () {
+ // Handle hold timer for barrier placement
+ if (isHolding) {
+ holdTimer++;
+ if (holdTimer >= 30) {
+ // Long hold - place barrier
+ placeBarrier(holdPosition.x, holdPosition.y);
+ isHolding = false;
+ holdTimer = 0;
+ }
+ }
// Spawn zombies for current wave
if (!waveComplete) {
spawnTimer++;
if (spawnTimer >= 60 && zombiesSpawned < zombiesToSpawn) {
@@ -315,8 +412,12 @@
// Update all towers (this enables shooting)
for (var i = 0; i < towers.length; i++) {
towers[i].update();
}
+ // Update all barriers (this enables damage dealing)
+ for (var i = 0; i < barriers.length; i++) {
+ barriers[i].update();
+ }
// Update score
LK.setScore(gamePoints + (wave - 1) * 100);
};
// Start first wave after 3 seconds
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