User prompt
quiero que las torres disparen a los enemigos
Code edit (1 edits merged)
Please save this source code
User prompt
Noob Tower Defense
User prompt
quiero un tower defens en el que llegan noobs y tienes que colocar torres para defender, los noob tendran que pasar por un camino que llega desde donde aparecen hasta la base la cual tendra vida
User prompt
si pero explicamelo en español
User prompt
quiero crear un tower defense
User prompt
en español porfavor
Initial prompt
hola, quiero crear un tower defense
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var Bullet = Container.expand(function (startX, startY, target, damage) { var self = Container.call(this); var bulletGraphics = self.attachAsset('bullet', { anchorX: 0.5, anchorY: 0.5 }); self.x = startX; self.y = startY; self.target = target; self.damage = damage; self.speed = 8; self.update = function () { if (!self.target || self.target.parent === null) { // Target destroyed, remove bullet self.destroy(); var index = bullets.indexOf(self); if (index > -1) bullets.splice(index, 1); return; } var dx = self.target.x - self.x; var dy = self.target.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < 20) { // Hit target self.target.takeDamage(self.damage); self.destroy(); var index = bullets.indexOf(self); if (index > -1) bullets.splice(index, 1); } else { // Move towards target var moveX = dx / distance * self.speed; var moveY = dy / distance * self.speed; self.x += moveX; self.y += moveY; } }; return self; }); var Noob = Container.expand(function (type) { var self = Container.call(this); self.type = type || 'basic'; var assetId = 'noob'; self.maxHealth = 100; self.speed = 2; self.reward = 10; if (self.type === 'fast') { assetId = 'fastNoob'; self.maxHealth = 60; self.speed = 4; self.reward = 15; } else if (self.type === 'strong') { assetId = 'strongNoob'; self.maxHealth = 200; self.speed = 1.5; self.reward = 25; } var noobGraphics = self.attachAsset(assetId, { anchorX: 0.5, anchorY: 0.5 }); self.health = self.maxHealth; self.pathIndex = 0; self.targetX = pathPoints[0].x; self.targetY = pathPoints[0].y; self.update = function () { // Move towards current target var dx = self.targetX - self.x; var dy = self.targetY - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < 10) { // Reached current target, move to next self.pathIndex++; if (self.pathIndex >= pathPoints.length) { // Reached base baseHealth -= 20; self.destroy(); var index = noobs.indexOf(self); if (index > -1) noobs.splice(index, 1); return; } self.targetX = pathPoints[self.pathIndex].x; self.targetY = pathPoints[self.pathIndex].y; } else { // Move towards target var moveX = dx / distance * self.speed; var moveY = dy / distance * self.speed; self.x += moveX; self.y += moveY; } }; self.takeDamage = function (damage) { self.health -= damage; LK.getSound('enemyHit').play(); // Flash red when hit tween(noobGraphics, { tint: 0xFF0000 }, { duration: 100, onFinish: function onFinish() { tween(noobGraphics, { tint: 0xFFFFFF }, { duration: 100 }); } }); if (self.health <= 0) { currency += self.reward; LK.getSound('enemyDeath').play(); self.destroy(); var index = noobs.indexOf(self); if (index > -1) noobs.splice(index, 1); } }; return self; }); var Tower = Container.expand(function (gridX, gridY) { var self = Container.call(this); self.gridX = gridX; self.gridY = gridY; self.level = 1; self.damage = 25; self.range = 150; self.attackSpeed = 60; // frames between attacks self.cost = 50; self.upgradeCost = 75; self.lastAttack = 0; var towerGraphics = self.attachAsset('basicTower', { anchorX: 0.5, anchorY: 0.5 }); self.x = gridX * 128 + 64; self.y = gridY * 128 + 64; self.update = function () { self.lastAttack++; if (self.lastAttack >= self.attackSpeed) { // Look for enemies in range var target = null; var closestDistance = self.range; for (var i = 0; i < noobs.length; i++) { var noob = noobs[i]; var dx = noob.x - self.x; var dy = noob.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance <= self.range && distance < closestDistance) { target = noob; closestDistance = distance; } } if (target) { self.shoot(target); self.lastAttack = 0; } } }; self.shoot = function (target) { var bullet = new Bullet(self.x, self.y, target, self.damage); game.addChild(bullet); bullets.push(bullet); LK.getSound('shoot').play(); }; self.upgrade = function () { if (self.level < 3 && currency >= self.upgradeCost) { currency -= self.upgradeCost; self.level++; self.damage += 15; self.range += 25; self.upgradeCost = Math.floor(self.upgradeCost * 1.5); if (self.level >= 2) { towerGraphics.removeChild(); towerGraphics = self.attachAsset('upgradedTower', { anchorX: 0.5, anchorY: 0.5 }); } // Visual upgrade effect tween(self, { scaleX: 1.2, scaleY: 1.2 }, { duration: 200, onFinish: function onFinish() { tween(self, { scaleX: 1, scaleY: 1 }, { duration: 200 }); } }); } }; self.down = function (x, y, obj) { if (selectedTower !== self) { selectedTower = self; updateUI(); } else { self.upgrade(); updateUI(); } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x2F3542 }); /**** * Game Code ****/ // Sounds // UI Elements // Base // Projectiles // Towers // Noobs // Path tiles // Game variables var pathPoints = [{ x: 0, y: 384 }, { x: 256, y: 384 }, { x: 256, y: 768 }, { x: 640, y: 768 }, { x: 640, y: 1152 }, { x: 1024, y: 1152 }, { x: 1024, y: 1536 }, { x: 1408, y: 1536 }, { x: 1408, y: 1920 }, { x: 1792, y: 1920 }, { x: 1792, y: 2304 }, { x: 2048, y: 2304 }]; var noobs = []; var towers = []; var bullets = []; var currency = 100; var baseHealth = 100; var wave = 1; var enemiesInWave = 5; var enemiesSpawned = 0; var waveComplete = true; var spawnTimer = 0; var selectedTower = null; // Create path visualization function createPath() { for (var i = 0; i < pathPoints.length - 1; i++) { var start = pathPoints[i]; var end = pathPoints[i + 1]; // Create tiles between points var steps = Math.max(Math.abs(end.x - start.x), Math.abs(end.y - start.y)) / 128; for (var j = 0; j <= steps; j++) { var x = start.x + (end.x - start.x) * (j / steps); var y = start.y + (end.y - start.y) * (j / steps); var pathTile = LK.getAsset('pathTile', { anchorX: 0.5, anchorY: 0.5 }); pathTile.x = x; pathTile.y = y; game.addChild(pathTile); } } } // Create grass background function createBackground() { for (var x = 0; x < 16; x++) { for (var y = 0; y < 22; y++) { var grassTile = LK.getAsset('grassTile', { anchorX: 0, anchorY: 0 }); grassTile.x = x * 128; grassTile.y = y * 128; game.addChild(grassTile); } } } // Create base var base = LK.getAsset('base', { anchorX: 0.5, anchorY: 0.5 }); base.x = pathPoints[pathPoints.length - 1].x; base.y = pathPoints[pathPoints.length - 1].y; // UI Elements var currencyText = new Text2('Currency: 100', { size: 60, fill: 0xFFD700 }); currencyText.anchor.set(0, 0); var healthText = new Text2('Base Health: 100', { size: 60, fill: 0xFF6B6B }); healthText.anchor.set(0, 0); var waveText = new Text2('Wave: 1', { size: 60, fill: 0x4ECDC4 }); waveText.anchor.set(0, 0); var towerInfoText = new Text2('Tap empty space to build tower (Cost: 50)', { size: 40, fill: 0xFFFFFF }); towerInfoText.anchor.set(0.5, 0); // Position UI elements LK.gui.top.addChild(currencyText); LK.gui.top.addChild(healthText); LK.gui.top.addChild(waveText); LK.gui.bottom.addChild(towerInfoText); healthText.y = 70; waveText.y = 140; function updateUI() { currencyText.setText('Currency: ' + currency); healthText.setText('Base Health: ' + baseHealth); waveText.setText('Wave: ' + wave); if (selectedTower) { towerInfoText.setText('Tower Level ' + selectedTower.level + ' | Upgrade Cost: ' + selectedTower.upgradeCost + ' | Tap again to upgrade'); } else { towerInfoText.setText('Tap empty space to build tower (Cost: 50)'); } } function startNextWave() { wave++; enemiesInWave = Math.floor(5 + wave * 1.5); enemiesSpawned = 0; waveComplete = false; spawnTimer = 0; selectedTower = null; updateUI(); } function spawnEnemy() { var enemyType = 'basic'; if (wave > 3 && Math.random() < 0.3) { enemyType = 'fast'; } if (wave > 5 && Math.random() < 0.2) { enemyType = 'strong'; } var noob = new Noob(enemyType); noob.x = pathPoints[0].x; noob.y = pathPoints[0].y; noobs.push(noob); game.addChild(noob); enemiesSpawned++; } function canPlaceTower(gridX, gridY) { // Check if position is on path for (var i = 0; i < pathPoints.length; i++) { var pathGridX = Math.floor(pathPoints[i].x / 128); var pathGridY = Math.floor(pathPoints[i].y / 128); if (gridX === pathGridX && gridY === pathGridY) { return false; } } // Check if tower already exists for (var i = 0; i < towers.length; i++) { if (towers[i].gridX === gridX && towers[i].gridY === gridY) { return false; } } return true; } // Initialize game elements createBackground(); createPath(); game.addChild(base); // Game event handlers game.down = function (x, y, obj) { var gridX = Math.floor(x / 128); var gridY = Math.floor(y / 128); if (canPlaceTower(gridX, gridY) && currency >= 50) { var tower = new Tower(gridX, gridY); towers.push(tower); game.addChild(tower); currency -= 50; selectedTower = tower; updateUI(); } else { selectedTower = null; updateUI(); } }; game.update = function () { // Check game over if (baseHealth <= 0) { LK.showGameOver(); return; } // Spawn enemies if (!waveComplete) { spawnTimer++; if (spawnTimer >= 90 && enemiesSpawned < enemiesInWave) { spawnEnemy(); spawnTimer = 0; } if (enemiesSpawned >= enemiesInWave && noobs.length === 0) { waveComplete = true; currency += 20; // Wave completion bonus updateUI(); } } else if (LK.ticks % 180 === 0) { // Auto-start next wave after 3 seconds startNextWave(); } // Update UI periodically if (LK.ticks % 30 === 0) { updateUI(); } }; // Start first wave updateUI();
===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,447 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+
+/****
+* Classes
+****/
+var Bullet = Container.expand(function (startX, startY, target, damage) {
+ var self = Container.call(this);
+ var bulletGraphics = self.attachAsset('bullet', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.x = startX;
+ self.y = startY;
+ self.target = target;
+ self.damage = damage;
+ self.speed = 8;
+ self.update = function () {
+ if (!self.target || self.target.parent === null) {
+ // Target destroyed, remove bullet
+ self.destroy();
+ var index = bullets.indexOf(self);
+ if (index > -1) bullets.splice(index, 1);
+ return;
+ }
+ var dx = self.target.x - self.x;
+ var dy = self.target.y - self.y;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ if (distance < 20) {
+ // Hit target
+ self.target.takeDamage(self.damage);
+ self.destroy();
+ var index = bullets.indexOf(self);
+ if (index > -1) bullets.splice(index, 1);
+ } else {
+ // Move towards target
+ var moveX = dx / distance * self.speed;
+ var moveY = dy / distance * self.speed;
+ self.x += moveX;
+ self.y += moveY;
+ }
+ };
+ return self;
+});
+var Noob = Container.expand(function (type) {
+ var self = Container.call(this);
+ self.type = type || 'basic';
+ var assetId = 'noob';
+ self.maxHealth = 100;
+ self.speed = 2;
+ self.reward = 10;
+ if (self.type === 'fast') {
+ assetId = 'fastNoob';
+ self.maxHealth = 60;
+ self.speed = 4;
+ self.reward = 15;
+ } else if (self.type === 'strong') {
+ assetId = 'strongNoob';
+ self.maxHealth = 200;
+ self.speed = 1.5;
+ self.reward = 25;
+ }
+ var noobGraphics = self.attachAsset(assetId, {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.health = self.maxHealth;
+ self.pathIndex = 0;
+ self.targetX = pathPoints[0].x;
+ self.targetY = pathPoints[0].y;
+ self.update = function () {
+ // Move towards current target
+ var dx = self.targetX - self.x;
+ var dy = self.targetY - self.y;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ if (distance < 10) {
+ // Reached current target, move to next
+ self.pathIndex++;
+ if (self.pathIndex >= pathPoints.length) {
+ // Reached base
+ baseHealth -= 20;
+ self.destroy();
+ var index = noobs.indexOf(self);
+ if (index > -1) noobs.splice(index, 1);
+ return;
+ }
+ self.targetX = pathPoints[self.pathIndex].x;
+ self.targetY = pathPoints[self.pathIndex].y;
+ } else {
+ // Move towards target
+ var moveX = dx / distance * self.speed;
+ var moveY = dy / distance * self.speed;
+ self.x += moveX;
+ self.y += moveY;
+ }
+ };
+ self.takeDamage = function (damage) {
+ self.health -= damage;
+ LK.getSound('enemyHit').play();
+ // Flash red when hit
+ tween(noobGraphics, {
+ tint: 0xFF0000
+ }, {
+ duration: 100,
+ onFinish: function onFinish() {
+ tween(noobGraphics, {
+ tint: 0xFFFFFF
+ }, {
+ duration: 100
+ });
+ }
+ });
+ if (self.health <= 0) {
+ currency += self.reward;
+ LK.getSound('enemyDeath').play();
+ self.destroy();
+ var index = noobs.indexOf(self);
+ if (index > -1) noobs.splice(index, 1);
+ }
+ };
+ return self;
+});
+var Tower = Container.expand(function (gridX, gridY) {
+ var self = Container.call(this);
+ self.gridX = gridX;
+ self.gridY = gridY;
+ self.level = 1;
+ self.damage = 25;
+ self.range = 150;
+ self.attackSpeed = 60; // frames between attacks
+ self.cost = 50;
+ self.upgradeCost = 75;
+ self.lastAttack = 0;
+ var towerGraphics = self.attachAsset('basicTower', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.x = gridX * 128 + 64;
+ self.y = gridY * 128 + 64;
+ self.update = function () {
+ self.lastAttack++;
+ if (self.lastAttack >= self.attackSpeed) {
+ // Look for enemies in range
+ var target = null;
+ var closestDistance = self.range;
+ for (var i = 0; i < noobs.length; i++) {
+ var noob = noobs[i];
+ var dx = noob.x - self.x;
+ var dy = noob.y - self.y;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ if (distance <= self.range && distance < closestDistance) {
+ target = noob;
+ closestDistance = distance;
+ }
+ }
+ if (target) {
+ self.shoot(target);
+ self.lastAttack = 0;
+ }
+ }
+ };
+ self.shoot = function (target) {
+ var bullet = new Bullet(self.x, self.y, target, self.damage);
+ game.addChild(bullet);
+ bullets.push(bullet);
+ LK.getSound('shoot').play();
+ };
+ self.upgrade = function () {
+ if (self.level < 3 && currency >= self.upgradeCost) {
+ currency -= self.upgradeCost;
+ self.level++;
+ self.damage += 15;
+ self.range += 25;
+ self.upgradeCost = Math.floor(self.upgradeCost * 1.5);
+ if (self.level >= 2) {
+ towerGraphics.removeChild();
+ towerGraphics = self.attachAsset('upgradedTower', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ }
+ // Visual upgrade effect
+ tween(self, {
+ scaleX: 1.2,
+ scaleY: 1.2
+ }, {
+ duration: 200,
+ onFinish: function onFinish() {
+ tween(self, {
+ scaleX: 1,
+ scaleY: 1
+ }, {
+ duration: 200
+ });
+ }
+ });
+ }
+ };
+ self.down = function (x, y, obj) {
+ if (selectedTower !== self) {
+ selectedTower = self;
+ updateUI();
+ } else {
+ self.upgrade();
+ updateUI();
+ }
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x2F3542
+});
+
+/****
+* Game Code
+****/
+// Sounds
+// UI Elements
+// Base
+// Projectiles
+// Towers
+// Noobs
+// Path tiles
+// Game variables
+var pathPoints = [{
+ x: 0,
+ y: 384
+}, {
+ x: 256,
+ y: 384
+}, {
+ x: 256,
+ y: 768
+}, {
+ x: 640,
+ y: 768
+}, {
+ x: 640,
+ y: 1152
+}, {
+ x: 1024,
+ y: 1152
+}, {
+ x: 1024,
+ y: 1536
+}, {
+ x: 1408,
+ y: 1536
+}, {
+ x: 1408,
+ y: 1920
+}, {
+ x: 1792,
+ y: 1920
+}, {
+ x: 1792,
+ y: 2304
+}, {
+ x: 2048,
+ y: 2304
+}];
+var noobs = [];
+var towers = [];
+var bullets = [];
+var currency = 100;
+var baseHealth = 100;
+var wave = 1;
+var enemiesInWave = 5;
+var enemiesSpawned = 0;
+var waveComplete = true;
+var spawnTimer = 0;
+var selectedTower = null;
+// Create path visualization
+function createPath() {
+ for (var i = 0; i < pathPoints.length - 1; i++) {
+ var start = pathPoints[i];
+ var end = pathPoints[i + 1];
+ // Create tiles between points
+ var steps = Math.max(Math.abs(end.x - start.x), Math.abs(end.y - start.y)) / 128;
+ for (var j = 0; j <= steps; j++) {
+ var x = start.x + (end.x - start.x) * (j / steps);
+ var y = start.y + (end.y - start.y) * (j / steps);
+ var pathTile = LK.getAsset('pathTile', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ pathTile.x = x;
+ pathTile.y = y;
+ game.addChild(pathTile);
+ }
+ }
+}
+// Create grass background
+function createBackground() {
+ for (var x = 0; x < 16; x++) {
+ for (var y = 0; y < 22; y++) {
+ var grassTile = LK.getAsset('grassTile', {
+ anchorX: 0,
+ anchorY: 0
+ });
+ grassTile.x = x * 128;
+ grassTile.y = y * 128;
+ game.addChild(grassTile);
+ }
+ }
+}
+// Create base
+var base = LK.getAsset('base', {
+ anchorX: 0.5,
+ anchorY: 0.5
+});
+base.x = pathPoints[pathPoints.length - 1].x;
+base.y = pathPoints[pathPoints.length - 1].y;
+// UI Elements
+var currencyText = new Text2('Currency: 100', {
+ size: 60,
+ fill: 0xFFD700
+});
+currencyText.anchor.set(0, 0);
+var healthText = new Text2('Base Health: 100', {
+ size: 60,
+ fill: 0xFF6B6B
+});
+healthText.anchor.set(0, 0);
+var waveText = new Text2('Wave: 1', {
+ size: 60,
+ fill: 0x4ECDC4
+});
+waveText.anchor.set(0, 0);
+var towerInfoText = new Text2('Tap empty space to build tower (Cost: 50)', {
+ size: 40,
+ fill: 0xFFFFFF
+});
+towerInfoText.anchor.set(0.5, 0);
+// Position UI elements
+LK.gui.top.addChild(currencyText);
+LK.gui.top.addChild(healthText);
+LK.gui.top.addChild(waveText);
+LK.gui.bottom.addChild(towerInfoText);
+healthText.y = 70;
+waveText.y = 140;
+function updateUI() {
+ currencyText.setText('Currency: ' + currency);
+ healthText.setText('Base Health: ' + baseHealth);
+ waveText.setText('Wave: ' + wave);
+ if (selectedTower) {
+ towerInfoText.setText('Tower Level ' + selectedTower.level + ' | Upgrade Cost: ' + selectedTower.upgradeCost + ' | Tap again to upgrade');
+ } else {
+ towerInfoText.setText('Tap empty space to build tower (Cost: 50)');
+ }
+}
+function startNextWave() {
+ wave++;
+ enemiesInWave = Math.floor(5 + wave * 1.5);
+ enemiesSpawned = 0;
+ waveComplete = false;
+ spawnTimer = 0;
+ selectedTower = null;
+ updateUI();
+}
+function spawnEnemy() {
+ var enemyType = 'basic';
+ if (wave > 3 && Math.random() < 0.3) {
+ enemyType = 'fast';
+ }
+ if (wave > 5 && Math.random() < 0.2) {
+ enemyType = 'strong';
+ }
+ var noob = new Noob(enemyType);
+ noob.x = pathPoints[0].x;
+ noob.y = pathPoints[0].y;
+ noobs.push(noob);
+ game.addChild(noob);
+ enemiesSpawned++;
+}
+function canPlaceTower(gridX, gridY) {
+ // Check if position is on path
+ for (var i = 0; i < pathPoints.length; i++) {
+ var pathGridX = Math.floor(pathPoints[i].x / 128);
+ var pathGridY = Math.floor(pathPoints[i].y / 128);
+ if (gridX === pathGridX && gridY === pathGridY) {
+ return false;
+ }
+ }
+ // Check if tower already exists
+ for (var i = 0; i < towers.length; i++) {
+ if (towers[i].gridX === gridX && towers[i].gridY === gridY) {
+ return false;
+ }
+ }
+ return true;
+}
+// Initialize game elements
+createBackground();
+createPath();
+game.addChild(base);
+// Game event handlers
+game.down = function (x, y, obj) {
+ var gridX = Math.floor(x / 128);
+ var gridY = Math.floor(y / 128);
+ if (canPlaceTower(gridX, gridY) && currency >= 50) {
+ var tower = new Tower(gridX, gridY);
+ towers.push(tower);
+ game.addChild(tower);
+ currency -= 50;
+ selectedTower = tower;
+ updateUI();
+ } else {
+ selectedTower = null;
+ updateUI();
+ }
+};
+game.update = function () {
+ // Check game over
+ if (baseHealth <= 0) {
+ LK.showGameOver();
+ return;
+ }
+ // Spawn enemies
+ if (!waveComplete) {
+ spawnTimer++;
+ if (spawnTimer >= 90 && enemiesSpawned < enemiesInWave) {
+ spawnEnemy();
+ spawnTimer = 0;
+ }
+ if (enemiesSpawned >= enemiesInWave && noobs.length === 0) {
+ waveComplete = true;
+ currency += 20; // Wave completion bonus
+ updateUI();
+ }
+ } else if (LK.ticks % 180 === 0) {
+ // Auto-start next wave after 3 seconds
+ startNextWave();
+ }
+ // Update UI periodically
+ if (LK.ticks % 30 === 0) {
+ updateUI();
+ }
+};
+// Start first wave
+updateUI();
\ No newline at end of file