User prompt
Maça girme tuşu olsun
User prompt
Kartlar nehirden geçemez ve kartların olduğu yeri ortala ana menü ekle ana menüde kartlarım iki kişilik mağaza kupa yazsın
User prompt
Please fix the bug: 'ReferenceError: cardTypes is not defined' in or related to this line: 'var unitType = cardTypes[Math.floor(Math.random() * cardTypes.length)];' Line Number: 646
User prompt
Kart atınca daha kart atılmıyo ve deste oluşturucu gelsin 15 tane kart olsun bide atıs etekleri olsun kartların canı olsun iki tane köprü olsun
User prompt
Kart atınca karakter kart bölmesinden gidiyor ve kartları sadece kendi bölgemize atalım köprü ekle köprüden geçsinler kartların canı olsun
User prompt
Please fix the bug: 'TypeError: Cannot read properties of undefined (reading 'concat')' in or related to this line: 'var allTargets = enemyUnits.concat(towers);' Line Number: 230
Code edit (1 edits merged)
Please save this source code
User prompt
Tower Defense Arena Clash
Initial prompt
> "Gerçek zamanlı stratejiye dayalı, Clash Royale benzeri bir mobil oyun tasarla. Oyunda 1'e 1 gerçek zamanlı savaşlar olacak. Oyuncular kart desteleriyle kendi birliklerini, büyülerini ve savunmalarını seçerek üç kuleli bir arenada rakip kuleleri yok etmeye çalışacak. Her kartın farklı enerji maliyeti ve özellikleri olacak. Arenada ortada bir nehir bulunacak, iki tarafta oyuncuların kuleleri olacak. Oyunun içinde seviye atlama, kupa sistemi, farklı arenalar, özel etkinlikler ve klan sistemi olmalı. Grafik tarzı çizgi film gibi ama yüksek kaliteli ve renkli olsun. Oyun dengeli, rekabetçi ve çevrim içi çok oyunculu olacak şekilde tasarlansın. Ana hedef: rakip kral kulesini yok etmek."
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Card = Container.expand(function (type, cost) {
var self = Container.call(this);
self.type = type;
self.cost = cost;
self.selected = false;
var cardBg = self.attachAsset('cardSlot', {
anchorX: 0.5,
anchorY: 0.5
});
var unitPreview = self.addChild(LK.getAsset(type, {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.8,
scaleY: 0.8,
y: -30
}));
var costText = self.addChild(new Text2(cost.toString(), {
size: 40,
fill: 0xFFFFFF
}));
costText.anchor.set(0.5, 0.5);
costText.y = 80;
self.down = function (x, y, obj) {
if (currentEnergy >= self.cost && !selectedCard) {
selectedCard = self;
self.selected = true;
cardBg.tint = 0x00FF00;
}
};
return self;
});
var Projectile = Container.expand(function (startX, startY, target, damage) {
var self = Container.call(this);
self.x = startX;
self.y = startY;
self.target = target;
self.damage = damage;
self.speed = 8;
var projectileGraphics = self.attachAsset('projectile', {
anchorX: 0.5,
anchorY: 0.5
});
self.update = function () {
if (!self.target || self.target.health <= 0) {
self.destroy();
return;
}
var dx = self.target.x - self.x;
var dy = self.target.y - self.target.height / 2 - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < 30) {
// Hit target
self.target.takeDamage(self.damage);
self.destroy();
} else {
// Move toward target
self.x += dx / distance * self.speed;
self.y += dy / distance * self.speed;
}
};
return self;
});
var Tower = Container.expand(function (isPlayer, isKing) {
var self = Container.call(this);
self.isPlayer = isPlayer;
self.isKing = isKing;
self.maxHealth = isKing ? 3000 : 2000;
self.health = self.maxHealth;
self.attackDamage = isKing ? 200 : 150;
self.attackRange = 250;
self.attackCooldown = 0;
self.attackSpeed = 60; // frames between attacks
var assetName = (isPlayer ? 'player' : 'enemy') + (isKing ? 'KingTower' : 'Tower');
var towerGraphics = self.attachAsset(assetName, {
anchorX: 0.5,
anchorY: 1.0
});
// Health bar
var healthBarBg = self.addChild(LK.getAsset('energyBar', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.4,
scaleY: 0.3,
y: -200
}));
healthBarBg.tint = 0x333333;
var healthBar = self.addChild(LK.getAsset('energyBar', {
anchorX: 0,
anchorY: 0.5,
scaleX: 0.4,
scaleY: 0.3,
y: -200,
x: -60
}));
healthBar.tint = isPlayer ? 0x00FF00 : 0xFF0000;
self.takeDamage = function (damage) {
self.health -= damage;
if (self.health < 0) self.health = 0;
var healthPercent = self.health / self.maxHealth;
healthBar.scaleX = 0.4 * healthPercent;
// Flash effect
LK.effects.flashObject(towerGraphics, 0xFF0000, 300);
LK.getSound('towerHit').play();
if (self.health <= 0) {
self.destroy();
if (isKing) {
if (isPlayer) {
LK.showGameOver();
} else {
LK.showYouWin();
}
}
}
};
self.update = function () {
if (self.attackCooldown > 0) {
self.attackCooldown--;
return;
}
// Find closest enemy unit
var targetUnits = self.isPlayer ? enemyUnits : playerUnits;
var closestUnit = null;
var closestDistance = Infinity;
for (var i = 0; i < targetUnits.length; i++) {
var unit = targetUnits[i];
var dx = unit.x - self.x;
var dy = unit.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < self.attackRange && distance < closestDistance) {
closestDistance = distance;
closestUnit = unit;
}
}
if (closestUnit) {
self.attackCooldown = self.attackSpeed;
// Create projectile
var projectile = new Projectile(self.x, self.y - 50, closestUnit, self.attackDamage);
game.addChild(projectile);
projectiles.push(projectile);
}
};
return self;
});
var Unit = Container.expand(function (type, isPlayer) {
var self = Container.call(this);
self.isPlayer = isPlayer;
self.type = type;
self.moveSpeed = 2;
self.attackDamage = 100;
self.attackRange = 80;
self.attackCooldown = 0;
self.attackSpeed = 60;
self.target = null;
// Set stats based on type
switch (type) {
case 'soldier':
self.maxHealth = 400;
self.moveSpeed = 2;
self.attackDamage = 80;
break;
case 'archer':
self.maxHealth = 200;
self.moveSpeed = 2.5;
self.attackDamage = 60;
self.attackRange = 150;
break;
case 'tank':
self.maxHealth = 800;
self.moveSpeed = 1;
self.attackDamage = 120;
break;
case 'wizard':
self.maxHealth = 300;
self.moveSpeed = 2;
self.attackDamage = 150;
self.attackRange = 180;
break;
}
self.health = self.maxHealth;
var unitGraphics = self.attachAsset(type, {
anchorX: 0.5,
anchorY: 1.0
});
if (!isPlayer) {
unitGraphics.scaleX = -1; // Flip enemy units
}
self.takeDamage = function (damage) {
self.health -= damage;
if (self.health <= 0) {
LK.effects.flashObject(unitGraphics, 0xFF0000, 200);
LK.getSound('unitDeath').play();
self.destroy();
} else {
LK.effects.flashObject(unitGraphics, 0xFF0000, 150);
}
};
self.findTarget = function () {
var enemyUnits = self.isPlayer ? enemyUnits : playerUnits;
var towers = self.isPlayer ? enemyTowers : playerTowers;
var allTargets = enemyUnits.concat(towers);
var closest = null;
var closestDistance = Infinity;
for (var i = 0; i < allTargets.length; i++) {
var target = allTargets[i];
if (!target || target.health <= 0) continue;
var dx = target.x - self.x;
var dy = target.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < closestDistance) {
closestDistance = distance;
closest = target;
}
}
return closest;
};
self.update = function () {
if (!self.target || self.target.health <= 0) {
self.target = self.findTarget();
}
if (!self.target) 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 <= self.attackRange) {
// Attack
if (self.attackCooldown <= 0) {
self.attackCooldown = self.attackSpeed;
if (self.type === 'archer' || self.type === 'wizard') {
// Ranged attack with projectile
var projectile = new Projectile(self.x, self.y - 40, self.target, self.attackDamage);
game.addChild(projectile);
projectiles.push(projectile);
} else {
// Melee attack
self.target.takeDamage(self.attackDamage);
}
}
} else {
// Move toward target
var moveX = dx / distance * self.moveSpeed;
var moveY = dy / distance * self.moveSpeed;
self.x += moveX;
self.y += moveY;
}
if (self.attackCooldown > 0) {
self.attackCooldown--;
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87CEEB
});
/****
* Game Code
****/
// Game state variables
var currentEnergy = 10;
var maxEnergy = 10;
var energyRegenRate = 1; // energy per second
var energyRegenTimer = 0;
var playerUnits = [];
var enemyUnits = [];
var playerTowers = [];
var enemyTowers = [];
var projectiles = [];
var playerCards = [];
var selectedCard = null;
// Arena setup
var arena = game.addChild(LK.getAsset('arena', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1366
}));
var river = game.addChild(LK.getAsset('river', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1366
}));
// Create towers
// Player towers (bottom)
var playerKingTower = new Tower(true, true);
playerKingTower.x = 1024;
playerKingTower.y = 2200;
game.addChild(playerKingTower);
playerTowers.push(playerKingTower);
var playerLeftTower = new Tower(true, false);
playerLeftTower.x = 600;
playerLeftTower.y = 2000;
game.addChild(playerLeftTower);
playerTowers.push(playerLeftTower);
var playerRightTower = new Tower(true, false);
playerRightTower.x = 1448;
playerRightTower.y = 2000;
game.addChild(playerRightTower);
playerTowers.push(playerRightTower);
// Enemy towers (top)
var enemyKingTower = new Tower(false, true);
enemyKingTower.x = 1024;
enemyKingTower.y = 600;
game.addChild(enemyKingTower);
enemyTowers.push(enemyKingTower);
var enemyLeftTower = new Tower(false, false);
enemyLeftTower.x = 600;
enemyLeftTower.y = 800;
game.addChild(enemyLeftTower);
enemyTowers.push(enemyLeftTower);
var enemyRightTower = new Tower(false, false);
enemyRightTower.x = 1448;
enemyRightTower.y = 800;
game.addChild(enemyRightTower);
enemyTowers.push(enemyRightTower);
// UI Setup
var energyBarBg = LK.gui.bottom.addChild(LK.getAsset('energyBar', {
anchorX: 0.5,
anchorY: 1.0,
y: -200,
scaleX: 1.2,
scaleY: 0.8
}));
energyBarBg.tint = 0x333333;
var energyBar = LK.gui.bottom.addChild(LK.getAsset('energyBar', {
anchorX: 0,
anchorY: 1.0,
y: -200,
x: -180,
scaleX: 1.2,
scaleY: 0.8
}));
var energyText = LK.gui.bottom.addChild(new Text2("10/10", {
size: 40,
fill: 0xFFFFFF
}));
energyText.anchor.set(0.5, 1.0);
energyText.y = -170;
// Create card deck
var cardTypes = ['soldier', 'archer', 'tank', 'wizard'];
var cardCosts = [2, 3, 4, 5];
for (var i = 0; i < 4; i++) {
var card = new Card(cardTypes[i], cardCosts[i]);
card.x = 300 + i * 220;
card.y = -80;
LK.gui.bottom.addChild(card);
playerCards.push(card);
}
// Simple AI for enemy
var aiTimer = 0;
var aiDeployInterval = 180; // Deploy every 3 seconds
function updateEnergy() {
energyRegenTimer++;
if (energyRegenTimer >= 60) {
// 1 second at 60 FPS
energyRegenTimer = 0;
if (currentEnergy < maxEnergy) {
currentEnergy++;
var energyPercent = currentEnergy / maxEnergy;
energyBar.scaleX = 1.2 * energyPercent;
energyText.setText(currentEnergy + "/" + maxEnergy);
}
}
}
function updateAI() {
aiTimer++;
if (aiTimer >= aiDeployInterval) {
aiTimer = 0;
// Simple AI: deploy random unit
var unitType = cardTypes[Math.floor(Math.random() * cardTypes.length)];
var enemyUnit = new Unit(unitType, false);
enemyUnit.x = 800 + Math.random() * 400;
enemyUnit.y = 1000;
game.addChild(enemyUnit);
enemyUnits.push(enemyUnit);
}
}
game.down = function (x, y, obj) {
if (selectedCard && y > 1000 && y < 2000) {
// Deploy zone
if (currentEnergy >= selectedCard.cost) {
// Deploy unit
var newUnit = new Unit(selectedCard.type, true);
newUnit.x = x;
newUnit.y = y;
game.addChild(newUnit);
playerUnits.push(newUnit);
currentEnergy -= selectedCard.cost;
var energyPercent = currentEnergy / maxEnergy;
energyBar.scaleX = 1.2 * energyPercent;
energyText.setText(currentEnergy + "/" + maxEnergy);
LK.getSound('cardPlay').play();
}
// Deselect card
if (selectedCard) {
selectedCard.attachAsset('cardSlot', {
anchorX: 0.5,
anchorY: 0.5
}).tint = 0xFFFFFF;
selectedCard.selected = false;
selectedCard = null;
}
}
};
game.update = function () {
updateEnergy();
updateAI();
// Clean up destroyed units
for (var i = playerUnits.length - 1; i >= 0; i--) {
if (playerUnits[i].health <= 0) {
playerUnits[i].destroy();
playerUnits.splice(i, 1);
}
}
for (var i = enemyUnits.length - 1; i >= 0; i--) {
if (enemyUnits[i].health <= 0) {
enemyUnits[i].destroy();
enemyUnits.splice(i, 1);
}
}
for (var i = projectiles.length - 1; i >= 0; i--) {
if (!projectiles[i].parent) {
projectiles.splice(i, 1);
}
}
// Clean up destroyed towers
for (var i = playerTowers.length - 1; i >= 0; i--) {
if (playerTowers[i].health <= 0 && playerTowers[i].parent) {
playerTowers.splice(i, 1);
}
}
for (var i = enemyTowers.length - 1; i >= 0; i--) {
if (enemyTowers[i].health <= 0 && enemyTowers[i].parent) {
enemyTowers.splice(i, 1);
}
}
}; ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,449 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+
+/****
+* Classes
+****/
+var Card = Container.expand(function (type, cost) {
+ var self = Container.call(this);
+ self.type = type;
+ self.cost = cost;
+ self.selected = false;
+ var cardBg = self.attachAsset('cardSlot', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ var unitPreview = self.addChild(LK.getAsset(type, {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 0.8,
+ scaleY: 0.8,
+ y: -30
+ }));
+ var costText = self.addChild(new Text2(cost.toString(), {
+ size: 40,
+ fill: 0xFFFFFF
+ }));
+ costText.anchor.set(0.5, 0.5);
+ costText.y = 80;
+ self.down = function (x, y, obj) {
+ if (currentEnergy >= self.cost && !selectedCard) {
+ selectedCard = self;
+ self.selected = true;
+ cardBg.tint = 0x00FF00;
+ }
+ };
+ return self;
+});
+var Projectile = Container.expand(function (startX, startY, target, damage) {
+ var self = Container.call(this);
+ self.x = startX;
+ self.y = startY;
+ self.target = target;
+ self.damage = damage;
+ self.speed = 8;
+ var projectileGraphics = self.attachAsset('projectile', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.update = function () {
+ if (!self.target || self.target.health <= 0) {
+ self.destroy();
+ return;
+ }
+ var dx = self.target.x - self.x;
+ var dy = self.target.y - self.target.height / 2 - self.y;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ if (distance < 30) {
+ // Hit target
+ self.target.takeDamage(self.damage);
+ self.destroy();
+ } else {
+ // Move toward target
+ self.x += dx / distance * self.speed;
+ self.y += dy / distance * self.speed;
+ }
+ };
+ return self;
+});
+var Tower = Container.expand(function (isPlayer, isKing) {
+ var self = Container.call(this);
+ self.isPlayer = isPlayer;
+ self.isKing = isKing;
+ self.maxHealth = isKing ? 3000 : 2000;
+ self.health = self.maxHealth;
+ self.attackDamage = isKing ? 200 : 150;
+ self.attackRange = 250;
+ self.attackCooldown = 0;
+ self.attackSpeed = 60; // frames between attacks
+ var assetName = (isPlayer ? 'player' : 'enemy') + (isKing ? 'KingTower' : 'Tower');
+ var towerGraphics = self.attachAsset(assetName, {
+ anchorX: 0.5,
+ anchorY: 1.0
+ });
+ // Health bar
+ var healthBarBg = self.addChild(LK.getAsset('energyBar', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 0.4,
+ scaleY: 0.3,
+ y: -200
+ }));
+ healthBarBg.tint = 0x333333;
+ var healthBar = self.addChild(LK.getAsset('energyBar', {
+ anchorX: 0,
+ anchorY: 0.5,
+ scaleX: 0.4,
+ scaleY: 0.3,
+ y: -200,
+ x: -60
+ }));
+ healthBar.tint = isPlayer ? 0x00FF00 : 0xFF0000;
+ self.takeDamage = function (damage) {
+ self.health -= damage;
+ if (self.health < 0) self.health = 0;
+ var healthPercent = self.health / self.maxHealth;
+ healthBar.scaleX = 0.4 * healthPercent;
+ // Flash effect
+ LK.effects.flashObject(towerGraphics, 0xFF0000, 300);
+ LK.getSound('towerHit').play();
+ if (self.health <= 0) {
+ self.destroy();
+ if (isKing) {
+ if (isPlayer) {
+ LK.showGameOver();
+ } else {
+ LK.showYouWin();
+ }
+ }
+ }
+ };
+ self.update = function () {
+ if (self.attackCooldown > 0) {
+ self.attackCooldown--;
+ return;
+ }
+ // Find closest enemy unit
+ var targetUnits = self.isPlayer ? enemyUnits : playerUnits;
+ var closestUnit = null;
+ var closestDistance = Infinity;
+ for (var i = 0; i < targetUnits.length; i++) {
+ var unit = targetUnits[i];
+ var dx = unit.x - self.x;
+ var dy = unit.y - self.y;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ if (distance < self.attackRange && distance < closestDistance) {
+ closestDistance = distance;
+ closestUnit = unit;
+ }
+ }
+ if (closestUnit) {
+ self.attackCooldown = self.attackSpeed;
+ // Create projectile
+ var projectile = new Projectile(self.x, self.y - 50, closestUnit, self.attackDamage);
+ game.addChild(projectile);
+ projectiles.push(projectile);
+ }
+ };
+ return self;
+});
+var Unit = Container.expand(function (type, isPlayer) {
+ var self = Container.call(this);
+ self.isPlayer = isPlayer;
+ self.type = type;
+ self.moveSpeed = 2;
+ self.attackDamage = 100;
+ self.attackRange = 80;
+ self.attackCooldown = 0;
+ self.attackSpeed = 60;
+ self.target = null;
+ // Set stats based on type
+ switch (type) {
+ case 'soldier':
+ self.maxHealth = 400;
+ self.moveSpeed = 2;
+ self.attackDamage = 80;
+ break;
+ case 'archer':
+ self.maxHealth = 200;
+ self.moveSpeed = 2.5;
+ self.attackDamage = 60;
+ self.attackRange = 150;
+ break;
+ case 'tank':
+ self.maxHealth = 800;
+ self.moveSpeed = 1;
+ self.attackDamage = 120;
+ break;
+ case 'wizard':
+ self.maxHealth = 300;
+ self.moveSpeed = 2;
+ self.attackDamage = 150;
+ self.attackRange = 180;
+ break;
+ }
+ self.health = self.maxHealth;
+ var unitGraphics = self.attachAsset(type, {
+ anchorX: 0.5,
+ anchorY: 1.0
+ });
+ if (!isPlayer) {
+ unitGraphics.scaleX = -1; // Flip enemy units
+ }
+ self.takeDamage = function (damage) {
+ self.health -= damage;
+ if (self.health <= 0) {
+ LK.effects.flashObject(unitGraphics, 0xFF0000, 200);
+ LK.getSound('unitDeath').play();
+ self.destroy();
+ } else {
+ LK.effects.flashObject(unitGraphics, 0xFF0000, 150);
+ }
+ };
+ self.findTarget = function () {
+ var enemyUnits = self.isPlayer ? enemyUnits : playerUnits;
+ var towers = self.isPlayer ? enemyTowers : playerTowers;
+ var allTargets = enemyUnits.concat(towers);
+ var closest = null;
+ var closestDistance = Infinity;
+ for (var i = 0; i < allTargets.length; i++) {
+ var target = allTargets[i];
+ if (!target || target.health <= 0) continue;
+ var dx = target.x - self.x;
+ var dy = target.y - self.y;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ if (distance < closestDistance) {
+ closestDistance = distance;
+ closest = target;
+ }
+ }
+ return closest;
+ };
+ self.update = function () {
+ if (!self.target || self.target.health <= 0) {
+ self.target = self.findTarget();
+ }
+ if (!self.target) 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 <= self.attackRange) {
+ // Attack
+ if (self.attackCooldown <= 0) {
+ self.attackCooldown = self.attackSpeed;
+ if (self.type === 'archer' || self.type === 'wizard') {
+ // Ranged attack with projectile
+ var projectile = new Projectile(self.x, self.y - 40, self.target, self.attackDamage);
+ game.addChild(projectile);
+ projectiles.push(projectile);
+ } else {
+ // Melee attack
+ self.target.takeDamage(self.attackDamage);
+ }
+ }
+ } else {
+ // Move toward target
+ var moveX = dx / distance * self.moveSpeed;
+ var moveY = dy / distance * self.moveSpeed;
+ self.x += moveX;
+ self.y += moveY;
+ }
+ if (self.attackCooldown > 0) {
+ self.attackCooldown--;
+ }
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x87CEEB
+});
+
+/****
+* Game Code
+****/
+// Game state variables
+var currentEnergy = 10;
+var maxEnergy = 10;
+var energyRegenRate = 1; // energy per second
+var energyRegenTimer = 0;
+var playerUnits = [];
+var enemyUnits = [];
+var playerTowers = [];
+var enemyTowers = [];
+var projectiles = [];
+var playerCards = [];
+var selectedCard = null;
+// Arena setup
+var arena = game.addChild(LK.getAsset('arena', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: 1024,
+ y: 1366
+}));
+var river = game.addChild(LK.getAsset('river', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: 1024,
+ y: 1366
+}));
+// Create towers
+// Player towers (bottom)
+var playerKingTower = new Tower(true, true);
+playerKingTower.x = 1024;
+playerKingTower.y = 2200;
+game.addChild(playerKingTower);
+playerTowers.push(playerKingTower);
+var playerLeftTower = new Tower(true, false);
+playerLeftTower.x = 600;
+playerLeftTower.y = 2000;
+game.addChild(playerLeftTower);
+playerTowers.push(playerLeftTower);
+var playerRightTower = new Tower(true, false);
+playerRightTower.x = 1448;
+playerRightTower.y = 2000;
+game.addChild(playerRightTower);
+playerTowers.push(playerRightTower);
+// Enemy towers (top)
+var enemyKingTower = new Tower(false, true);
+enemyKingTower.x = 1024;
+enemyKingTower.y = 600;
+game.addChild(enemyKingTower);
+enemyTowers.push(enemyKingTower);
+var enemyLeftTower = new Tower(false, false);
+enemyLeftTower.x = 600;
+enemyLeftTower.y = 800;
+game.addChild(enemyLeftTower);
+enemyTowers.push(enemyLeftTower);
+var enemyRightTower = new Tower(false, false);
+enemyRightTower.x = 1448;
+enemyRightTower.y = 800;
+game.addChild(enemyRightTower);
+enemyTowers.push(enemyRightTower);
+// UI Setup
+var energyBarBg = LK.gui.bottom.addChild(LK.getAsset('energyBar', {
+ anchorX: 0.5,
+ anchorY: 1.0,
+ y: -200,
+ scaleX: 1.2,
+ scaleY: 0.8
+}));
+energyBarBg.tint = 0x333333;
+var energyBar = LK.gui.bottom.addChild(LK.getAsset('energyBar', {
+ anchorX: 0,
+ anchorY: 1.0,
+ y: -200,
+ x: -180,
+ scaleX: 1.2,
+ scaleY: 0.8
+}));
+var energyText = LK.gui.bottom.addChild(new Text2("10/10", {
+ size: 40,
+ fill: 0xFFFFFF
+}));
+energyText.anchor.set(0.5, 1.0);
+energyText.y = -170;
+// Create card deck
+var cardTypes = ['soldier', 'archer', 'tank', 'wizard'];
+var cardCosts = [2, 3, 4, 5];
+for (var i = 0; i < 4; i++) {
+ var card = new Card(cardTypes[i], cardCosts[i]);
+ card.x = 300 + i * 220;
+ card.y = -80;
+ LK.gui.bottom.addChild(card);
+ playerCards.push(card);
+}
+// Simple AI for enemy
+var aiTimer = 0;
+var aiDeployInterval = 180; // Deploy every 3 seconds
+function updateEnergy() {
+ energyRegenTimer++;
+ if (energyRegenTimer >= 60) {
+ // 1 second at 60 FPS
+ energyRegenTimer = 0;
+ if (currentEnergy < maxEnergy) {
+ currentEnergy++;
+ var energyPercent = currentEnergy / maxEnergy;
+ energyBar.scaleX = 1.2 * energyPercent;
+ energyText.setText(currentEnergy + "/" + maxEnergy);
+ }
+ }
+}
+function updateAI() {
+ aiTimer++;
+ if (aiTimer >= aiDeployInterval) {
+ aiTimer = 0;
+ // Simple AI: deploy random unit
+ var unitType = cardTypes[Math.floor(Math.random() * cardTypes.length)];
+ var enemyUnit = new Unit(unitType, false);
+ enemyUnit.x = 800 + Math.random() * 400;
+ enemyUnit.y = 1000;
+ game.addChild(enemyUnit);
+ enemyUnits.push(enemyUnit);
+ }
+}
+game.down = function (x, y, obj) {
+ if (selectedCard && y > 1000 && y < 2000) {
+ // Deploy zone
+ if (currentEnergy >= selectedCard.cost) {
+ // Deploy unit
+ var newUnit = new Unit(selectedCard.type, true);
+ newUnit.x = x;
+ newUnit.y = y;
+ game.addChild(newUnit);
+ playerUnits.push(newUnit);
+ currentEnergy -= selectedCard.cost;
+ var energyPercent = currentEnergy / maxEnergy;
+ energyBar.scaleX = 1.2 * energyPercent;
+ energyText.setText(currentEnergy + "/" + maxEnergy);
+ LK.getSound('cardPlay').play();
+ }
+ // Deselect card
+ if (selectedCard) {
+ selectedCard.attachAsset('cardSlot', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ }).tint = 0xFFFFFF;
+ selectedCard.selected = false;
+ selectedCard = null;
+ }
+ }
+};
+game.update = function () {
+ updateEnergy();
+ updateAI();
+ // Clean up destroyed units
+ for (var i = playerUnits.length - 1; i >= 0; i--) {
+ if (playerUnits[i].health <= 0) {
+ playerUnits[i].destroy();
+ playerUnits.splice(i, 1);
+ }
+ }
+ for (var i = enemyUnits.length - 1; i >= 0; i--) {
+ if (enemyUnits[i].health <= 0) {
+ enemyUnits[i].destroy();
+ enemyUnits.splice(i, 1);
+ }
+ }
+ for (var i = projectiles.length - 1; i >= 0; i--) {
+ if (!projectiles[i].parent) {
+ projectiles.splice(i, 1);
+ }
+ }
+ // Clean up destroyed towers
+ for (var i = playerTowers.length - 1; i >= 0; i--) {
+ if (playerTowers[i].health <= 0 && playerTowers[i].parent) {
+ playerTowers.splice(i, 1);
+ }
+ }
+ for (var i = enemyTowers.length - 1; i >= 0; i--) {
+ if (enemyTowers[i].health <= 0 && enemyTowers[i].parent) {
+ enemyTowers.splice(i, 1);
+ }
+ }
+};
\ No newline at end of file
2d Archer bird eye. In-Game asset. 2d. High contrast. No shadows
2d knight bird. In-Game asset. 2d. High contrast. No shadows
2d bird goblin. In-Game asset. 2d. High contrast. No shadows
2d bird giant. In-Game asset. 2d. High contrast. No shadows
Yer yeşil üstünde köyü yeşil çim olsun
2d assassin bird. In-Game asset. 2d. High contrast. No shadows
2d bird wizard. In-Game asset. 2d. High contrast. No shadows
2d bird bear. In-Game asset. 2d. High contrast. No shadows
2d bird berserker. In-Game asset. 2d. High contrast. No shadows
2d bird bomber. In-Game asset. 2d. High contrast. No shadows
2d bird dragon. In-Game asset. 2d. High contrast. No shadows
Fireball. In-Game asset. 2d. High contrast. No shadows
Card slot. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
2d bird healer. In-Game asset. 2d. High contrast. No shadows
2d Freeze. In-Game asset. 2d. High contrast. No shadows
2d Poison. In-Game asset. 2d. High contrast. No shadows
King tower. In-Game asset. 2d. High contrast. No shadows
Blue Tower. In-Game asset. 2d. High contrast. No shadows
King tower red. In-Game asset. 2d. High contrast. No shadows
Red tower. In-Game asset. 2d. High contrast. No shadows
2d bird guardian. In-Game asset. 2d. High contrast. No shadows