Code edit (1 edits merged)
Please save this source code
User prompt
Zombie Wave Defense: Base Builder
Initial prompt
bana kendi alanımızın oldugu ve o alana saldıran zombilerin oldugu bi oyun yap ama zombiler dalga dalga gelcek ve her oldurdugumuz zıombinin içnden paralar çıkacak o paralar ile de kendi alanımıza yapılar inşaa edip zombilerin gelmesini zorlaştırcagız ve yıne o paralar ile karakterimizin elindeki silahı güçlendireceğiz ve karakterimiz zombileri tek merimide oldurebilecek ancak zombiler karaterimizi tek vuruşta olduremeyecek e az 5 vuruşta öldürebilece
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ // Bullet class var Bullet = Container.expand(function () { var self = Container.call(this); var bulletSprite = self.attachAsset('bullet', { anchorX: 0.5, anchorY: 0.5 }); self.radius = bulletSprite.width / 2; self.vx = 0; self.vy = 0; self.damage = 1; self.update = function () { self.x += self.vx; self.y += self.vy; }; return self; }); // Coin class var Coin = Container.expand(function () { var self = Container.call(this); var coinSprite = self.attachAsset('coin', { anchorX: 0.5, anchorY: 0.5 }); self.radius = coinSprite.width / 2; self.vy = 4; self.collected = false; self.update = function () { if (!self.collected) { self.y += self.vy; if (self.y > 2732 - 80) self.vy = 0; } }; self.collect = function () { if (self.collected) return; self.collected = true; LK.getSound('coin').play(); // Animate to coinText var guiPos = LK.gui.topRight.toLocal(game.toGlobal({ x: self.x, y: self.y })); var startX = self.x, startY = self.y; var endX = 2048 - 200, endY = 80; tween(self, { x: endX, y: endY, alpha: 0 }, { duration: 400, easing: tween.cubicIn, onFinish: function onFinish() { self.destroy(); var idx = coins.indexOf(self); if (idx !== -1) coins.splice(idx, 1); coinsCollected++; updateCoinText(); } }); }; return self; }); // Player class var Player = Container.expand(function () { var self = Container.call(this); var playerSprite = self.attachAsset('player', { anchorX: 0.5, anchorY: 0.5 }); self.radius = playerSprite.width / 2; self.hp = 5; self.maxHp = 5; self.shootCooldown = 0; self.shootDelay = 20; // frames self.weaponLevel = 1; self.lastShotTick = 0; // For drag self.down = function (x, y, obj) {}; self.up = function (x, y, obj) {}; self.update = function () { if (self.shootCooldown > 0) self.shootCooldown--; }; // Shoot method self.shoot = function (targetX, targetY) { if (self.shootCooldown > 0) return; var dx = targetX - self.x; var dy = targetY - self.y; var len = Math.sqrt(dx * dx + dy * dy); if (len === 0) return; dx /= len; dy /= len; var bullet = new Bullet(); bullet.x = self.x + dx * (self.radius + 30); bullet.y = self.y + dy * (self.radius + 30); bullet.vx = dx * (22 + self.weaponLevel * 2); bullet.vy = dy * (22 + self.weaponLevel * 2); bullet.damage = self.weaponLevel; bullets.push(bullet); game.addChild(bullet); LK.getSound('shoot').play(); self.shootCooldown = self.shootDelay; }; // Take damage self.takeDamage = function (amount) { self.hp -= amount; if (self.hp < 0) self.hp = 0; LK.effects.flashObject(self, 0xff0000, 300); updateHpBar(); if (self.hp <= 0) { LK.effects.flashScreen(0xff0000, 1000); LK.showGameOver(); } }; return self; }); // Tower class var Tower = Container.expand(function () { var self = Container.call(this); var towerSprite = self.attachAsset('tower', { anchorX: 0.5, anchorY: 0.5 }); self.radius = Math.max(towerSprite.width, towerSprite.height) / 2; self.hp = 8; self.maxHp = 8; self.shootCooldown = 0; self.shootDelay = 40; self.takeDamage = function (amount) { self.hp -= amount; LK.effects.flashObject(self, 0xff0000, 200); if (self.hp <= 0) { self.destroy(); var idx = defenses.indexOf(self); if (idx !== -1) defenses.splice(idx, 1); } }; self.update = function () { if (self.shootCooldown > 0) self.shootCooldown--; // Find nearest zombie var nearest = null, minDist = 99999; for (var i = 0; i < zombies.length; i++) { var z = zombies[i]; var dx = z.x - self.x; var dy = z.y - self.y; var dist = dx * dx + dy * dy; if (dist < minDist) { minDist = dist; nearest = z; } } if (nearest && self.shootCooldown <= 0) { // Shoot at nearest zombie var dx = nearest.x - self.x; var dy = nearest.y - self.y; var len = Math.sqrt(dx * dx + dy * dy); if (len > 0) { dx /= len; dy /= len; var bullet = new Bullet(); bullet.x = self.x + dx * (self.radius + 20); bullet.y = self.y + dy * (self.radius + 20); bullet.vx = dx * 18; bullet.vy = dy * 18; bullet.damage = 1; bullets.push(bullet); game.addChild(bullet); LK.getSound('shoot').play(); self.shootCooldown = self.shootDelay; } } }; return self; }); // Trap class var Trap = Container.expand(function () { var self = Container.call(this); var trapSprite = self.attachAsset('trap', { anchorX: 0.5, anchorY: 0.5 }); self.radius = Math.max(trapSprite.width, trapSprite.height) / 2; self.hp = 2; self.maxHp = 2; self.takeDamage = function (amount) { self.hp -= amount; LK.effects.flashObject(self, 0xff0000, 200); if (self.hp <= 0) { self.destroy(); var idx = defenses.indexOf(self); if (idx !== -1) defenses.splice(idx, 1); } }; return self; }); // Wall class var Wall = Container.expand(function () { var self = Container.call(this); var wallSprite = self.attachAsset('wall', { anchorX: 0.5, anchorY: 0.5 }); self.radius = Math.max(wallSprite.width, wallSprite.height) / 2; self.hp = 6; self.maxHp = 6; self.takeDamage = function (amount) { self.hp -= amount; LK.effects.flashObject(self, 0xff0000, 200); if (self.hp <= 0) { self.destroy(); var idx = defenses.indexOf(self); if (idx !== -1) defenses.splice(idx, 1); } }; return self; }); // Zombie class var Zombie = Container.expand(function () { var self = Container.call(this); var zombieSprite = self.attachAsset('zombie', { anchorX: 0.5, anchorY: 0.5 }); self.radius = zombieSprite.width / 2; self.speed = 2 + currentWave * 0.3; self.hp = 1 + Math.floor(currentWave / 2); self.maxHp = self.hp; self.target = null; self.lastHitTick = 0; self.update = function () { // Move towards player var tx = player.x; var ty = player.y; // If wall/trap/tower is closer, target that var minDist = Math.sqrt((self.x - tx) * (self.x - tx) + (self.y - ty) * (self.y - ty)); var targetObj = player; for (var i = 0; i < defenses.length; i++) { var d = defenses[i]; var dist = Math.sqrt((self.x - d.x) * (self.x - d.x) + (self.y - d.y) * (self.y - d.y)); if (dist < minDist) { minDist = dist; targetObj = d; } } self.target = targetObj; var dx = targetObj.x - self.x; var dy = targetObj.y - self.y; var len = Math.sqrt(dx * dx + dy * dy); if (len > 0) { dx /= len; dy /= len; self.x += dx * self.speed; self.y += dy * self.speed; } // Attack if close if (len < self.radius + targetObj.radius + 10) { if (LK.ticks - self.lastHitTick > 30) { if (targetObj === player) { player.takeDamage(1); } else if (targetObj.takeDamage) { targetObj.takeDamage(1); } self.lastHitTick = LK.ticks; } } }; self.takeDamage = function (amount) { self.hp -= amount; if (self.hp <= 0) { self.die(); } else { LK.effects.flashObject(self, 0xff0000, 200); } }; self.die = function () { LK.getSound('zombie_die').play(); // Drop coin var coin = new Coin(); coin.x = self.x; coin.y = self.y; coins.push(coin); game.addChild(coin); self.destroy(); var idx = zombies.indexOf(self); if (idx !== -1) zombies.splice(idx, 1); zombiesKilledThisWave++; }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x222222 }); /**** * Game Code ****/ // Sounds // Tower // Trap // Wall // Coin // Bullet // Zombie // Character (player) // Global variables var player; var zombies = []; var bullets = []; var coins = []; var defenses = []; var coinsCollected = 0; var currentWave = 1; var zombiesToSpawn = 0; var zombiesSpawnedThisWave = 0; var zombiesKilledThisWave = 0; var waveInProgress = false; var dragNode = null; var buildMode = null; // 'wall', 'trap', 'tower', 'upgrade' var buildPreview = null; var buildCost = { wall: 5, trap: 7, tower: 12, upgrade: 10 }; var buildNames = { wall: "Duvar", trap: "Tuzak", tower: "Kule", upgrade: "Silah+" }; var buildDesc = { wall: "Zombileri yavaşlatır, 6 can.", trap: "Zombiye temas edince yok olur, 2 can.", tower: "Otomatik ateş eder, 8 can.", upgrade: "Silahı güçlendirir." }; var hpBar, coinText, waveText, buildPanel, buildButtons = []; var lastTouchX = 0, lastTouchY = 0; // UI: HP Bar function updateHpBar() { if (!hpBar) return; var txt = ""; for (var i = 0; i < player.maxHp; i++) { txt += i < player.hp ? "♥ " : "♡ "; } hpBar.setText(txt); } // UI: Coin Text function updateCoinText() { if (coinText) coinText.setText("₺ " + coinsCollected); } // UI: Wave Text function updateWaveText() { if (waveText) waveText.setText("Dalga: " + currentWave); } // UI: Build Panel function createBuildPanel() { buildPanel = new Container(); buildPanel.y = 0; buildPanel.x = 0; var btnW = 320, btnH = 120, gap = 30; var types = ['wall', 'trap', 'tower', 'upgrade']; for (var i = 0; i < types.length; i++) { (function (type, idx) { var btn = new Container(); var bg = LK.getAsset('wall', { width: btnW, height: btnH, color: 0x333333, anchorX: 0, anchorY: 0 }); btn.addChild(bg); var txt = new Text2(buildNames[type] + "\n₺" + buildCost[type], { size: 48, fill: "#fff" }); txt.x = btnW / 2; txt.y = 20; txt.anchor.set(0.5, 0); btn.addChild(txt); var desc = new Text2(buildDesc[type], { size: 32, fill: "#ccc" }); desc.x = btnW / 2; desc.y = 70; desc.anchor.set(0.5, 0); btn.addChild(desc); btn.x = idx * (btnW + gap); btn.y = 0; btn.type = type; btn.down = function (x, y, obj) { setBuildMode(type); }; buildPanel.addChild(btn); buildButtons.push(btn); })(types[i], i); } LK.gui.bottom.addChild(buildPanel); } // Set build mode function setBuildMode(type) { buildMode = type; if (buildPreview) { buildPreview.destroy(); buildPreview = null; } if (type === 'wall') { buildPreview = new Wall(); } else if (type === 'trap') { buildPreview = new Trap(); } else if (type === 'tower') { buildPreview = new Tower(); } else if (type === 'upgrade') { buildPreview = null; } if (buildPreview) { buildPreview.alpha = 0.5; game.addChild(buildPreview); } } // Remove build preview function clearBuildPreview() { if (buildPreview) { buildPreview.destroy(); buildPreview = null; } buildMode = null; } // Start new wave function startWave() { zombiesToSpawn = 5 + currentWave * 2; zombiesSpawnedThisWave = 0; zombiesKilledThisWave = 0; waveInProgress = true; updateWaveText(); } // Spawn zombie function spawnZombie() { // Spawn at random edge var edge = Math.floor(Math.random() * 4); var zx, zy; if (edge === 0) { // top zx = 200 + Math.random() * (2048 - 400); zy = -60; } else if (edge === 1) { // right zx = 2048 + 60; zy = 200 + Math.random() * (2732 - 400); } else if (edge === 2) { // bottom zx = 200 + Math.random() * (2048 - 400); zy = 2732 + 60; } else { // left zx = -60; zy = 200 + Math.random() * (2732 - 400); } var z = new Zombie(); z.x = zx; z.y = zy; zombies.push(z); game.addChild(z); zombiesSpawnedThisWave++; } // Build defense function buildDefense(type, x, y) { if (coinsCollected < buildCost[type]) return false; var obj; if (type === 'wall') { obj = new Wall(); } else if (type === 'trap') { obj = new Trap(); } else if (type === 'tower') { obj = new Tower(); } if (obj) { obj.x = x; obj.y = y; defenses.push(obj); game.addChild(obj); coinsCollected -= buildCost[type]; updateCoinText(); LK.getSound('build').play(); return true; } return false; } // Upgrade weapon function upgradeWeapon() { if (coinsCollected < buildCost.upgrade) return false; player.weaponLevel++; coinsCollected -= buildCost.upgrade; updateCoinText(); LK.effects.flashObject(player, 0xffff00, 600); LK.getSound('build').play(); return true; } // Handle move (drag, build preview, collect coin) function handleMove(x, y, obj) { lastTouchX = x; lastTouchY = y; // Drag player if (dragNode === player) { // Clamp to game area var r = player.radius + 10; player.x = Math.max(r, Math.min(2048 - r, x)); player.y = Math.max(r, Math.min(2732 - r, y)); } // Build preview follows finger if (buildPreview) { buildPreview.x = x; buildPreview.y = y; } // Coin collection for (var i = coins.length - 1; i >= 0; i--) { var c = coins[i]; var dx = c.x - x, dy = c.y - y; if (!c.collected && dx * dx + dy * dy < c.radius * c.radius + 1200) { c.collect(); } } } // Handle down (start drag, build, upgrade) game.down = function (x, y, obj) { // If build mode is active if (buildMode) { if (buildMode === 'upgrade') { if (upgradeWeapon()) { clearBuildPreview(); } } else { // Place defense if possible if (buildPreview) { // Don't allow build on player or on top of other defenses var canBuild = true; var dx = player.x - x, dy = player.y - y; if (dx * dx + dy * dy < (player.radius + buildPreview.radius + 40) * (player.radius + buildPreview.radius + 40)) { canBuild = false; } for (var i = 0; i < defenses.length; i++) { var d = defenses[i]; var ddx = d.x - x, ddy = d.y - y; if (ddx * ddx + ddy * ddy < (d.radius + buildPreview.radius + 30) * (d.radius + buildPreview.radius + 30)) { canBuild = false; break; } } if (canBuild && buildDefense(buildMode, x, y)) { clearBuildPreview(); } } } return; } // If touch on player, start drag var dx = player.x - x, dy = player.y - y; if (dx * dx + dy * dy < player.radius * player.radius + 2000) { dragNode = player; } else { // Shoot towards touch player.shoot(x, y); } handleMove(x, y, obj); }; // Handle up (stop drag, clear build preview) game.up = function (x, y, obj) { dragNode = null; // If build preview exists, clear it if not placed if (buildPreview && buildMode) { clearBuildPreview(); } }; // Handle move game.move = handleMove; // Game update game.update = function () { // Player update player.update(); // Zombies update for (var i = zombies.length - 1; i >= 0; i--) { zombies[i].update(); } // Bullets update for (var i = bullets.length - 1; i >= 0; i--) { var b = bullets[i]; b.update(); // Remove if out of bounds if (b.x < -100 || b.x > 2148 || b.y < -100 || b.y > 2832) { b.destroy(); bullets.splice(i, 1); continue; } // Check collision with zombies for (var j = zombies.length - 1; j >= 0; j--) { var z = zombies[j]; var dx = z.x - b.x, dy = z.y - b.y; if (dx * dx + dy * dy < (z.radius + b.radius) * (z.radius + b.radius)) { z.takeDamage(b.damage); b.destroy(); bullets.splice(i, 1); break; } } } // Coins update for (var i = coins.length - 1; i >= 0; i--) { coins[i].update(); } // Defenses update for (var i = defenses.length - 1; i >= 0; i--) { if (defenses[i].update) defenses[i].update(); } // Wave logic if (waveInProgress) { // Spawn zombies if (zombiesSpawnedThisWave < zombiesToSpawn && LK.ticks % Math.max(20, 60 - currentWave * 2) === 0) { spawnZombie(); } // Check wave end if (zombiesKilledThisWave >= zombiesToSpawn && zombies.length === 0) { waveInProgress = false; // Next wave after short delay LK.setTimeout(function () { currentWave++; startWave(); }, 1800); } } }; // --- Game Initialization --- // Place player at center player = new Player(); player.x = 2048 / 2; player.y = 2732 / 2; game.addChild(player); // UI: HP Bar hpBar = new Text2("", { size: 80, fill: 0xFF4444 }); hpBar.anchor.set(0.5, 0); LK.gui.top.addChild(hpBar); hpBar.x = 2048 / 2; hpBar.y = 20; updateHpBar(); // UI: Coin Text coinText = new Text2("₺ 0", { size: 70, fill: 0xFFE066 }); coinText.anchor.set(1, 0); LK.gui.topRight.addChild(coinText); coinText.x = -40; coinText.y = 20; // UI: Wave Text waveText = new Text2("Dalga: 1", { size: 60, fill: "#fff" }); waveText.anchor.set(0, 0); LK.gui.top.addChild(waveText); waveText.x = 60; waveText.y = 120; // UI: Build Panel createBuildPanel(); // Start first wave startWave(); updateCoinText(); updateWaveText();
===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,700 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+var storage = LK.import("@upit/storage.v1");
+
+/****
+* Classes
+****/
+// Bullet class
+var Bullet = Container.expand(function () {
+ var self = Container.call(this);
+ var bulletSprite = self.attachAsset('bullet', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.radius = bulletSprite.width / 2;
+ self.vx = 0;
+ self.vy = 0;
+ self.damage = 1;
+ self.update = function () {
+ self.x += self.vx;
+ self.y += self.vy;
+ };
+ return self;
+});
+// Coin class
+var Coin = Container.expand(function () {
+ var self = Container.call(this);
+ var coinSprite = self.attachAsset('coin', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.radius = coinSprite.width / 2;
+ self.vy = 4;
+ self.collected = false;
+ self.update = function () {
+ if (!self.collected) {
+ self.y += self.vy;
+ if (self.y > 2732 - 80) self.vy = 0;
+ }
+ };
+ self.collect = function () {
+ if (self.collected) return;
+ self.collected = true;
+ LK.getSound('coin').play();
+ // Animate to coinText
+ var guiPos = LK.gui.topRight.toLocal(game.toGlobal({
+ x: self.x,
+ y: self.y
+ }));
+ var startX = self.x,
+ startY = self.y;
+ var endX = 2048 - 200,
+ endY = 80;
+ tween(self, {
+ x: endX,
+ y: endY,
+ alpha: 0
+ }, {
+ duration: 400,
+ easing: tween.cubicIn,
+ onFinish: function onFinish() {
+ self.destroy();
+ var idx = coins.indexOf(self);
+ if (idx !== -1) coins.splice(idx, 1);
+ coinsCollected++;
+ updateCoinText();
+ }
+ });
+ };
+ return self;
+});
+// Player class
+var Player = Container.expand(function () {
+ var self = Container.call(this);
+ var playerSprite = self.attachAsset('player', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.radius = playerSprite.width / 2;
+ self.hp = 5;
+ self.maxHp = 5;
+ self.shootCooldown = 0;
+ self.shootDelay = 20; // frames
+ self.weaponLevel = 1;
+ self.lastShotTick = 0;
+ // For drag
+ self.down = function (x, y, obj) {};
+ self.up = function (x, y, obj) {};
+ self.update = function () {
+ if (self.shootCooldown > 0) self.shootCooldown--;
+ };
+ // Shoot method
+ self.shoot = function (targetX, targetY) {
+ if (self.shootCooldown > 0) return;
+ var dx = targetX - self.x;
+ var dy = targetY - self.y;
+ var len = Math.sqrt(dx * dx + dy * dy);
+ if (len === 0) return;
+ dx /= len;
+ dy /= len;
+ var bullet = new Bullet();
+ bullet.x = self.x + dx * (self.radius + 30);
+ bullet.y = self.y + dy * (self.radius + 30);
+ bullet.vx = dx * (22 + self.weaponLevel * 2);
+ bullet.vy = dy * (22 + self.weaponLevel * 2);
+ bullet.damage = self.weaponLevel;
+ bullets.push(bullet);
+ game.addChild(bullet);
+ LK.getSound('shoot').play();
+ self.shootCooldown = self.shootDelay;
+ };
+ // Take damage
+ self.takeDamage = function (amount) {
+ self.hp -= amount;
+ if (self.hp < 0) self.hp = 0;
+ LK.effects.flashObject(self, 0xff0000, 300);
+ updateHpBar();
+ if (self.hp <= 0) {
+ LK.effects.flashScreen(0xff0000, 1000);
+ LK.showGameOver();
+ }
+ };
+ return self;
+});
+// Tower class
+var Tower = Container.expand(function () {
+ var self = Container.call(this);
+ var towerSprite = self.attachAsset('tower', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.radius = Math.max(towerSprite.width, towerSprite.height) / 2;
+ self.hp = 8;
+ self.maxHp = 8;
+ self.shootCooldown = 0;
+ self.shootDelay = 40;
+ self.takeDamage = function (amount) {
+ self.hp -= amount;
+ LK.effects.flashObject(self, 0xff0000, 200);
+ if (self.hp <= 0) {
+ self.destroy();
+ var idx = defenses.indexOf(self);
+ if (idx !== -1) defenses.splice(idx, 1);
+ }
+ };
+ self.update = function () {
+ if (self.shootCooldown > 0) self.shootCooldown--;
+ // Find nearest zombie
+ var nearest = null,
+ minDist = 99999;
+ for (var i = 0; i < zombies.length; i++) {
+ var z = zombies[i];
+ var dx = z.x - self.x;
+ var dy = z.y - self.y;
+ var dist = dx * dx + dy * dy;
+ if (dist < minDist) {
+ minDist = dist;
+ nearest = z;
+ }
+ }
+ if (nearest && self.shootCooldown <= 0) {
+ // Shoot at nearest zombie
+ var dx = nearest.x - self.x;
+ var dy = nearest.y - self.y;
+ var len = Math.sqrt(dx * dx + dy * dy);
+ if (len > 0) {
+ dx /= len;
+ dy /= len;
+ var bullet = new Bullet();
+ bullet.x = self.x + dx * (self.radius + 20);
+ bullet.y = self.y + dy * (self.radius + 20);
+ bullet.vx = dx * 18;
+ bullet.vy = dy * 18;
+ bullet.damage = 1;
+ bullets.push(bullet);
+ game.addChild(bullet);
+ LK.getSound('shoot').play();
+ self.shootCooldown = self.shootDelay;
+ }
+ }
+ };
+ return self;
+});
+// Trap class
+var Trap = Container.expand(function () {
+ var self = Container.call(this);
+ var trapSprite = self.attachAsset('trap', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.radius = Math.max(trapSprite.width, trapSprite.height) / 2;
+ self.hp = 2;
+ self.maxHp = 2;
+ self.takeDamage = function (amount) {
+ self.hp -= amount;
+ LK.effects.flashObject(self, 0xff0000, 200);
+ if (self.hp <= 0) {
+ self.destroy();
+ var idx = defenses.indexOf(self);
+ if (idx !== -1) defenses.splice(idx, 1);
+ }
+ };
+ return self;
+});
+// Wall class
+var Wall = Container.expand(function () {
+ var self = Container.call(this);
+ var wallSprite = self.attachAsset('wall', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.radius = Math.max(wallSprite.width, wallSprite.height) / 2;
+ self.hp = 6;
+ self.maxHp = 6;
+ self.takeDamage = function (amount) {
+ self.hp -= amount;
+ LK.effects.flashObject(self, 0xff0000, 200);
+ if (self.hp <= 0) {
+ self.destroy();
+ var idx = defenses.indexOf(self);
+ if (idx !== -1) defenses.splice(idx, 1);
+ }
+ };
+ return self;
+});
+// Zombie class
+var Zombie = Container.expand(function () {
+ var self = Container.call(this);
+ var zombieSprite = self.attachAsset('zombie', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.radius = zombieSprite.width / 2;
+ self.speed = 2 + currentWave * 0.3;
+ self.hp = 1 + Math.floor(currentWave / 2);
+ self.maxHp = self.hp;
+ self.target = null;
+ self.lastHitTick = 0;
+ self.update = function () {
+ // Move towards player
+ var tx = player.x;
+ var ty = player.y;
+ // If wall/trap/tower is closer, target that
+ var minDist = Math.sqrt((self.x - tx) * (self.x - tx) + (self.y - ty) * (self.y - ty));
+ var targetObj = player;
+ for (var i = 0; i < defenses.length; i++) {
+ var d = defenses[i];
+ var dist = Math.sqrt((self.x - d.x) * (self.x - d.x) + (self.y - d.y) * (self.y - d.y));
+ if (dist < minDist) {
+ minDist = dist;
+ targetObj = d;
+ }
+ }
+ self.target = targetObj;
+ var dx = targetObj.x - self.x;
+ var dy = targetObj.y - self.y;
+ var len = Math.sqrt(dx * dx + dy * dy);
+ if (len > 0) {
+ dx /= len;
+ dy /= len;
+ self.x += dx * self.speed;
+ self.y += dy * self.speed;
+ }
+ // Attack if close
+ if (len < self.radius + targetObj.radius + 10) {
+ if (LK.ticks - self.lastHitTick > 30) {
+ if (targetObj === player) {
+ player.takeDamage(1);
+ } else if (targetObj.takeDamage) {
+ targetObj.takeDamage(1);
+ }
+ self.lastHitTick = LK.ticks;
+ }
+ }
+ };
+ self.takeDamage = function (amount) {
+ self.hp -= amount;
+ if (self.hp <= 0) {
+ self.die();
+ } else {
+ LK.effects.flashObject(self, 0xff0000, 200);
+ }
+ };
+ self.die = function () {
+ LK.getSound('zombie_die').play();
+ // Drop coin
+ var coin = new Coin();
+ coin.x = self.x;
+ coin.y = self.y;
+ coins.push(coin);
+ game.addChild(coin);
+ self.destroy();
+ var idx = zombies.indexOf(self);
+ if (idx !== -1) zombies.splice(idx, 1);
+ zombiesKilledThisWave++;
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x222222
+});
+
+/****
+* Game Code
+****/
+// Sounds
+// Tower
+// Trap
+// Wall
+// Coin
+// Bullet
+// Zombie
+// Character (player)
+// Global variables
+var player;
+var zombies = [];
+var bullets = [];
+var coins = [];
+var defenses = [];
+var coinsCollected = 0;
+var currentWave = 1;
+var zombiesToSpawn = 0;
+var zombiesSpawnedThisWave = 0;
+var zombiesKilledThisWave = 0;
+var waveInProgress = false;
+var dragNode = null;
+var buildMode = null; // 'wall', 'trap', 'tower', 'upgrade'
+var buildPreview = null;
+var buildCost = {
+ wall: 5,
+ trap: 7,
+ tower: 12,
+ upgrade: 10
+};
+var buildNames = {
+ wall: "Duvar",
+ trap: "Tuzak",
+ tower: "Kule",
+ upgrade: "Silah+"
+};
+var buildDesc = {
+ wall: "Zombileri yavaşlatır, 6 can.",
+ trap: "Zombiye temas edince yok olur, 2 can.",
+ tower: "Otomatik ateş eder, 8 can.",
+ upgrade: "Silahı güçlendirir."
+};
+var hpBar,
+ coinText,
+ waveText,
+ buildPanel,
+ buildButtons = [];
+var lastTouchX = 0,
+ lastTouchY = 0;
+// UI: HP Bar
+function updateHpBar() {
+ if (!hpBar) return;
+ var txt = "";
+ for (var i = 0; i < player.maxHp; i++) {
+ txt += i < player.hp ? "♥ " : "♡ ";
+ }
+ hpBar.setText(txt);
+}
+// UI: Coin Text
+function updateCoinText() {
+ if (coinText) coinText.setText("₺ " + coinsCollected);
+}
+// UI: Wave Text
+function updateWaveText() {
+ if (waveText) waveText.setText("Dalga: " + currentWave);
+}
+// UI: Build Panel
+function createBuildPanel() {
+ buildPanel = new Container();
+ buildPanel.y = 0;
+ buildPanel.x = 0;
+ var btnW = 320,
+ btnH = 120,
+ gap = 30;
+ var types = ['wall', 'trap', 'tower', 'upgrade'];
+ for (var i = 0; i < types.length; i++) {
+ (function (type, idx) {
+ var btn = new Container();
+ var bg = LK.getAsset('wall', {
+ width: btnW,
+ height: btnH,
+ color: 0x333333,
+ anchorX: 0,
+ anchorY: 0
+ });
+ btn.addChild(bg);
+ var txt = new Text2(buildNames[type] + "\n₺" + buildCost[type], {
+ size: 48,
+ fill: "#fff"
+ });
+ txt.x = btnW / 2;
+ txt.y = 20;
+ txt.anchor.set(0.5, 0);
+ btn.addChild(txt);
+ var desc = new Text2(buildDesc[type], {
+ size: 32,
+ fill: "#ccc"
+ });
+ desc.x = btnW / 2;
+ desc.y = 70;
+ desc.anchor.set(0.5, 0);
+ btn.addChild(desc);
+ btn.x = idx * (btnW + gap);
+ btn.y = 0;
+ btn.type = type;
+ btn.down = function (x, y, obj) {
+ setBuildMode(type);
+ };
+ buildPanel.addChild(btn);
+ buildButtons.push(btn);
+ })(types[i], i);
+ }
+ LK.gui.bottom.addChild(buildPanel);
+}
+// Set build mode
+function setBuildMode(type) {
+ buildMode = type;
+ if (buildPreview) {
+ buildPreview.destroy();
+ buildPreview = null;
+ }
+ if (type === 'wall') {
+ buildPreview = new Wall();
+ } else if (type === 'trap') {
+ buildPreview = new Trap();
+ } else if (type === 'tower') {
+ buildPreview = new Tower();
+ } else if (type === 'upgrade') {
+ buildPreview = null;
+ }
+ if (buildPreview) {
+ buildPreview.alpha = 0.5;
+ game.addChild(buildPreview);
+ }
+}
+// Remove build preview
+function clearBuildPreview() {
+ if (buildPreview) {
+ buildPreview.destroy();
+ buildPreview = null;
+ }
+ buildMode = null;
+}
+// Start new wave
+function startWave() {
+ zombiesToSpawn = 5 + currentWave * 2;
+ zombiesSpawnedThisWave = 0;
+ zombiesKilledThisWave = 0;
+ waveInProgress = true;
+ updateWaveText();
+}
+// Spawn zombie
+function spawnZombie() {
+ // Spawn at random edge
+ var edge = Math.floor(Math.random() * 4);
+ var zx, zy;
+ if (edge === 0) {
+ // top
+ zx = 200 + Math.random() * (2048 - 400);
+ zy = -60;
+ } else if (edge === 1) {
+ // right
+ zx = 2048 + 60;
+ zy = 200 + Math.random() * (2732 - 400);
+ } else if (edge === 2) {
+ // bottom
+ zx = 200 + Math.random() * (2048 - 400);
+ zy = 2732 + 60;
+ } else {
+ // left
+ zx = -60;
+ zy = 200 + Math.random() * (2732 - 400);
+ }
+ var z = new Zombie();
+ z.x = zx;
+ z.y = zy;
+ zombies.push(z);
+ game.addChild(z);
+ zombiesSpawnedThisWave++;
+}
+// Build defense
+function buildDefense(type, x, y) {
+ if (coinsCollected < buildCost[type]) return false;
+ var obj;
+ if (type === 'wall') {
+ obj = new Wall();
+ } else if (type === 'trap') {
+ obj = new Trap();
+ } else if (type === 'tower') {
+ obj = new Tower();
+ }
+ if (obj) {
+ obj.x = x;
+ obj.y = y;
+ defenses.push(obj);
+ game.addChild(obj);
+ coinsCollected -= buildCost[type];
+ updateCoinText();
+ LK.getSound('build').play();
+ return true;
+ }
+ return false;
+}
+// Upgrade weapon
+function upgradeWeapon() {
+ if (coinsCollected < buildCost.upgrade) return false;
+ player.weaponLevel++;
+ coinsCollected -= buildCost.upgrade;
+ updateCoinText();
+ LK.effects.flashObject(player, 0xffff00, 600);
+ LK.getSound('build').play();
+ return true;
+}
+// Handle move (drag, build preview, collect coin)
+function handleMove(x, y, obj) {
+ lastTouchX = x;
+ lastTouchY = y;
+ // Drag player
+ if (dragNode === player) {
+ // Clamp to game area
+ var r = player.radius + 10;
+ player.x = Math.max(r, Math.min(2048 - r, x));
+ player.y = Math.max(r, Math.min(2732 - r, y));
+ }
+ // Build preview follows finger
+ if (buildPreview) {
+ buildPreview.x = x;
+ buildPreview.y = y;
+ }
+ // Coin collection
+ for (var i = coins.length - 1; i >= 0; i--) {
+ var c = coins[i];
+ var dx = c.x - x,
+ dy = c.y - y;
+ if (!c.collected && dx * dx + dy * dy < c.radius * c.radius + 1200) {
+ c.collect();
+ }
+ }
+}
+// Handle down (start drag, build, upgrade)
+game.down = function (x, y, obj) {
+ // If build mode is active
+ if (buildMode) {
+ if (buildMode === 'upgrade') {
+ if (upgradeWeapon()) {
+ clearBuildPreview();
+ }
+ } else {
+ // Place defense if possible
+ if (buildPreview) {
+ // Don't allow build on player or on top of other defenses
+ var canBuild = true;
+ var dx = player.x - x,
+ dy = player.y - y;
+ if (dx * dx + dy * dy < (player.radius + buildPreview.radius + 40) * (player.radius + buildPreview.radius + 40)) {
+ canBuild = false;
+ }
+ for (var i = 0; i < defenses.length; i++) {
+ var d = defenses[i];
+ var ddx = d.x - x,
+ ddy = d.y - y;
+ if (ddx * ddx + ddy * ddy < (d.radius + buildPreview.radius + 30) * (d.radius + buildPreview.radius + 30)) {
+ canBuild = false;
+ break;
+ }
+ }
+ if (canBuild && buildDefense(buildMode, x, y)) {
+ clearBuildPreview();
+ }
+ }
+ }
+ return;
+ }
+ // If touch on player, start drag
+ var dx = player.x - x,
+ dy = player.y - y;
+ if (dx * dx + dy * dy < player.radius * player.radius + 2000) {
+ dragNode = player;
+ } else {
+ // Shoot towards touch
+ player.shoot(x, y);
+ }
+ handleMove(x, y, obj);
+};
+// Handle up (stop drag, clear build preview)
+game.up = function (x, y, obj) {
+ dragNode = null;
+ // If build preview exists, clear it if not placed
+ if (buildPreview && buildMode) {
+ clearBuildPreview();
+ }
+};
+// Handle move
+game.move = handleMove;
+// Game update
+game.update = function () {
+ // Player update
+ player.update();
+ // Zombies update
+ for (var i = zombies.length - 1; i >= 0; i--) {
+ zombies[i].update();
+ }
+ // Bullets update
+ for (var i = bullets.length - 1; i >= 0; i--) {
+ var b = bullets[i];
+ b.update();
+ // Remove if out of bounds
+ if (b.x < -100 || b.x > 2148 || b.y < -100 || b.y > 2832) {
+ b.destroy();
+ bullets.splice(i, 1);
+ continue;
+ }
+ // Check collision with zombies
+ for (var j = zombies.length - 1; j >= 0; j--) {
+ var z = zombies[j];
+ var dx = z.x - b.x,
+ dy = z.y - b.y;
+ if (dx * dx + dy * dy < (z.radius + b.radius) * (z.radius + b.radius)) {
+ z.takeDamage(b.damage);
+ b.destroy();
+ bullets.splice(i, 1);
+ break;
+ }
+ }
+ }
+ // Coins update
+ for (var i = coins.length - 1; i >= 0; i--) {
+ coins[i].update();
+ }
+ // Defenses update
+ for (var i = defenses.length - 1; i >= 0; i--) {
+ if (defenses[i].update) defenses[i].update();
+ }
+ // Wave logic
+ if (waveInProgress) {
+ // Spawn zombies
+ if (zombiesSpawnedThisWave < zombiesToSpawn && LK.ticks % Math.max(20, 60 - currentWave * 2) === 0) {
+ spawnZombie();
+ }
+ // Check wave end
+ if (zombiesKilledThisWave >= zombiesToSpawn && zombies.length === 0) {
+ waveInProgress = false;
+ // Next wave after short delay
+ LK.setTimeout(function () {
+ currentWave++;
+ startWave();
+ }, 1800);
+ }
+ }
+};
+// --- Game Initialization ---
+// Place player at center
+player = new Player();
+player.x = 2048 / 2;
+player.y = 2732 / 2;
+game.addChild(player);
+// UI: HP Bar
+hpBar = new Text2("", {
+ size: 80,
+ fill: 0xFF4444
+});
+hpBar.anchor.set(0.5, 0);
+LK.gui.top.addChild(hpBar);
+hpBar.x = 2048 / 2;
+hpBar.y = 20;
+updateHpBar();
+// UI: Coin Text
+coinText = new Text2("₺ 0", {
+ size: 70,
+ fill: 0xFFE066
+});
+coinText.anchor.set(1, 0);
+LK.gui.topRight.addChild(coinText);
+coinText.x = -40;
+coinText.y = 20;
+// UI: Wave Text
+waveText = new Text2("Dalga: 1", {
+ size: 60,
+ fill: "#fff"
+});
+waveText.anchor.set(0, 0);
+LK.gui.top.addChild(waveText);
+waveText.x = 60;
+waveText.y = 120;
+// UI: Build Panel
+createBuildPanel();
+// Start first wave
+startWave();
+updateCoinText();
+updateWaveText();
\ No newline at end of file
9mm ammo. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
içinde c yazan sarı renkli bir madeni para. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
clash of clans klan kalesi. In-Game asset. 2d. High contrast. No shadows
the zombie. In-Game asset. 2d. High contrast. No shadows
gray block. In-Game asset. 2d. High contrast. No shadows
trap. In-Game asset. 2d. High contrast. No shadows
arazi pxelart sadece yeşillikle dolu. In-Game asset. 2d. High contrast. No shadows
elinde silahı olan bir asker. In-Game asset. 2d. High contrast. No shadows