User prompt
askeri kuleden 10 saniyede bir 2 adet asker çıksın
User prompt
start tuşunu ortala
User prompt
assets lerdeki start tuşunu oyundakiyle değiştir
User prompt
start tuşu ekle
User prompt
dümanlar belirli bir yol üzerinden gelmesin rasgele saldırsın
Code edit (1 edits merged)
Please save this source code
User prompt
Medieval Tower Defense: Castle Guardian
Initial prompt
ateş edebildiğimiz orta çağ kule savunma oyunu 4 adet kulu olucak kule1: okçu kulesi kule2:topçu kule kule3:büyücü kulesi kule4:askeri kule kulelerin özelikleri okçu kulesi:ok atar topçu kulesi:top atar büyücü kulesi:düşmanları yavaşlatır ve üstüne yıldırım atar askeri kule:her 10 seniyede bir 50 canı olan 2 asker spawnlar artı olarak 10 adet düşman ekle 1 tanesi boss olsun ana kuleyi koruyalım
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var Castle = Container.expand(function () { var self = Container.call(this); var graphics = self.attachAsset('castle', { anchorX: 0.5, anchorY: 0.5 }); self.maxHealth = 100; self.health = self.maxHealth; self.takeDamage = function (damage) { self.health -= damage; LK.effects.flashObject(self, 0xFF0000, 300); if (self.health <= 0) { LK.showGameOver(); } }; return self; }); var Enemy = Container.expand(function (type) { var self = Container.call(this); self.type = type; self.maxHealth = 30; self.health = self.maxHealth; self.speed = 2; self.damage = 10; self.reward = 5; self.slowTime = 0; self.baseSpeed = 2; var assetName = 'basicEnemy'; if (type === 'fast') { assetName = 'fastEnemy'; self.speed = 4; self.baseSpeed = 4; self.health = 20; self.maxHealth = 20; } else if (type === 'heavy') { assetName = 'heavyEnemy'; self.speed = 1; self.baseSpeed = 1; self.health = 80; self.maxHealth = 80; self.damage = 25; self.reward = 15; } else if (type === 'boss') { assetName = 'bossEnemy'; self.speed = 1.5; self.baseSpeed = 1.5; self.health = 300; self.maxHealth = 300; self.damage = 50; self.reward = 100; } var graphics = self.attachAsset(assetName, { anchorX: 0.5, anchorY: 0.5 }); self.pathIndex = 0; self.destroyed = false; self.takeDamage = function (damage) { self.health -= damage; LK.effects.flashObject(self, 0xFFFFFF, 200); if (self.health <= 0) { resources += self.reward; LK.getSound('death').play(); self.destroyed = true; self.destroy(); } else { LK.getSound('hit').play(); } }; self.slow = function (duration) { self.slowTime = duration; self.speed = self.baseSpeed * 0.3; }; self.update = function () { if (self.slowTime > 0) { self.slowTime--; if (self.slowTime === 0) { self.speed = self.baseSpeed; } } if (self.pathIndex < path.length) { var target = path[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 >= path.length) { castle.takeDamage(self.damage); self.destroyed = true; self.destroy(); } } else { self.x += dx / distance * self.speed; self.y += dy / distance * self.speed; } } }; return self; }); var Lightning = Container.expand(function () { var self = Container.call(this); var graphics = self.attachAsset('lightning', { anchorX: 0.5, anchorY: 0.5 }); self.damage = 20; self.life = 30; self.update = function () { self.life--; if (self.life <= 0) { if (self.target && !self.target.destroyed) { self.target.takeDamage(self.damage); } self.destroy(); } }; return self; }); var Projectile = Container.expand(function (type, target) { var self = Container.call(this); self.type = type; self.target = target; self.speed = 8; self.damage = 15; var assetName = 'arrow'; if (type === 'cannon') { assetName = 'cannonball'; self.damage = 40; self.speed = 6; } var graphics = self.attachAsset(assetName, { anchorX: 0.5, anchorY: 0.5 }); self.update = function () { if (!self.target || self.target.destroyed) { self.destroy(); 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.destroy(); return; } self.x += dx / distance * self.speed; self.y += dy / distance * self.speed; }; return self; }); var Soldier = Container.expand(function () { var self = Container.call(this); var graphics = self.attachAsset('soldier', { anchorX: 0.5, anchorY: 0.5 }); self.health = 50; self.speed = 3; self.damage = 8; self.range = 40; self.lastAttack = 0; self.attackRate = 60; self.findTarget = function () { for (var i = 0; i < enemies.length; i++) { var enemy = enemies[i]; var dx = enemy.x - self.x; var dy = enemy.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance <= self.range) { return enemy; } } return null; }; self.attack = function (target) { if (LK.ticks - self.lastAttack >= self.attackRate) { self.lastAttack = LK.ticks; target.takeDamage(self.damage); } }; self.update = function () { var target = self.findTarget(); if (target) { self.attack(target); } else if (enemies.length > 0) { var nearest = enemies[0]; var minDistance = Infinity; for (var i = 0; i < enemies.length; i++) { var enemy = enemies[i]; var dx = enemy.x - self.x; var dy = enemy.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < minDistance) { minDistance = distance; nearest = enemy; } } if (nearest) { var dx = nearest.x - self.x; var dy = nearest.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); self.x += dx / distance * self.speed; self.y += dy / distance * self.speed; } } }; return self; }); var Tower = Container.expand(function (type) { var self = Container.call(this); var graphics = self.attachAsset(type + 'Tower', { anchorX: 0.5, anchorY: 0.5 }); self.type = type; self.range = 150; self.damage = 10; self.fireRate = 60; // ticks between shots self.lastShot = 0; self.cost = 20; if (type === 'archer') { self.damage = 15; self.fireRate = 30; } else if (type === 'cannon') { self.damage = 40; self.fireRate = 90; self.range = 120; } else if (type === 'wizard') { self.damage = 20; self.fireRate = 45; self.range = 180; } else if (type === 'military') { self.damage = 0; self.fireRate = 600; // 10 seconds self.range = 100; } self.canShoot = function () { return LK.ticks - self.lastShot >= self.fireRate; }; self.findTarget = function () { for (var i = 0; i < enemies.length; i++) { var enemy = enemies[i]; var dx = enemy.x - self.x; var dy = enemy.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance <= self.range) { return enemy; } } return null; }; self.shoot = function (target) { if (!self.canShoot()) return; self.lastShot = LK.ticks; if (self.type === 'military') { var soldier = new Soldier(); soldier.x = self.x; soldier.y = self.y; soldiers.push(soldier); game.addChild(soldier); } else if (self.type === 'wizard') { target.slow(180); // 3 seconds var lightning = new Lightning(); lightning.x = target.x; lightning.y = target.y; lightning.target = target; projectiles.push(lightning); game.addChild(lightning); } else { var projectile = new Projectile(self.type, target); projectile.x = self.x; projectile.y = self.y; projectiles.push(projectile); game.addChild(projectile); } LK.getSound('shoot').play(); }; self.update = function () { var target = self.findTarget(); if (target) { self.shoot(target); } }; return self; }); var TowerButton = Container.expand(function (type, x, y) { var self = Container.call(this); var graphics = self.attachAsset('towerButton', { anchorX: 0.5, anchorY: 0.5 }); self.type = type; self.x = x; self.y = y; var label = new Text2(type.charAt(0).toUpperCase() + type.slice(1), { size: 30, fill: 0xFFFFFF }); label.anchor.set(0.5, 0.5); self.addChild(label); self.down = function (x, y, obj) { selectedTowerType = self.type; placingTower = true; }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x228B22 }); /**** * Game Code ****/ // Sounds // UI // Soldiers // Enemies // Projectiles // Castle and towers // Game variables var castle; var towers = []; var enemies = []; var soldiers = []; var projectiles = []; var resources = 100; var currentWave = 1; var maxWaves = 5; var enemiesSpawned = 0; var enemiesPerWave = 8; var waveTimer = 0; var selectedTowerType = null; var placingTower = false; // Path for enemies var path = [{ x: 100, y: 100 }, { x: 400, y: 100 }, { x: 400, y: 400 }, { x: 800, y: 400 }, { x: 800, y: 800 }, { x: 1200, y: 800 }, { x: 1200, y: 1200 }, { x: 1600, y: 1200 }, { x: 1600, y: 1600 }, { x: 1024, y: 1600 }]; // Create castle castle = new Castle(); castle.x = 1024; castle.y = 1600; game.addChild(castle); // Create UI var resourcesText = new Text2('Resources: ' + resources, { size: 60, fill: 0xFFFFFF }); resourcesText.anchor.set(0, 0); LK.gui.topLeft.addChild(resourcesText); var waveText = new Text2('Wave: ' + currentWave, { size: 60, fill: 0xFFFFFF }); waveText.anchor.set(1, 0); LK.gui.topRight.addChild(waveText); // Create tower buttons var towerButtons = []; var buttonTypes = ['archer', 'cannon', 'wizard', 'military']; for (var i = 0; i < buttonTypes.length; i++) { var button = new TowerButton(buttonTypes[i], 200 + i * 140, 2600); towerButtons.push(button); game.addChild(button); } // Helper functions function spawnEnemy() { var enemyType = 'basic'; if (currentWave === maxWaves) { enemyType = 'boss'; } else if (Math.random() < 0.3) { enemyType = 'fast'; } else if (Math.random() < 0.2) { enemyType = 'heavy'; } var enemy = new Enemy(enemyType); enemy.x = path[0].x; enemy.y = path[0].y; enemies.push(enemy); game.addChild(enemy); enemiesSpawned++; } function canPlaceTower(x, y) { // Check if position is on path for (var i = 0; i < path.length; i++) { var pathPoint = path[i]; var dx = pathPoint.x - x; var dy = pathPoint.y - y; if (Math.sqrt(dx * dx + dy * dy) < 100) { return false; } } // Check if position is too close to other towers for (var i = 0; i < towers.length; i++) { var tower = towers[i]; var dx = tower.x - x; var dy = tower.y - y; if (Math.sqrt(dx * dx + dy * dy) < 120) { return false; } } // Check if position is too close to castle var dx = castle.x - x; var dy = castle.y - y; if (Math.sqrt(dx * dx + dy * dy) < 150) { return false; } return true; } function placeTower(x, y) { if (!selectedTowerType || resources < 20) return; if (canPlaceTower(x, y)) { var tower = new Tower(selectedTowerType); tower.x = x; tower.y = y; towers.push(tower); game.addChild(tower); resources -= tower.cost; resourcesText.setText('Resources: ' + resources); placingTower = false; selectedTowerType = null; } } // Game events game.down = function (x, y, obj) { if (placingTower) { placeTower(x, y); } }; // Main game loop game.update = function () { // Update UI resourcesText.setText('Resources: ' + resources); waveText.setText('Wave: ' + currentWave); // Spawn enemies if (enemiesSpawned < enemiesPerWave && waveTimer <= 0) { spawnEnemy(); waveTimer = 60; // 1 second between spawns } if (waveTimer > 0) { waveTimer--; } // Check wave completion if (enemiesSpawned >= enemiesPerWave && enemies.length === 0) { currentWave++; if (currentWave > maxWaves) { LK.showYouWin(); } else { enemiesSpawned = 0; enemiesPerWave += 2; waveTimer = 180; // 3 seconds between waves } } // Clean up destroyed objects for (var i = enemies.length - 1; i >= 0; i--) { if (enemies[i].destroyed) { enemies.splice(i, 1); } } for (var i = projectiles.length - 1; i >= 0; i--) { if (projectiles[i].destroyed) { projectiles.splice(i, 1); } } for (var i = soldiers.length - 1; i >= 0; i--) { if (soldiers[i].destroyed) { soldiers.splice(i, 1); } } };
===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,511 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+
+/****
+* Classes
+****/
+var Castle = Container.expand(function () {
+ var self = Container.call(this);
+ var graphics = self.attachAsset('castle', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.maxHealth = 100;
+ self.health = self.maxHealth;
+ self.takeDamage = function (damage) {
+ self.health -= damage;
+ LK.effects.flashObject(self, 0xFF0000, 300);
+ if (self.health <= 0) {
+ LK.showGameOver();
+ }
+ };
+ return self;
+});
+var Enemy = Container.expand(function (type) {
+ var self = Container.call(this);
+ self.type = type;
+ self.maxHealth = 30;
+ self.health = self.maxHealth;
+ self.speed = 2;
+ self.damage = 10;
+ self.reward = 5;
+ self.slowTime = 0;
+ self.baseSpeed = 2;
+ var assetName = 'basicEnemy';
+ if (type === 'fast') {
+ assetName = 'fastEnemy';
+ self.speed = 4;
+ self.baseSpeed = 4;
+ self.health = 20;
+ self.maxHealth = 20;
+ } else if (type === 'heavy') {
+ assetName = 'heavyEnemy';
+ self.speed = 1;
+ self.baseSpeed = 1;
+ self.health = 80;
+ self.maxHealth = 80;
+ self.damage = 25;
+ self.reward = 15;
+ } else if (type === 'boss') {
+ assetName = 'bossEnemy';
+ self.speed = 1.5;
+ self.baseSpeed = 1.5;
+ self.health = 300;
+ self.maxHealth = 300;
+ self.damage = 50;
+ self.reward = 100;
+ }
+ var graphics = self.attachAsset(assetName, {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.pathIndex = 0;
+ self.destroyed = false;
+ self.takeDamage = function (damage) {
+ self.health -= damage;
+ LK.effects.flashObject(self, 0xFFFFFF, 200);
+ if (self.health <= 0) {
+ resources += self.reward;
+ LK.getSound('death').play();
+ self.destroyed = true;
+ self.destroy();
+ } else {
+ LK.getSound('hit').play();
+ }
+ };
+ self.slow = function (duration) {
+ self.slowTime = duration;
+ self.speed = self.baseSpeed * 0.3;
+ };
+ self.update = function () {
+ if (self.slowTime > 0) {
+ self.slowTime--;
+ if (self.slowTime === 0) {
+ self.speed = self.baseSpeed;
+ }
+ }
+ if (self.pathIndex < path.length) {
+ var target = path[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 >= path.length) {
+ castle.takeDamage(self.damage);
+ self.destroyed = true;
+ self.destroy();
+ }
+ } else {
+ self.x += dx / distance * self.speed;
+ self.y += dy / distance * self.speed;
+ }
+ }
+ };
+ return self;
+});
+var Lightning = Container.expand(function () {
+ var self = Container.call(this);
+ var graphics = self.attachAsset('lightning', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.damage = 20;
+ self.life = 30;
+ self.update = function () {
+ self.life--;
+ if (self.life <= 0) {
+ if (self.target && !self.target.destroyed) {
+ self.target.takeDamage(self.damage);
+ }
+ self.destroy();
+ }
+ };
+ return self;
+});
+var Projectile = Container.expand(function (type, target) {
+ var self = Container.call(this);
+ self.type = type;
+ self.target = target;
+ self.speed = 8;
+ self.damage = 15;
+ var assetName = 'arrow';
+ if (type === 'cannon') {
+ assetName = 'cannonball';
+ self.damage = 40;
+ self.speed = 6;
+ }
+ var graphics = self.attachAsset(assetName, {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.update = function () {
+ if (!self.target || self.target.destroyed) {
+ self.destroy();
+ 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.destroy();
+ return;
+ }
+ self.x += dx / distance * self.speed;
+ self.y += dy / distance * self.speed;
+ };
+ return self;
+});
+var Soldier = Container.expand(function () {
+ var self = Container.call(this);
+ var graphics = self.attachAsset('soldier', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.health = 50;
+ self.speed = 3;
+ self.damage = 8;
+ self.range = 40;
+ self.lastAttack = 0;
+ self.attackRate = 60;
+ self.findTarget = function () {
+ for (var i = 0; i < enemies.length; i++) {
+ var enemy = enemies[i];
+ var dx = enemy.x - self.x;
+ var dy = enemy.y - self.y;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ if (distance <= self.range) {
+ return enemy;
+ }
+ }
+ return null;
+ };
+ self.attack = function (target) {
+ if (LK.ticks - self.lastAttack >= self.attackRate) {
+ self.lastAttack = LK.ticks;
+ target.takeDamage(self.damage);
+ }
+ };
+ self.update = function () {
+ var target = self.findTarget();
+ if (target) {
+ self.attack(target);
+ } else if (enemies.length > 0) {
+ var nearest = enemies[0];
+ var minDistance = Infinity;
+ for (var i = 0; i < enemies.length; i++) {
+ var enemy = enemies[i];
+ var dx = enemy.x - self.x;
+ var dy = enemy.y - self.y;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ if (distance < minDistance) {
+ minDistance = distance;
+ nearest = enemy;
+ }
+ }
+ if (nearest) {
+ var dx = nearest.x - self.x;
+ var dy = nearest.y - self.y;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ self.x += dx / distance * self.speed;
+ self.y += dy / distance * self.speed;
+ }
+ }
+ };
+ return self;
+});
+var Tower = Container.expand(function (type) {
+ var self = Container.call(this);
+ var graphics = self.attachAsset(type + 'Tower', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.type = type;
+ self.range = 150;
+ self.damage = 10;
+ self.fireRate = 60; // ticks between shots
+ self.lastShot = 0;
+ self.cost = 20;
+ if (type === 'archer') {
+ self.damage = 15;
+ self.fireRate = 30;
+ } else if (type === 'cannon') {
+ self.damage = 40;
+ self.fireRate = 90;
+ self.range = 120;
+ } else if (type === 'wizard') {
+ self.damage = 20;
+ self.fireRate = 45;
+ self.range = 180;
+ } else if (type === 'military') {
+ self.damage = 0;
+ self.fireRate = 600; // 10 seconds
+ self.range = 100;
+ }
+ self.canShoot = function () {
+ return LK.ticks - self.lastShot >= self.fireRate;
+ };
+ self.findTarget = function () {
+ for (var i = 0; i < enemies.length; i++) {
+ var enemy = enemies[i];
+ var dx = enemy.x - self.x;
+ var dy = enemy.y - self.y;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ if (distance <= self.range) {
+ return enemy;
+ }
+ }
+ return null;
+ };
+ self.shoot = function (target) {
+ if (!self.canShoot()) return;
+ self.lastShot = LK.ticks;
+ if (self.type === 'military') {
+ var soldier = new Soldier();
+ soldier.x = self.x;
+ soldier.y = self.y;
+ soldiers.push(soldier);
+ game.addChild(soldier);
+ } else if (self.type === 'wizard') {
+ target.slow(180); // 3 seconds
+ var lightning = new Lightning();
+ lightning.x = target.x;
+ lightning.y = target.y;
+ lightning.target = target;
+ projectiles.push(lightning);
+ game.addChild(lightning);
+ } else {
+ var projectile = new Projectile(self.type, target);
+ projectile.x = self.x;
+ projectile.y = self.y;
+ projectiles.push(projectile);
+ game.addChild(projectile);
+ }
+ LK.getSound('shoot').play();
+ };
+ self.update = function () {
+ var target = self.findTarget();
+ if (target) {
+ self.shoot(target);
+ }
+ };
+ return self;
+});
+var TowerButton = Container.expand(function (type, x, y) {
+ var self = Container.call(this);
+ var graphics = self.attachAsset('towerButton', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.type = type;
+ self.x = x;
+ self.y = y;
+ var label = new Text2(type.charAt(0).toUpperCase() + type.slice(1), {
+ size: 30,
+ fill: 0xFFFFFF
+ });
+ label.anchor.set(0.5, 0.5);
+ self.addChild(label);
+ self.down = function (x, y, obj) {
+ selectedTowerType = self.type;
+ placingTower = true;
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x228B22
+});
+
+/****
+* Game Code
+****/
+// Sounds
+// UI
+// Soldiers
+// Enemies
+// Projectiles
+// Castle and towers
+// Game variables
+var castle;
+var towers = [];
+var enemies = [];
+var soldiers = [];
+var projectiles = [];
+var resources = 100;
+var currentWave = 1;
+var maxWaves = 5;
+var enemiesSpawned = 0;
+var enemiesPerWave = 8;
+var waveTimer = 0;
+var selectedTowerType = null;
+var placingTower = false;
+// Path for enemies
+var path = [{
+ x: 100,
+ y: 100
+}, {
+ x: 400,
+ y: 100
+}, {
+ x: 400,
+ y: 400
+}, {
+ x: 800,
+ y: 400
+}, {
+ x: 800,
+ y: 800
+}, {
+ x: 1200,
+ y: 800
+}, {
+ x: 1200,
+ y: 1200
+}, {
+ x: 1600,
+ y: 1200
+}, {
+ x: 1600,
+ y: 1600
+}, {
+ x: 1024,
+ y: 1600
+}];
+// Create castle
+castle = new Castle();
+castle.x = 1024;
+castle.y = 1600;
+game.addChild(castle);
+// Create UI
+var resourcesText = new Text2('Resources: ' + resources, {
+ size: 60,
+ fill: 0xFFFFFF
+});
+resourcesText.anchor.set(0, 0);
+LK.gui.topLeft.addChild(resourcesText);
+var waveText = new Text2('Wave: ' + currentWave, {
+ size: 60,
+ fill: 0xFFFFFF
+});
+waveText.anchor.set(1, 0);
+LK.gui.topRight.addChild(waveText);
+// Create tower buttons
+var towerButtons = [];
+var buttonTypes = ['archer', 'cannon', 'wizard', 'military'];
+for (var i = 0; i < buttonTypes.length; i++) {
+ var button = new TowerButton(buttonTypes[i], 200 + i * 140, 2600);
+ towerButtons.push(button);
+ game.addChild(button);
+}
+// Helper functions
+function spawnEnemy() {
+ var enemyType = 'basic';
+ if (currentWave === maxWaves) {
+ enemyType = 'boss';
+ } else if (Math.random() < 0.3) {
+ enemyType = 'fast';
+ } else if (Math.random() < 0.2) {
+ enemyType = 'heavy';
+ }
+ var enemy = new Enemy(enemyType);
+ enemy.x = path[0].x;
+ enemy.y = path[0].y;
+ enemies.push(enemy);
+ game.addChild(enemy);
+ enemiesSpawned++;
+}
+function canPlaceTower(x, y) {
+ // Check if position is on path
+ for (var i = 0; i < path.length; i++) {
+ var pathPoint = path[i];
+ var dx = pathPoint.x - x;
+ var dy = pathPoint.y - y;
+ if (Math.sqrt(dx * dx + dy * dy) < 100) {
+ return false;
+ }
+ }
+ // Check if position is too close to other towers
+ for (var i = 0; i < towers.length; i++) {
+ var tower = towers[i];
+ var dx = tower.x - x;
+ var dy = tower.y - y;
+ if (Math.sqrt(dx * dx + dy * dy) < 120) {
+ return false;
+ }
+ }
+ // Check if position is too close to castle
+ var dx = castle.x - x;
+ var dy = castle.y - y;
+ if (Math.sqrt(dx * dx + dy * dy) < 150) {
+ return false;
+ }
+ return true;
+}
+function placeTower(x, y) {
+ if (!selectedTowerType || resources < 20) return;
+ if (canPlaceTower(x, y)) {
+ var tower = new Tower(selectedTowerType);
+ tower.x = x;
+ tower.y = y;
+ towers.push(tower);
+ game.addChild(tower);
+ resources -= tower.cost;
+ resourcesText.setText('Resources: ' + resources);
+ placingTower = false;
+ selectedTowerType = null;
+ }
+}
+// Game events
+game.down = function (x, y, obj) {
+ if (placingTower) {
+ placeTower(x, y);
+ }
+};
+// Main game loop
+game.update = function () {
+ // Update UI
+ resourcesText.setText('Resources: ' + resources);
+ waveText.setText('Wave: ' + currentWave);
+ // Spawn enemies
+ if (enemiesSpawned < enemiesPerWave && waveTimer <= 0) {
+ spawnEnemy();
+ waveTimer = 60; // 1 second between spawns
+ }
+ if (waveTimer > 0) {
+ waveTimer--;
+ }
+ // Check wave completion
+ if (enemiesSpawned >= enemiesPerWave && enemies.length === 0) {
+ currentWave++;
+ if (currentWave > maxWaves) {
+ LK.showYouWin();
+ } else {
+ enemiesSpawned = 0;
+ enemiesPerWave += 2;
+ waveTimer = 180; // 3 seconds between waves
+ }
+ }
+ // Clean up destroyed objects
+ for (var i = enemies.length - 1; i >= 0; i--) {
+ if (enemies[i].destroyed) {
+ enemies.splice(i, 1);
+ }
+ }
+ for (var i = projectiles.length - 1; i >= 0; i--) {
+ if (projectiles[i].destroyed) {
+ projectiles.splice(i, 1);
+ }
+ }
+ for (var i = soldiers.length - 1; i >= 0; i--) {
+ if (soldiers[i].destroyed) {
+ soldiers.splice(i, 1);
+ }
+ }
+};
\ No newline at end of file
pixel art okçu kulesi. In-Game asset. 2d. High contrast. No shadows
topçu kule pixel art. In-Game asset. 2d. High contrast. No shadows
gülle pixel art. In-Game asset. 2d. High contrast. No shadows
pixel art büyücü kulesi. In-Game asset. 2d. High contrast. No shadows
pixel art askari kule. In-Game asset. 2d. High contrast. No shadows
pixel art yıldırım. In-Game asset. 2d. High contrast. No shadows
arrow pixel art. In-Game asset. 2d. High contrast. No shadows
orta çağ pixel art asker. In-Game asset. 2d. High contrast. No shadows
orta çağ kale pixel art. In-Game asset. 2d. High contrast. No shadows
orta çağ düşman pixel art. In-Game asset. 2d. High contrast. No shadows
boss düşman altın zırh pixel art. In-Game asset. 2d. High contrast. No shadows
orta çağ hızlı düşman pixel art. In-Game asset. 2d. High contrast. No shadows
orta çağ ağır düşman pixel art. In-Game asset. 2d. High contrast. No shadows
orta çağ pixel art buton. In-Game asset. 2d. High contrast. No shadows
yazı olmadan
PİXEL ART ÇİMENLİK OVA. In-Game asset. 2d. High contrast. No shadows