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 = 1; self.damage = 10; self.reward = 5; self.slowTime = 0; self.baseSpeed = 1; var assetName = 'basicEnemy'; if (type === 'fast') { assetName = 'fastEnemy'; self.speed = 2; self.baseSpeed = 2; self.health = 20; self.maxHealth = 20; } else if (type === 'heavy') { assetName = 'heavyEnemy'; self.speed = 0.5; self.baseSpeed = 0.5; self.health = 80; self.maxHealth = 80; self.damage = 25; self.reward = 15; } else if (type === 'boss') { assetName = 'bossEnemy'; self.speed = 0.75; self.baseSpeed = 0.75; self.health = 300; self.maxHealth = 300; self.damage = 50; self.reward = 100; } var graphics = self.attachAsset(assetName, { anchorX: 0.5, anchorY: 0.5 }); 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; } } // Move directly towards castle var dx = castle.x - self.x; var dy = castle.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < 50) { 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; self.cost = 20; } else if (type === 'cannon') { self.damage = 40; self.fireRate = 90; self.range = 120; self.cost = 40; } else if (type === 'wizard') { self.damage = 20; self.fireRate = 45; self.range = 180; self.cost = 60; } else if (type === 'military') { self.damage = 0; self.fireRate = 600; // 10 seconds self.range = 100; self.cost = 80; } 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') { // Spawn 2 soldiers every 10 seconds for (var i = 0; i < 2; i++) { var soldier = new Soldier(); soldier.x = self.x + (i * 40 - 20); // Spread soldiers slightly apart 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 towerCosts = { archer: 20, cannon: 40, wizard: 60, military: 80 }; var label = new Text2(type.charAt(0).toUpperCase() + type.slice(1), { size: 25, fill: 0xFFFFFF }); label.anchor.set(0.5, 0.3); self.addChild(label); var costLabel = new Text2(towerCosts[type] + ' coins', { size: 20, fill: 0xFFFF00 }); costLabel.anchor.set(0.5, 0.5); costLabel.y = -50; self.addChild(costLabel); 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 // Import tween plugin for animations 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; var gameStarted = false; var startButton; var planningTime = 15; // 15 seconds for planning var planningTimer = 0; var planningActive = false; var countdownText; // 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 }]; // Add medieval battlefield background var background = LK.getAsset('medievalBattlefield', { anchorX: 0, anchorY: 0, x: 0, y: 0 }); game.addChild(background); // 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 countdown text countdownText = new Text2('', { size: 120, fill: 0xFF0000 }); countdownText.anchor.set(0.5, 0.5); countdownText.x = 2048 / 2; countdownText.y = 400; countdownText.visible = false; game.addChild(countdownText); // Create how to play button var howToPlayButton = new Container(); var howToPlayBg = new Text2('How to Play?', { size: 40, fill: 0xFFFFFF }); howToPlayBg.anchor.set(1, 0); howToPlayButton.addChild(howToPlayBg); howToPlayButton.x = -10; howToPlayButton.y = 80; LK.gui.topRight.addChild(howToPlayButton); // Create start button startButton = new Container(); var startButtonBg = LK.getAsset('start', { anchorX: 0.5, anchorY: 0.5, scaleX: 2, scaleY: 2 }); startButton.addChild(startButtonBg); startButton.x = 2048 / 2; startButton.y = 2732 / 2; game.addChild(startButton); // Create tower buttons (initially hidden) var towerButtons = []; var buttonTypes = ['archer', 'cannon', 'wizard', 'military']; var towerCosts = [20, 40, 60, 80]; var buttonSpacing = 450; var totalWidth = (buttonTypes.length - 1) * buttonSpacing; var startX = (2048 - totalWidth) / 2; for (var i = 0; i < buttonTypes.length; i++) { var button = new TowerButton(buttonTypes[i], startX + i * buttonSpacing, 2600); button.scaleX = 2.5; button.scaleY = 2.5; button.visible = false; 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'; } // For Wave 5 (boss wave), spawn 2 bosses if (currentWave === maxWaves) { for (var j = 0; j < 2; j++) { var enemy = new Enemy(enemyType); // Spawn only from non-blue areas (exclude top and right edges which are blue/water areas) var side = Math.floor(Math.random() * 2); // Only 2 sides now (bottom and left) if (side === 0) { // Bottom edge (land area) enemy.x = Math.random() * 2048; enemy.y = 2732; } else { // Left edge (land area) enemy.x = 0; enemy.y = Math.random() * 2732; } enemies.push(enemy); game.addChild(enemy); } enemiesSpawned += 2; // Increment by 2 for boss wave } else { var enemy = new Enemy(enemyType); // Spawn only from non-blue areas (exclude top and right edges which are blue/water areas) var side = Math.floor(Math.random() * 2); // Only 2 sides now (bottom and left) if (side === 0) { // Bottom edge (land area) enemy.x = Math.random() * 2048; enemy.y = 2732; } else { // Left edge (land area) enemy.x = 0; enemy.y = Math.random() * 2732; } enemies.push(enemy); game.addChild(enemy); enemiesSpawned++; } } function canPlaceTower(x, y) { // 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) { return; } var towerCosts = { archer: 20, cannon: 40, wizard: 60, military: 80 }; if (resources < towerCosts[selectedTowerType]) { 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; } } // Start button click handler startButton.down = function (x, y, obj) { if (!gameStarted) { gameStarted = true; startButton.visible = false; // Show tower buttons for (var i = 0; i < towerButtons.length; i++) { towerButtons[i].visible = true; } // Place initial towers var archerTower = new Tower('archer'); archerTower.x = 800; archerTower.y = 1200; towers.push(archerTower); game.addChild(archerTower); var cannonTower = new Tower('cannon'); cannonTower.x = 1200; cannonTower.y = 1000; towers.push(cannonTower); game.addChild(cannonTower); // Start background music LK.playMusic('ortacagmuzik'); // Start planning phase planningActive = true; planningTimer = planningTime * 60; // Convert to ticks (60 FPS) countdownText.visible = true; } }; // How to play button click handler howToPlayButton.down = function (x, y, obj) { // Create background panel for instructions var instructionsPanel = new Container(); var panelBg = LK.getAsset('howToPlayBackground', { anchorX: 0.5, anchorY: 0.5, scaleX: 6, scaleY: 4 }); instructionsPanel.addChild(panelBg); instructionsPanel.x = 2048 / 2; instructionsPanel.y = 2732 / 2; game.addChild(instructionsPanel); // Show instructions (you can customize this message) var instructionsText = new Text2('Build towers to stop enemies!\n\nTower types:\n• Archer: Fast fire\n• Cannon: High damage\n• Wizard: Slows enemies\n• Military: Spawns soldiers\n\nProtect the castle!', { size: 70, fill: 0x000000, align: 'center' }); instructionsText.anchor.set(0.5, 0.5); instructionsPanel.addChild(instructionsText); // Remove instructions after 5 seconds LK.setTimeout(function () { if (instructionsPanel.parent) { instructionsPanel.destroy(); } }, 5000); }; // Game events game.down = function (x, y, obj) { if (placingTower && gameStarted) { placeTower(x, y); } }; // Main game loop game.update = function () { // Only run game logic if game has started if (!gameStarted) { return; } // Handle planning phase countdown if (planningActive) { planningTimer--; var secondsLeft = Math.ceil(planningTimer / 60); if (secondsLeft > 0) { countdownText.setText('Planning Time: ' + secondsLeft); // Add pulsing animation to countdown text if (planningTimer % 60 === 0) { // Every second tween(countdownText, { scaleX: 1.2, scaleY: 1.2 }, { duration: 300, easing: tween.easeOut, onFinish: function onFinish() { tween(countdownText, { scaleX: 1, scaleY: 1 }, { duration: 300, easing: tween.easeIn }); } }); } } else { // Planning phase over planningActive = false; countdownText.visible = false; } } // Update UI resourcesText.setText('Resources: ' + resources); waveText.setText('Wave: ' + currentWave); // Only spawn enemies if planning phase is over if (!planningActive) { // 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); } } };
/****
* 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 = 1;
self.damage = 10;
self.reward = 5;
self.slowTime = 0;
self.baseSpeed = 1;
var assetName = 'basicEnemy';
if (type === 'fast') {
assetName = 'fastEnemy';
self.speed = 2;
self.baseSpeed = 2;
self.health = 20;
self.maxHealth = 20;
} else if (type === 'heavy') {
assetName = 'heavyEnemy';
self.speed = 0.5;
self.baseSpeed = 0.5;
self.health = 80;
self.maxHealth = 80;
self.damage = 25;
self.reward = 15;
} else if (type === 'boss') {
assetName = 'bossEnemy';
self.speed = 0.75;
self.baseSpeed = 0.75;
self.health = 300;
self.maxHealth = 300;
self.damage = 50;
self.reward = 100;
}
var graphics = self.attachAsset(assetName, {
anchorX: 0.5,
anchorY: 0.5
});
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;
}
}
// Move directly towards castle
var dx = castle.x - self.x;
var dy = castle.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < 50) {
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;
self.cost = 20;
} else if (type === 'cannon') {
self.damage = 40;
self.fireRate = 90;
self.range = 120;
self.cost = 40;
} else if (type === 'wizard') {
self.damage = 20;
self.fireRate = 45;
self.range = 180;
self.cost = 60;
} else if (type === 'military') {
self.damage = 0;
self.fireRate = 600; // 10 seconds
self.range = 100;
self.cost = 80;
}
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') {
// Spawn 2 soldiers every 10 seconds
for (var i = 0; i < 2; i++) {
var soldier = new Soldier();
soldier.x = self.x + (i * 40 - 20); // Spread soldiers slightly apart
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 towerCosts = {
archer: 20,
cannon: 40,
wizard: 60,
military: 80
};
var label = new Text2(type.charAt(0).toUpperCase() + type.slice(1), {
size: 25,
fill: 0xFFFFFF
});
label.anchor.set(0.5, 0.3);
self.addChild(label);
var costLabel = new Text2(towerCosts[type] + ' coins', {
size: 20,
fill: 0xFFFF00
});
costLabel.anchor.set(0.5, 0.5);
costLabel.y = -50;
self.addChild(costLabel);
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
// Import tween plugin for animations
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;
var gameStarted = false;
var startButton;
var planningTime = 15; // 15 seconds for planning
var planningTimer = 0;
var planningActive = false;
var countdownText;
// 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
}];
// Add medieval battlefield background
var background = LK.getAsset('medievalBattlefield', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0
});
game.addChild(background);
// 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 countdown text
countdownText = new Text2('', {
size: 120,
fill: 0xFF0000
});
countdownText.anchor.set(0.5, 0.5);
countdownText.x = 2048 / 2;
countdownText.y = 400;
countdownText.visible = false;
game.addChild(countdownText);
// Create how to play button
var howToPlayButton = new Container();
var howToPlayBg = new Text2('How to Play?', {
size: 40,
fill: 0xFFFFFF
});
howToPlayBg.anchor.set(1, 0);
howToPlayButton.addChild(howToPlayBg);
howToPlayButton.x = -10;
howToPlayButton.y = 80;
LK.gui.topRight.addChild(howToPlayButton);
// Create start button
startButton = new Container();
var startButtonBg = LK.getAsset('start', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 2,
scaleY: 2
});
startButton.addChild(startButtonBg);
startButton.x = 2048 / 2;
startButton.y = 2732 / 2;
game.addChild(startButton);
// Create tower buttons (initially hidden)
var towerButtons = [];
var buttonTypes = ['archer', 'cannon', 'wizard', 'military'];
var towerCosts = [20, 40, 60, 80];
var buttonSpacing = 450;
var totalWidth = (buttonTypes.length - 1) * buttonSpacing;
var startX = (2048 - totalWidth) / 2;
for (var i = 0; i < buttonTypes.length; i++) {
var button = new TowerButton(buttonTypes[i], startX + i * buttonSpacing, 2600);
button.scaleX = 2.5;
button.scaleY = 2.5;
button.visible = false;
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';
}
// For Wave 5 (boss wave), spawn 2 bosses
if (currentWave === maxWaves) {
for (var j = 0; j < 2; j++) {
var enemy = new Enemy(enemyType);
// Spawn only from non-blue areas (exclude top and right edges which are blue/water areas)
var side = Math.floor(Math.random() * 2); // Only 2 sides now (bottom and left)
if (side === 0) {
// Bottom edge (land area)
enemy.x = Math.random() * 2048;
enemy.y = 2732;
} else {
// Left edge (land area)
enemy.x = 0;
enemy.y = Math.random() * 2732;
}
enemies.push(enemy);
game.addChild(enemy);
}
enemiesSpawned += 2; // Increment by 2 for boss wave
} else {
var enemy = new Enemy(enemyType);
// Spawn only from non-blue areas (exclude top and right edges which are blue/water areas)
var side = Math.floor(Math.random() * 2); // Only 2 sides now (bottom and left)
if (side === 0) {
// Bottom edge (land area)
enemy.x = Math.random() * 2048;
enemy.y = 2732;
} else {
// Left edge (land area)
enemy.x = 0;
enemy.y = Math.random() * 2732;
}
enemies.push(enemy);
game.addChild(enemy);
enemiesSpawned++;
}
}
function canPlaceTower(x, y) {
// 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) {
return;
}
var towerCosts = {
archer: 20,
cannon: 40,
wizard: 60,
military: 80
};
if (resources < towerCosts[selectedTowerType]) {
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;
}
}
// Start button click handler
startButton.down = function (x, y, obj) {
if (!gameStarted) {
gameStarted = true;
startButton.visible = false;
// Show tower buttons
for (var i = 0; i < towerButtons.length; i++) {
towerButtons[i].visible = true;
}
// Place initial towers
var archerTower = new Tower('archer');
archerTower.x = 800;
archerTower.y = 1200;
towers.push(archerTower);
game.addChild(archerTower);
var cannonTower = new Tower('cannon');
cannonTower.x = 1200;
cannonTower.y = 1000;
towers.push(cannonTower);
game.addChild(cannonTower);
// Start background music
LK.playMusic('ortacagmuzik');
// Start planning phase
planningActive = true;
planningTimer = planningTime * 60; // Convert to ticks (60 FPS)
countdownText.visible = true;
}
};
// How to play button click handler
howToPlayButton.down = function (x, y, obj) {
// Create background panel for instructions
var instructionsPanel = new Container();
var panelBg = LK.getAsset('howToPlayBackground', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 6,
scaleY: 4
});
instructionsPanel.addChild(panelBg);
instructionsPanel.x = 2048 / 2;
instructionsPanel.y = 2732 / 2;
game.addChild(instructionsPanel);
// Show instructions (you can customize this message)
var instructionsText = new Text2('Build towers to stop enemies!\n\nTower types:\n• Archer: Fast fire\n• Cannon: High damage\n• Wizard: Slows enemies\n• Military: Spawns soldiers\n\nProtect the castle!', {
size: 70,
fill: 0x000000,
align: 'center'
});
instructionsText.anchor.set(0.5, 0.5);
instructionsPanel.addChild(instructionsText);
// Remove instructions after 5 seconds
LK.setTimeout(function () {
if (instructionsPanel.parent) {
instructionsPanel.destroy();
}
}, 5000);
};
// Game events
game.down = function (x, y, obj) {
if (placingTower && gameStarted) {
placeTower(x, y);
}
};
// Main game loop
game.update = function () {
// Only run game logic if game has started
if (!gameStarted) {
return;
}
// Handle planning phase countdown
if (planningActive) {
planningTimer--;
var secondsLeft = Math.ceil(planningTimer / 60);
if (secondsLeft > 0) {
countdownText.setText('Planning Time: ' + secondsLeft);
// Add pulsing animation to countdown text
if (planningTimer % 60 === 0) {
// Every second
tween(countdownText, {
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 300,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(countdownText, {
scaleX: 1,
scaleY: 1
}, {
duration: 300,
easing: tween.easeIn
});
}
});
}
} else {
// Planning phase over
planningActive = false;
countdownText.visible = false;
}
}
// Update UI
resourcesText.setText('Resources: ' + resources);
waveText.setText('Wave: ' + currentWave);
// Only spawn enemies if planning phase is over
if (!planningActive) {
// 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);
}
}
};
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