User prompt
bireaz daha
User prompt
biraz daha buyutelim
User prompt
paraların hıtbox ını bıraz buyutebiliriz
User prompt
dalgalar arasındaki süreyi 5 saniye yapalım
User prompt
dalgalar arasındaki süreyi 13 sanıye yapalım
User prompt
tuzak ın açıklamasını bıraz daha küçültebiliriz
User prompt
altınlar zombiden dustkden sonra yere duşmesın aynı yerinde kalsın
User prompt
butonların açıklamalarınıın yazılarını biraz küçültelim
User prompt
yine birazcık cok hafif bi tık sola
User prompt
hafif bi tık daha sola
User prompt
biraz küçültelim
User prompt
biraz daha sola
User prompt
ve biraz aşşağıya alalım
User prompt
biraz daha sola
User prompt
sag alttakı butonları bı tık daha yukarı alıp biraz sola al
User prompt
sağ alttakı butonları bıraz yukarı alü
User prompt
teleport the chacachter where player clık with middle mause button click
User prompt
karakter farenın orta tuşu ile nereye tıklarsak oraya ışınlansın
User prompt
farenın sağ tuşu ile hareket ettirelim karakteri
User prompt
farenın 3. tuşu ile hareket ettirelim karakteri
User prompt
karakteri hareket ettirmek için farenın sol tuşu ile tutup surukleyecegiz ve suruklediğiiz yere gidecek
User prompt
karakteri farenın sağ tıkıyla hareket ettirip sol tıkıyla ate edelim
User prompt
son yaptıgımız değişikliği geri al
User prompt
karakterimiz i ekranın sol tarafını surukleyerek kontrol edelim ve ne tarafa dokunrsak da oraya ateş etsin
User prompt
ozaman dalgalar arasına 20 sanıye zaman ekleyelim
/**** * 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 * 1.5; // Even further increase hitbox radius for much easier collection // Remove vy and falling logic so coin stays at spawn position self.collected = false; self.update = function () { // No falling, coin stays at its spawn position }; 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 = 220, btnH = 80, gap = 24; 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: 32, fill: "#fff" }); txt.x = btnW / 2; txt.y = 12; txt.anchor.set(0.5, 0); btn.addChild(txt); var descFontSize = type === 'trap' ? 13 : 16; var desc = new Text2(buildDesc[type], { size: descFontSize, fill: "#ccc" }); desc.x = btnW / 2; desc.y = 46; desc.anchor.set(0.5, 0); btn.addChild(desc); btn.x = idx * (btnW + gap) - 100; // Move each button 100px to the left btn.y = 0; btn.type = type; btn.down = function (x, y, obj) { setBuildMode(type); }; buildPanel.addChild(btn); buildButtons.push(btn); })(types[i], i); } buildPanel.y = -120; // Move the build panel further up by 120px (closer to bottom) buildPanel.x = -540; // Move the build panel a tiny bit further to the left 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; } // Only handle mouse/touch events with event object var event = obj && obj.event ? obj.event : null; var isLeftClick = false; var isMiddleClick = false; // Mouse events if (event && typeof event.button !== "undefined") { // 0: left, 1: middle if (event.button === 0) isLeftClick = true; if (event.button === 1) isMiddleClick = true; } else { // Touch events: treat as left click (drag/shoot) isLeftClick = true; } if (isMiddleClick) { // Teleport player to clicked position, 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)); } else if (isLeftClick) { // If click/touch is 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 { // Otherwise, shoot player.shoot(x, y); } } handleMove(x, y, obj); }; // Prevent context menu on right click for the canvas if (typeof window !== "undefined" && typeof document !== "undefined") { var canvas = document.querySelector('canvas'); if (canvas) { canvas.oncontextmenu = function (e) { e.preventDefault(); return false; }; } } // 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 5 seconds (5000 ms) LK.setTimeout(function () { currentWave++; startWave(); }, 5000); } } }; // --- 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
@@ -30,9 +30,9 @@
var coinSprite = self.attachAsset('coin', {
anchorX: 0.5,
anchorY: 0.5
});
- self.radius = coinSprite.width * 1.2; // Further increase hitbox radius for even easier collection
+ self.radius = coinSprite.width * 1.5; // Even further increase hitbox radius for much easier collection
// Remove vy and falling logic so coin stays at spawn position
self.collected = false;
self.update = function () {
// No falling, coin stays at its spawn position
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