User prompt
her wavede 5 elmas kazanalım
User prompt
oyuna boss ekle wave 10 da boss gelsin ve yeni para birimi elmas gelsin elmas sayesinde bütün towerleri güçlendirebilelim ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
yeni kaleler ekle ve daha çok animasyon ve güçlendirme ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Please fix the bug: 'TypeError: tween.to is not a function' in or related to this line: 'tween.to(enemyGraphics, {' Line Number: 207 ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot read properties of undefined (reading 'toGlobal')' in or related to this line: 'var globalPos = obj.parent.toGlobal(obj.position);' Line Number: 364
User prompt
başta 390 altın ile başlayalım ve kuleleri tıklama ile taşıma ekle
User prompt
kule taşıma ve daha animasyon ekle ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
yeni kaleler ekle şavasçılar
User prompt
geliştir fuc king
Code edit (1 edits merged)
Please save this source code
User prompt
Tower Defense 3D
Initial prompt
tower defense 3d
/**** * 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.damage = 25; self.target = null; self.hasHit = false; self.update = function () { if (!self.target || self.hasHit) 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) { self.target.takeDamage(self.damage); self.hasHit = true; LK.getSound('enemyHit').play(); return; } var moveX = dx / distance * self.speed; var moveY = dy / distance * self.speed; self.x += moveX; self.y += moveY; }; return self; }); var Enemy = Container.expand(function () { var self = Container.call(this); var enemyGraphics = self.attachAsset('enemy', { anchorX: 0.5, anchorY: 0.5 }); self.maxHealth = 100; self.health = self.maxHealth; self.speed = 2; self.reward = 10; self.pathIndex = 0; self.isDead = false; self.reachedBase = false; self.takeDamage = function (damage) { self.health -= damage; if (self.health <= 0 && !self.isDead) { self.isDead = true; LK.getSound('enemyDeath').play(); currency += self.reward; updateUI(); } }; self.update = function () { if (self.isDead || self.reachedBase) return; if (self.pathIndex < enemyPath.length) { var target = enemyPath[self.pathIndex]; var dx = target.x - self.x; var dy = target.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < 20) { self.pathIndex++; if (self.pathIndex >= enemyPath.length) { self.reachedBase = true; lives--; updateUI(); return; } } var moveX = dx / distance * self.speed; var moveY = dy / distance * self.speed; self.x += moveX; self.y += moveY; } }; 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.damage = 25; self.fireRate = 60; self.lastFire = 0; self.cost = 50; self.level = 1; self.showingRange = false; var rangeIndicator = self.attachAsset('towerRange', { anchorX: 0.5, anchorY: 0.5, alpha: 0.3 }); rangeIndicator.width = self.range * 2; rangeIndicator.height = self.range * 2; rangeIndicator.visible = false; self.showRange = function () { rangeIndicator.visible = true; self.showingRange = true; }; self.hideRange = function () { rangeIndicator.visible = false; self.showingRange = false; }; self.findTarget = function () { var closestEnemy = null; var closestDistance = Infinity; for (var i = 0; i < enemies.length; i++) { var enemy = enemies[i]; if (enemy.isDead || enemy.reachedBase) continue; var dx = enemy.x - self.x; var dy = enemy.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance <= self.range && distance < closestDistance) { closestDistance = distance; closestEnemy = enemy; } } return closestEnemy; }; self.fire = function (target) { if (LK.ticks - self.lastFire < self.fireRate) return; var bullet = new Bullet(); bullet.x = self.x; bullet.y = self.y; bullet.target = target; bullet.damage = self.damage; bullets.push(bullet); game.addChild(bullet); self.lastFire = LK.ticks; LK.getSound('shoot').play(); }; self.down = function (x, y, obj) { if (self.showingRange) { self.hideRange(); } else { self.showRange(); } }; self.update = function () { var target = self.findTarget(); if (target) { self.fire(target); } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x87CEEB }); /**** * Game Code ****/ var gridSize = 100; var mapWidth = 20; var mapHeight = 25; var currency = 100; var lives = 20; var wave = 1; var enemiesInWave = 5; var enemiesSpawned = 0; var waveActive = false; var gameOver = false; var towers = []; var enemies = []; var bullets = []; var grid = []; var enemyPath = []; var selectedTower = null; var placingTower = false; // Create UI elements var currencyTxt = new Text2('Gold: 100', { size: 60, fill: 0xFFD700 }); currencyTxt.anchor.set(0, 0); currencyTxt.x = 120; currencyTxt.y = 20; LK.gui.topLeft.addChild(currencyTxt); var livesTxt = new Text2('Lives: 20', { size: 60, fill: 0xFF0000 }); livesTxt.anchor.set(0.5, 0); LK.gui.top.addChild(livesTxt); var waveTxt = new Text2('Wave: 1', { size: 60, fill: 0xFFFFFF }); waveTxt.anchor.set(1, 0); LK.gui.topRight.addChild(waveTxt); var startWaveBtn = new Text2('Start Wave', { size: 80, fill: 0x00FF00 }); startWaveBtn.anchor.set(0.5, 1); startWaveBtn.y = -20; LK.gui.bottom.addChild(startWaveBtn); var buyTowerBtn = new Text2('Buy Tower (50g)', { size: 70, fill: 0x4A90E2 }); buyTowerBtn.anchor.set(0, 1); buyTowerBtn.x = 20; buyTowerBtn.y = -20; LK.gui.bottomLeft.addChild(buyTowerBtn); function updateUI() { currencyTxt.setText('Gold: ' + currency); livesTxt.setText('Lives: ' + lives); waveTxt.setText('Wave: ' + wave); if (currency >= 50) { buyTowerBtn.tint = 0x4A90E2; } else { buyTowerBtn.tint = 0x666666; } } function initializeGrid() { for (var x = 0; x < mapWidth; x++) { grid[x] = []; for (var y = 0; y < mapHeight; y++) { grid[x][y] = { x: x * gridSize + gridSize / 2, y: y * gridSize + gridSize / 2, occupied: false, isPath: false }; } } } function createPath() { enemyPath = []; var startX = 0; var startY = Math.floor(mapHeight / 2); var endX = mapWidth - 1; var endY = Math.floor(mapHeight / 2); for (var x = startX; x <= endX; x++) { grid[x][startY].isPath = true; enemyPath.push({ x: x * gridSize + gridSize / 2, y: startY * gridSize + gridSize / 2 }); } } function drawMap() { for (var x = 0; x < mapWidth; x++) { for (var y = 0; y < mapHeight; y++) { var tile; if (grid[x][y].isPath) { tile = LK.getAsset('pathTile', { x: x * gridSize, y: y * gridSize }); } else { tile = LK.getAsset('grassTile', { x: x * gridSize, y: y * gridSize }); } game.addChild(tile); } } } function drawBase() { var base = LK.getAsset('base', { anchorX: 0.5, anchorY: 0.5, x: (mapWidth - 1) * gridSize + gridSize / 2, y: Math.floor(mapHeight / 2) * gridSize + gridSize / 2 }); game.addChild(base); } function spawnEnemy() { if (enemiesSpawned >= enemiesInWave) return; var enemy = new Enemy(); enemy.x = gridSize / 2; enemy.y = Math.floor(mapHeight / 2) * gridSize + gridSize / 2; enemy.health = 100 + (wave - 1) * 20; enemy.maxHealth = enemy.health; enemy.speed = 1.5 + (wave - 1) * 0.2; enemy.reward = 10 + (wave - 1) * 2; enemies.push(enemy); game.addChild(enemy); enemiesSpawned++; } function getGridPosition(x, y) { var gridX = Math.floor(x / gridSize); var gridY = Math.floor(y / gridSize); if (gridX >= 0 && gridX < mapWidth && gridY >= 0 && gridY < mapHeight) { return { x: gridX, y: gridY }; } return null; } function canPlaceTower(gridX, gridY) { return !grid[gridX][gridY].occupied && !grid[gridX][gridY].isPath; } function placeTower(gridX, gridY) { if (!canPlaceTower(gridX, gridY) || currency < 50) return false; var tower = new Tower(); tower.x = gridX * gridSize + gridSize / 2; tower.y = gridY * gridSize + gridSize / 2; towers.push(tower); game.addChild(tower); grid[gridX][gridY].occupied = true; currency -= tower.cost; placingTower = false; updateUI(); return true; } function startWave() { if (waveActive) return; waveActive = true; enemiesSpawned = 0; enemiesInWave = 5 + wave * 2; startWaveBtn.setText('Wave Active'); startWaveBtn.tint = 0x666666; } function checkWaveComplete() { if (!waveActive) return; var allEnemiesGone = true; for (var i = 0; i < enemies.length; i++) { if (!enemies[i].isDead && !enemies[i].reachedBase) { allEnemiesGone = false; break; } } if (enemiesSpawned >= enemiesInWave && allEnemiesGone) { waveActive = false; wave++; currency += 25; startWaveBtn.setText('Start Wave'); startWaveBtn.tint = 0x00FF00; updateUI(); // Clean up dead enemies for (var i = enemies.length - 1; i >= 0; i--) { if (enemies[i].isDead || enemies[i].reachedBase) { enemies[i].destroy(); enemies.splice(i, 1); } } } } // Initialize game initializeGrid(); createPath(); drawMap(); drawBase(); updateUI(); // Event handlers startWaveBtn.down = function () { startWave(); }; buyTowerBtn.down = function () { if (currency >= 50) { placingTower = true; for (var i = 0; i < towers.length; i++) { towers[i].hideRange(); } } }; game.down = function (x, y, obj) { if (placingTower) { var gridPos = getGridPosition(x, y); if (gridPos) { placeTower(gridPos.x, gridPos.y); } } }; // Main game loop game.update = function () { if (lives <= 0 && !gameOver) { gameOver = true; LK.showGameOver(); return; } if (wave > 20) { LK.showYouWin(); return; } // Spawn enemies during wave if (waveActive && LK.ticks % 90 === 0) { spawnEnemy(); } // Clean up bullets that hit targets for (var i = bullets.length - 1; i >= 0; i--) { var bullet = bullets[i]; if (bullet.hasHit || !bullet.target || bullet.target.isDead) { bullet.destroy(); bullets.splice(i, 1); } } checkWaveComplete(); };
===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,407 @@
-/****
+/****
+* 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.damage = 25;
+ self.target = null;
+ self.hasHit = false;
+ self.update = function () {
+ if (!self.target || self.hasHit) 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) {
+ self.target.takeDamage(self.damage);
+ self.hasHit = true;
+ LK.getSound('enemyHit').play();
+ return;
+ }
+ var moveX = dx / distance * self.speed;
+ var moveY = dy / distance * self.speed;
+ self.x += moveX;
+ self.y += moveY;
+ };
+ return self;
+});
+var Enemy = Container.expand(function () {
+ var self = Container.call(this);
+ var enemyGraphics = self.attachAsset('enemy', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.maxHealth = 100;
+ self.health = self.maxHealth;
+ self.speed = 2;
+ self.reward = 10;
+ self.pathIndex = 0;
+ self.isDead = false;
+ self.reachedBase = false;
+ self.takeDamage = function (damage) {
+ self.health -= damage;
+ if (self.health <= 0 && !self.isDead) {
+ self.isDead = true;
+ LK.getSound('enemyDeath').play();
+ currency += self.reward;
+ updateUI();
+ }
+ };
+ self.update = function () {
+ if (self.isDead || self.reachedBase) return;
+ if (self.pathIndex < enemyPath.length) {
+ var target = enemyPath[self.pathIndex];
+ var dx = target.x - self.x;
+ var dy = target.y - self.y;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ if (distance < 20) {
+ self.pathIndex++;
+ if (self.pathIndex >= enemyPath.length) {
+ self.reachedBase = true;
+ lives--;
+ updateUI();
+ return;
+ }
+ }
+ var moveX = dx / distance * self.speed;
+ var moveY = dy / distance * self.speed;
+ self.x += moveX;
+ self.y += moveY;
+ }
+ };
+ 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.damage = 25;
+ self.fireRate = 60;
+ self.lastFire = 0;
+ self.cost = 50;
+ self.level = 1;
+ self.showingRange = false;
+ var rangeIndicator = self.attachAsset('towerRange', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ alpha: 0.3
+ });
+ rangeIndicator.width = self.range * 2;
+ rangeIndicator.height = self.range * 2;
+ rangeIndicator.visible = false;
+ self.showRange = function () {
+ rangeIndicator.visible = true;
+ self.showingRange = true;
+ };
+ self.hideRange = function () {
+ rangeIndicator.visible = false;
+ self.showingRange = false;
+ };
+ self.findTarget = function () {
+ var closestEnemy = null;
+ var closestDistance = Infinity;
+ for (var i = 0; i < enemies.length; i++) {
+ var enemy = enemies[i];
+ if (enemy.isDead || enemy.reachedBase) continue;
+ var dx = enemy.x - self.x;
+ var dy = enemy.y - self.y;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ if (distance <= self.range && distance < closestDistance) {
+ closestDistance = distance;
+ closestEnemy = enemy;
+ }
+ }
+ return closestEnemy;
+ };
+ self.fire = function (target) {
+ if (LK.ticks - self.lastFire < self.fireRate) return;
+ var bullet = new Bullet();
+ bullet.x = self.x;
+ bullet.y = self.y;
+ bullet.target = target;
+ bullet.damage = self.damage;
+ bullets.push(bullet);
+ game.addChild(bullet);
+ self.lastFire = LK.ticks;
+ LK.getSound('shoot').play();
+ };
+ self.down = function (x, y, obj) {
+ if (self.showingRange) {
+ self.hideRange();
+ } else {
+ self.showRange();
+ }
+ };
+ self.update = function () {
+ var target = self.findTarget();
+ if (target) {
+ self.fire(target);
+ }
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x87CEEB
+});
+
+/****
+* Game Code
+****/
+var gridSize = 100;
+var mapWidth = 20;
+var mapHeight = 25;
+var currency = 100;
+var lives = 20;
+var wave = 1;
+var enemiesInWave = 5;
+var enemiesSpawned = 0;
+var waveActive = false;
+var gameOver = false;
+var towers = [];
+var enemies = [];
+var bullets = [];
+var grid = [];
+var enemyPath = [];
+var selectedTower = null;
+var placingTower = false;
+// Create UI elements
+var currencyTxt = new Text2('Gold: 100', {
+ size: 60,
+ fill: 0xFFD700
+});
+currencyTxt.anchor.set(0, 0);
+currencyTxt.x = 120;
+currencyTxt.y = 20;
+LK.gui.topLeft.addChild(currencyTxt);
+var livesTxt = new Text2('Lives: 20', {
+ size: 60,
+ fill: 0xFF0000
+});
+livesTxt.anchor.set(0.5, 0);
+LK.gui.top.addChild(livesTxt);
+var waveTxt = new Text2('Wave: 1', {
+ size: 60,
+ fill: 0xFFFFFF
+});
+waveTxt.anchor.set(1, 0);
+LK.gui.topRight.addChild(waveTxt);
+var startWaveBtn = new Text2('Start Wave', {
+ size: 80,
+ fill: 0x00FF00
+});
+startWaveBtn.anchor.set(0.5, 1);
+startWaveBtn.y = -20;
+LK.gui.bottom.addChild(startWaveBtn);
+var buyTowerBtn = new Text2('Buy Tower (50g)', {
+ size: 70,
+ fill: 0x4A90E2
+});
+buyTowerBtn.anchor.set(0, 1);
+buyTowerBtn.x = 20;
+buyTowerBtn.y = -20;
+LK.gui.bottomLeft.addChild(buyTowerBtn);
+function updateUI() {
+ currencyTxt.setText('Gold: ' + currency);
+ livesTxt.setText('Lives: ' + lives);
+ waveTxt.setText('Wave: ' + wave);
+ if (currency >= 50) {
+ buyTowerBtn.tint = 0x4A90E2;
+ } else {
+ buyTowerBtn.tint = 0x666666;
+ }
+}
+function initializeGrid() {
+ for (var x = 0; x < mapWidth; x++) {
+ grid[x] = [];
+ for (var y = 0; y < mapHeight; y++) {
+ grid[x][y] = {
+ x: x * gridSize + gridSize / 2,
+ y: y * gridSize + gridSize / 2,
+ occupied: false,
+ isPath: false
+ };
+ }
+ }
+}
+function createPath() {
+ enemyPath = [];
+ var startX = 0;
+ var startY = Math.floor(mapHeight / 2);
+ var endX = mapWidth - 1;
+ var endY = Math.floor(mapHeight / 2);
+ for (var x = startX; x <= endX; x++) {
+ grid[x][startY].isPath = true;
+ enemyPath.push({
+ x: x * gridSize + gridSize / 2,
+ y: startY * gridSize + gridSize / 2
+ });
+ }
+}
+function drawMap() {
+ for (var x = 0; x < mapWidth; x++) {
+ for (var y = 0; y < mapHeight; y++) {
+ var tile;
+ if (grid[x][y].isPath) {
+ tile = LK.getAsset('pathTile', {
+ x: x * gridSize,
+ y: y * gridSize
+ });
+ } else {
+ tile = LK.getAsset('grassTile', {
+ x: x * gridSize,
+ y: y * gridSize
+ });
+ }
+ game.addChild(tile);
+ }
+ }
+}
+function drawBase() {
+ var base = LK.getAsset('base', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: (mapWidth - 1) * gridSize + gridSize / 2,
+ y: Math.floor(mapHeight / 2) * gridSize + gridSize / 2
+ });
+ game.addChild(base);
+}
+function spawnEnemy() {
+ if (enemiesSpawned >= enemiesInWave) return;
+ var enemy = new Enemy();
+ enemy.x = gridSize / 2;
+ enemy.y = Math.floor(mapHeight / 2) * gridSize + gridSize / 2;
+ enemy.health = 100 + (wave - 1) * 20;
+ enemy.maxHealth = enemy.health;
+ enemy.speed = 1.5 + (wave - 1) * 0.2;
+ enemy.reward = 10 + (wave - 1) * 2;
+ enemies.push(enemy);
+ game.addChild(enemy);
+ enemiesSpawned++;
+}
+function getGridPosition(x, y) {
+ var gridX = Math.floor(x / gridSize);
+ var gridY = Math.floor(y / gridSize);
+ if (gridX >= 0 && gridX < mapWidth && gridY >= 0 && gridY < mapHeight) {
+ return {
+ x: gridX,
+ y: gridY
+ };
+ }
+ return null;
+}
+function canPlaceTower(gridX, gridY) {
+ return !grid[gridX][gridY].occupied && !grid[gridX][gridY].isPath;
+}
+function placeTower(gridX, gridY) {
+ if (!canPlaceTower(gridX, gridY) || currency < 50) return false;
+ var tower = new Tower();
+ tower.x = gridX * gridSize + gridSize / 2;
+ tower.y = gridY * gridSize + gridSize / 2;
+ towers.push(tower);
+ game.addChild(tower);
+ grid[gridX][gridY].occupied = true;
+ currency -= tower.cost;
+ placingTower = false;
+ updateUI();
+ return true;
+}
+function startWave() {
+ if (waveActive) return;
+ waveActive = true;
+ enemiesSpawned = 0;
+ enemiesInWave = 5 + wave * 2;
+ startWaveBtn.setText('Wave Active');
+ startWaveBtn.tint = 0x666666;
+}
+function checkWaveComplete() {
+ if (!waveActive) return;
+ var allEnemiesGone = true;
+ for (var i = 0; i < enemies.length; i++) {
+ if (!enemies[i].isDead && !enemies[i].reachedBase) {
+ allEnemiesGone = false;
+ break;
+ }
+ }
+ if (enemiesSpawned >= enemiesInWave && allEnemiesGone) {
+ waveActive = false;
+ wave++;
+ currency += 25;
+ startWaveBtn.setText('Start Wave');
+ startWaveBtn.tint = 0x00FF00;
+ updateUI();
+ // Clean up dead enemies
+ for (var i = enemies.length - 1; i >= 0; i--) {
+ if (enemies[i].isDead || enemies[i].reachedBase) {
+ enemies[i].destroy();
+ enemies.splice(i, 1);
+ }
+ }
+ }
+}
+// Initialize game
+initializeGrid();
+createPath();
+drawMap();
+drawBase();
+updateUI();
+// Event handlers
+startWaveBtn.down = function () {
+ startWave();
+};
+buyTowerBtn.down = function () {
+ if (currency >= 50) {
+ placingTower = true;
+ for (var i = 0; i < towers.length; i++) {
+ towers[i].hideRange();
+ }
+ }
+};
+game.down = function (x, y, obj) {
+ if (placingTower) {
+ var gridPos = getGridPosition(x, y);
+ if (gridPos) {
+ placeTower(gridPos.x, gridPos.y);
+ }
+ }
+};
+// Main game loop
+game.update = function () {
+ if (lives <= 0 && !gameOver) {
+ gameOver = true;
+ LK.showGameOver();
+ return;
+ }
+ if (wave > 20) {
+ LK.showYouWin();
+ return;
+ }
+ // Spawn enemies during wave
+ if (waveActive && LK.ticks % 90 === 0) {
+ spawnEnemy();
+ }
+ // Clean up bullets that hit targets
+ for (var i = bullets.length - 1; i >= 0; i--) {
+ var bullet = bullets[i];
+ if (bullet.hasHit || !bullet.target || bullet.target.isDead) {
+ bullet.destroy();
+ bullets.splice(i, 1);
+ }
+ }
+ checkWaveComplete();
+};
\ No newline at end of file