User prompt
her çağ için arka planları assetlerden yararlanarak oyuna entegre et
User prompt
Modern çağ için arka plan assets i oluştur
User prompt
Medieval devri için arka plan asseti oluştur
User prompt
stone çağı için arka plan asseti oluştur
User prompt
Her çağ için arka plan asseti oluştur
User prompt
düşman tek bir düzlem boyunca hareket etsin
User prompt
çağ atladıkça karakterin ateş hızını arttır
User prompt
düşmanın geliş hızını yavaşlat
User prompt
düşman karakterlerin doğması için bi kule yap
User prompt
düşmanlarsan sağdan sola gelsinler
User prompt
savaşı yatay düzlemde pozisyonlandır
Code edit (1 edits merged)
Please save this source code
User prompt
Çağlar Savaşı
Initial prompt
çağlar savaşı oyunu yap
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ // Defender class (minimal implementation, can be expanded as needed) var Defender = Container.expand(function () { var self = Container.call(this); self.currentAge = 0; // Defender asset references for each age self.defenderAssets = [self.attachAsset('defender_stone', { anchorX: 0.5, anchorY: 0.5, visible: true }), self.attachAsset('defender_medieval', { anchorX: 0.5, anchorY: 0.5, visible: false }), self.attachAsset('defender_modern', { anchorX: 0.5, anchorY: 0.5, visible: false })]; // Set defender appearance by age self.setAge = function (age) { self.currentAge = age; for (var i = 0; i < self.defenderAssets.length; i++) { self.defenderAssets[i].visible = i === age; } }; // Default to age 0 self.setAge(0); return self; }); // Enemy class (minimal implementation, can be expanded as needed) var Enemy = Container.expand(function () { var self = Container.call(this); self.currentAge = 0; // Enemy asset references for each age self.enemyAssets = [self.attachAsset('enemy_stone', { anchorX: 0.5, anchorY: 0.5, visible: true }), self.attachAsset('enemy_medieval', { anchorX: 0.5, anchorY: 0.5, visible: false }), self.attachAsset('enemy_modern', { anchorX: 0.5, anchorY: 0.5, visible: false })]; // Set enemy appearance by age self.setAge = function (age) { self.currentAge = age; for (var i = 0; i < self.enemyAssets.length; i++) { self.enemyAssets[i].visible = i === age; } }; // Default to age 0 self.setAge(0); // Default speed (can be overridden) self.speed = 3; // Update method for movement self.update = function () { if (typeof self.lastX === "undefined") self.lastX = self.x; // Move left by speed self.x -= self.speed; self.lastX = self.x; }; return self; }); // EnemyTower class (minimal implementation, can be expanded as needed) var EnemyTower = Container.expand(function () { var self = Container.call(this); // Store current age for asset switching self.currentAge = 0; // Tower asset references for each age self.towerAssets = [self.attachAsset('tower_stone', { anchorX: 0.5, anchorY: 0.5, visible: true }), self.attachAsset('tower_medieval', { anchorX: 0.5, anchorY: 0.5, visible: false }), self.attachAsset('tower_modern', { anchorX: 0.5, anchorY: 0.5, visible: false })]; // Set tower appearance by age self.setAge = function (age) { self.currentAge = age; for (var i = 0; i < self.towerAssets.length; i++) { self.towerAssets[i].visible = i === age; } }; // Default to age 0 self.setAge(0); return self; }); // AI-controlled support defender class var NpcDefender = Container.expand(function () { var self = Container.call(this); self.currentAge = 0; // Defender asset references for each age self.defenderAssets = [self.attachAsset('defender_stone', { anchorX: 0.5, anchorY: 0.5, visible: true }), self.attachAsset('defender_medieval', { anchorX: 0.5, anchorY: 0.5, visible: false }), self.attachAsset('defender_modern', { anchorX: 0.5, anchorY: 0.5, visible: false })]; // Set defender appearance by age self.setAge = function (age) { self.currentAge = age; for (var i = 0; i < self.defenderAssets.length; i++) { self.defenderAssets[i].visible = i === age; } }; // Default to age 0 self.setAge(0); // AI shooting cooldowns (same as player) self.shootCooldowns = [300, 180, 100]; self.shootCooldown = self.shootCooldowns[0]; self.lastShotTime = 0; // AI shoot logic: find nearest enemy and shoot self.tryShoot = function () { if (typeof enemies === "undefined" || enemies.length === 0) return; var now = Date.now(); if (now - self.lastShotTime < self.shootCooldown) return; // Find nearest enemy var minDist = Infinity; var targetEnemy = null; for (var i = 0; i < enemies.length; i++) { var e = enemies[i]; var dx = e.x - self.x; var dy = e.y - self.y; var dist = dx * dx + dy * dy; if (dist < minDist) { minDist = dist; targetEnemy = e; } } if (targetEnemy) { var proj = new Projectile(); proj.setAge(self.currentAge); proj.x = self.x + 80; proj.y = self.y; proj.setTarget(targetEnemy.x, targetEnemy.y); projectiles.push(proj); game.addChild(proj); self.lastShotTime = now; // Play shoot sound for current age if (self.currentAge === 0) { LK.getSound('shoot_stone').play(); } else if (self.currentAge === 1) { LK.getSound('shoot_medieval').play(); } else if (self.currentAge === 2) { LK.getSound('shoot_modern').play(); } } }; // Update method for AI self.update = function () { self.tryShoot(); }; return self; }); // Projectile class for defender's attack var Projectile = Container.expand(function () { var self = Container.call(this); self.currentAge = 0; // Attach projectile assets for each age self.projectileAssets = [self.attachAsset('projectile_stone', { anchorX: 0.5, anchorY: 0.5, visible: true }), self.attachAsset('projectile_medieval', { anchorX: 0.5, anchorY: 0.5, visible: false }), self.attachAsset('projectile_modern', { anchorX: 0.5, anchorY: 0.5, visible: false })]; // Set projectile appearance by age self.setAge = function (age) { self.currentAge = age; for (var i = 0; i < self.projectileAssets.length; i++) { self.projectileAssets[i].visible = i === age; } }; // Default to age 0 self.setAge(0); // Target position self.targetX = self.x; self.targetY = self.y; self.speed = 40; // Fast projectile // Set the target for the projectile to move towards self.setTarget = function (x, y) { self.targetX = x; self.targetY = y; // Calculate normalized direction var dx = x - self.x; var dy = y - self.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist === 0) { self.vx = self.speed; self.vy = 0; } else { self.vx = dx / dist * self.speed; self.vy = dy / dist * self.speed; } }; // Update method for movement self.update = function () { if (typeof self.lastX === "undefined") self.lastX = self.x; if (typeof self.lastY === "undefined") self.lastY = self.y; self.x += self.vx; self.y += self.vy; self.lastX = self.x; self.lastY = self.y; }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x222222 }); /**** * Game Code ****/ // Sound assets for each age and action // Savunma kulesi assetleri (her çağ için farklı) // Savunma kulesi assetleri (her çağ için) // Geçiş efekti için // Düşmanlar (çağa göre farklı renkler) // Farklı çağlar için mermi/ok/kurşun // Silahlar ve çağlar için farklı renklerde savunma birimi // Oyun parametreleri var AGES = [{ name: "Taş Çağı", scoreToNext: 10 }, { name: "Orta Çağ", scoreToNext: 25 }, { name: "Modern Çağ", scoreToNext: 50 }]; var currentAge = 0; var score = 0; var wave = 1; var money = 0; var moneyTxt = null; var enemies = []; var projectiles = []; var defender = null; var dragNode = null; var lastTouch = { x: 1024, y: 2300 }; var canShoot = true; // Ateş hızı çağlara göre: taş 200ms, ortaçağ 120ms, modern 60ms var shootCooldowns = [200, 120, 60]; var shootCooldown = shootCooldowns[0]; var lastShotTime = 0; var ageFlash = null; var ageText = null; var scoreTxt = null; var waveTxt = null; var ageTxt = null; var gameOver = false; // Arka planlar: Her çağ için bir arka plan asset'i oluştur ve ekle var backgrounds = [LK.getAsset('bg_stone', { anchorX: 0, anchorY: 0, x: 0, y: 0 }), LK.getAsset('bg_medieval', { anchorX: 0, anchorY: 0, x: 0, y: 0 }), LK.getAsset('bg_modern', { anchorX: 0, anchorY: 0, x: 0, y: 0 })]; // Sadece ilk çağın arka planını göster, diğerlerini gizle for (var i = 0; i < backgrounds.length; i++) { if (i === 0) { backgrounds[i].visible = true; } else { backgrounds[i].visible = false; } game.addChild(backgrounds[i]); } // Savunma kulesi oluştur ve ekle var defenderTower = new EnemyTower(); defenderTower.setAge(0); defenderTower.x = 180; // Kuleyi daha sola al defenderTower.y = 1000; // Haritanın ortasının biraz üstü (1366 merkez, 1000 üstte) game.addChild(defenderTower); // Savunma birimini oluştur ve kuleye göre daha sağda konumlandır defender = new Defender(); defender.x = 600; defender.y = 1366; game.addChild(defender); // --- Add two AI-controlled support NPC defenders --- var npcDefender1 = new NpcDefender(); npcDefender1.x = 900; npcDefender1.y = 1366 - 300; // üstte game.addChild(npcDefender1); var npcDefender2 = new NpcDefender(); npcDefender2.x = 900; npcDefender2.y = 1366 + 300; // altta game.addChild(npcDefender2); // Skor ve çağ göstergeleri scoreTxt = new Text2('0', { size: 100, fill: "#fff" }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); // Para göstergesi moneyTxt = new Text2("₺ 0", { size: 80, fill: 0xFFD700 }); moneyTxt.anchor.set(0.5, 0); LK.gui.top.addChild(moneyTxt); ageTxt = new Text2(AGES[currentAge].name, { size: 70, fill: 0xFFE066 }); ageTxt.anchor.set(0.5, 0); LK.gui.top.addChild(ageTxt); waveTxt = new Text2('Dalga: 1', { size: 60, fill: "#fff" }); waveTxt.anchor.set(0.5, 0); LK.gui.top.addChild(waveTxt); // GUI pozisyonları scoreTxt.y = 20; scoreTxt.x = 2048 / 2; moneyTxt.y = 20; moneyTxt.x = 2048 - 180; // Sağ üst köşe, menüye çarpmayacak şekilde biraz içeride ageTxt.y = 140; ageTxt.x = 2048 / 2; waveTxt.y = 220; waveTxt.x = 2048 / 2; // Çağ geçiş efekti function showAgeFlash(newAge) { if (ageFlash) { ageFlash.destroy(); ageFlash = null; } ageFlash = LK.getAsset('age_flash', { anchorX: 0, anchorY: 0, x: 0, y: 0, alpha: 0.0 }); game.addChild(ageFlash); ageFlash.alpha = 0.8; var txt = new Text2(AGES[newAge].name + "!", { size: 180, fill: "#222" }); txt.anchor.set(0.5, 0.5); txt.x = 2048 / 2; txt.y = 2732 / 2; game.addChild(txt); // Play age-up sound for new age if (newAge === 0) { LK.getSound('ageup_stone').play(); } else if (newAge === 1) { LK.getSound('ageup_medieval').play(); } else if (newAge === 2) { LK.getSound('ageup_modern').play(); } // Savunma kulesi çağını güncelle if (typeof defenderTower !== "undefined" && defenderTower.setAge) { defenderTower.setAge(newAge); } // NPC'lerin çağını güncelle if (typeof npcDefender1 !== "undefined" && npcDefender1.setAge) { npcDefender1.setAge(newAge); } if (typeof npcDefender2 !== "undefined" && npcDefender2.setAge) { npcDefender2.setAge(newAge); } // Arka planı güncelle: Sadece yeni çağın arka planını göster for (var i = 0; i < backgrounds.length; i++) { backgrounds[i].visible = i === newAge; } tween(ageFlash, { alpha: 0 }, { duration: 1200, easing: tween.linear, onFinish: function onFinish() { ageFlash.destroy(); txt.destroy(); ageFlash = null; } }); tween(txt, { alpha: 0 }, { duration: 1200, easing: tween.linear }); } // Düşman dalgası oluştur function spawnWave() { // Düşman sayısını daha hızlı artır (ör: 5 + 2*wave) var count = 5 + 2 * wave; var minY = 180, maxY = 2732 - 180; var minX = 2048 + 100; var maxX = 2048 + 400; for (var i = 0; i < count; i++) { var enemy = new Enemy(); enemy.setAge(currentAge); // Tüm düşmanlar sağdan sola gelecek şekilde ayarlanıyor var minY = 180, maxY = 2732 - 180; var minX = 2048 + 100, maxX = 2048 + 400; enemy.x = maxX + Math.floor(Math.random() * 200); enemy.y = minY + Math.floor(Math.random() * (maxY - minY)); enemy.speedX = -(3 + currentAge * 1 + Math.floor(wave / 3)); enemy.speedY = 0; enemy.update = function () { if (typeof this.lastX === "undefined") this.lastX = this.x; this.x += this.speedX; this.lastX = this.x; }; enemies.push(enemy); game.addChild(enemy); } } // İlk dalga spawnWave(); // Sürükleme ve ateşleme function handleMove(x, y, obj) { // Defender movement is disabled; do nothing here } game.down = function (x, y, obj) { // Savunma birimini sürükleme devre dışı if (!gameOver) { handleMove(x, y, obj); // Ateşle tryShoot(x, y); } }; game.move = function (x, y, obj) { handleMove(x, y, obj); }; game.up = function (x, y, obj) { // Dragging disabled, do not set dragNode }; // Ateşleme fonksiyonu function tryShoot(x, y) { var now = Date.now(); if (canShoot && now - lastShotTime > shootCooldown) { var proj = new Projectile(); proj.setAge(currentAge); proj.x = defender.x + 80; proj.y = defender.y; proj.setTarget(x, y); projectiles.push(proj); game.addChild(proj); lastShotTime = now; // Play shoot sound for current age if (currentAge === 0) { LK.getSound('shoot_stone').play(); } else if (currentAge === 1) { LK.getSound('shoot_medieval').play(); } else if (currentAge === 2) { LK.getSound('shoot_modern').play(); } } } // Oyun güncelleme game.update = function () { if (gameOver) return; // Mermileri güncelle for (var i = projectiles.length - 1; i >= 0; i--) { var p = projectiles[i]; p.update(); // Ekran dışıysa sil if (p.x < -100 || p.x > 2148) { p.destroy(); projectiles.splice(i, 1); } } // NPC'leri güncelle if (typeof npcDefender1 !== "undefined" && npcDefender1.update) { npcDefender1.update(); } if (typeof npcDefender2 !== "undefined" && npcDefender2.update) { npcDefender2.update(); } // Düşmanları güncelle for (var j = enemies.length - 1; j >= 0; j--) { var e = enemies[j]; e.update(); // Düşman savunma birimine ulaştıysa oyun biter if (e.intersects(defender)) { LK.effects.flashScreen(0xff0000, 1000); gameOver = true; LK.showGameOver(); return; } // Düşman ekranın solundan geçtiyse oyun biter if (e.x < -100) { LK.effects.flashScreen(0xff0000, 1000); gameOver = true; LK.showGameOver(); return; } // Mermi ile çarpışma for (var k = projectiles.length - 1; k >= 0; k--) { var p = projectiles[k]; if (e.intersects(p)) { // Düşman ve mermi yok olur, skor artar e.destroy(); p.destroy(); enemies.splice(j, 1); projectiles.splice(k, 1); // Play hit sound for current age if (currentAge === 0) { LK.getSound('hit_stone').play(); } else if (currentAge === 1) { LK.getSound('hit_medieval').play(); } else if (currentAge === 2) { LK.getSound('hit_modern').play(); } score += 1; LK.setScore(score); scoreTxt.setText(score); // Para sistemi: Her çağ için farklı para ekle if (typeof money === "undefined") money = 0; if (currentAge === 0) { money += 1; } else if (currentAge === 1) { money += 2; } else if (currentAge === 2) { money += 3; } if (typeof moneyTxt !== "undefined") { moneyTxt.setText("₺ " + money); } // Çağ atlama kontrolü if (currentAge < AGES.length - 1 && score >= AGES[currentAge].scoreToNext) { currentAge += 1; defender.setAge(currentAge); showAgeFlash(currentAge); ageTxt.setText(AGES[currentAge].name); // Çağ atladıkça ateş hızını güncelle shootCooldown = shootCooldowns[currentAge]; } // Kazanma kontrolü if (score >= AGES[AGES.length - 1].scoreToNext) { LK.showYouWin(); gameOver = true; return; } break; } } } // Dalga bitti mi? if (enemies.length === 0 && !gameOver) { wave += 1; waveTxt.setText('Dalga: ' + wave); spawnWave(); } }; // Oyun başında çağ ve skorları sıfırla function resetGame() { currentAge = 0; score = 0; money = 0; wave = 1; enemies = []; projectiles = []; defender.setAge(0); shootCooldown = shootCooldowns[0]; defender.x = 180; defender.y = 1366; if (typeof moneyTxt !== "undefined") { moneyTxt.setText("₺ 0"); } // Reset NPC defenders if (typeof npcDefender1 !== "undefined") { npcDefender1.setAge(0); npcDefender1.x = 900; npcDefender1.y = 1366 - 300; } if (typeof npcDefender2 !== "undefined") { npcDefender2.setAge(0); npcDefender2.x = 900; npcDefender2.y = 1366 + 300; } // Savunma kulesini de sıfırla if (typeof defenderTower !== "undefined" && defenderTower.setAge) { defenderTower.setAge(0); defenderTower.x = 180; defenderTower.y = 1000; // Haritanın ortasının biraz üstü } scoreTxt.setText('0'); ageTxt.setText(AGES[0].name); waveTxt.setText('Dalga: 1'); gameOver = false; // Arka planı sıfırla: Sadece ilk çağın arka planı görünsün for (var i = 0; i < backgrounds.length; i++) { backgrounds[i].visible = i === 0; } } // Oyun yeniden başlatıldığında sıfırla LK.on('gameStart', function () { resetGame(); // Tüm düşman ve mermileri sil for (var i = 0; i < enemies.length; i++) { enemies[i].destroy(); } for (var j = 0; j < projectiles.length; j++) { projectiles[j].destroy(); } enemies = []; projectiles = []; spawnWave(); });
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// Defender class (minimal implementation, can be expanded as needed)
var Defender = Container.expand(function () {
var self = Container.call(this);
self.currentAge = 0;
// Defender asset references for each age
self.defenderAssets = [self.attachAsset('defender_stone', {
anchorX: 0.5,
anchorY: 0.5,
visible: true
}), self.attachAsset('defender_medieval', {
anchorX: 0.5,
anchorY: 0.5,
visible: false
}), self.attachAsset('defender_modern', {
anchorX: 0.5,
anchorY: 0.5,
visible: false
})];
// Set defender appearance by age
self.setAge = function (age) {
self.currentAge = age;
for (var i = 0; i < self.defenderAssets.length; i++) {
self.defenderAssets[i].visible = i === age;
}
};
// Default to age 0
self.setAge(0);
return self;
});
// Enemy class (minimal implementation, can be expanded as needed)
var Enemy = Container.expand(function () {
var self = Container.call(this);
self.currentAge = 0;
// Enemy asset references for each age
self.enemyAssets = [self.attachAsset('enemy_stone', {
anchorX: 0.5,
anchorY: 0.5,
visible: true
}), self.attachAsset('enemy_medieval', {
anchorX: 0.5,
anchorY: 0.5,
visible: false
}), self.attachAsset('enemy_modern', {
anchorX: 0.5,
anchorY: 0.5,
visible: false
})];
// Set enemy appearance by age
self.setAge = function (age) {
self.currentAge = age;
for (var i = 0; i < self.enemyAssets.length; i++) {
self.enemyAssets[i].visible = i === age;
}
};
// Default to age 0
self.setAge(0);
// Default speed (can be overridden)
self.speed = 3;
// Update method for movement
self.update = function () {
if (typeof self.lastX === "undefined") self.lastX = self.x;
// Move left by speed
self.x -= self.speed;
self.lastX = self.x;
};
return self;
});
// EnemyTower class (minimal implementation, can be expanded as needed)
var EnemyTower = Container.expand(function () {
var self = Container.call(this);
// Store current age for asset switching
self.currentAge = 0;
// Tower asset references for each age
self.towerAssets = [self.attachAsset('tower_stone', {
anchorX: 0.5,
anchorY: 0.5,
visible: true
}), self.attachAsset('tower_medieval', {
anchorX: 0.5,
anchorY: 0.5,
visible: false
}), self.attachAsset('tower_modern', {
anchorX: 0.5,
anchorY: 0.5,
visible: false
})];
// Set tower appearance by age
self.setAge = function (age) {
self.currentAge = age;
for (var i = 0; i < self.towerAssets.length; i++) {
self.towerAssets[i].visible = i === age;
}
};
// Default to age 0
self.setAge(0);
return self;
});
// AI-controlled support defender class
var NpcDefender = Container.expand(function () {
var self = Container.call(this);
self.currentAge = 0;
// Defender asset references for each age
self.defenderAssets = [self.attachAsset('defender_stone', {
anchorX: 0.5,
anchorY: 0.5,
visible: true
}), self.attachAsset('defender_medieval', {
anchorX: 0.5,
anchorY: 0.5,
visible: false
}), self.attachAsset('defender_modern', {
anchorX: 0.5,
anchorY: 0.5,
visible: false
})];
// Set defender appearance by age
self.setAge = function (age) {
self.currentAge = age;
for (var i = 0; i < self.defenderAssets.length; i++) {
self.defenderAssets[i].visible = i === age;
}
};
// Default to age 0
self.setAge(0);
// AI shooting cooldowns (same as player)
self.shootCooldowns = [300, 180, 100];
self.shootCooldown = self.shootCooldowns[0];
self.lastShotTime = 0;
// AI shoot logic: find nearest enemy and shoot
self.tryShoot = function () {
if (typeof enemies === "undefined" || enemies.length === 0) return;
var now = Date.now();
if (now - self.lastShotTime < self.shootCooldown) return;
// Find nearest enemy
var minDist = Infinity;
var targetEnemy = null;
for (var i = 0; i < enemies.length; i++) {
var e = enemies[i];
var dx = e.x - self.x;
var dy = e.y - self.y;
var dist = dx * dx + dy * dy;
if (dist < minDist) {
minDist = dist;
targetEnemy = e;
}
}
if (targetEnemy) {
var proj = new Projectile();
proj.setAge(self.currentAge);
proj.x = self.x + 80;
proj.y = self.y;
proj.setTarget(targetEnemy.x, targetEnemy.y);
projectiles.push(proj);
game.addChild(proj);
self.lastShotTime = now;
// Play shoot sound for current age
if (self.currentAge === 0) {
LK.getSound('shoot_stone').play();
} else if (self.currentAge === 1) {
LK.getSound('shoot_medieval').play();
} else if (self.currentAge === 2) {
LK.getSound('shoot_modern').play();
}
}
};
// Update method for AI
self.update = function () {
self.tryShoot();
};
return self;
});
// Projectile class for defender's attack
var Projectile = Container.expand(function () {
var self = Container.call(this);
self.currentAge = 0;
// Attach projectile assets for each age
self.projectileAssets = [self.attachAsset('projectile_stone', {
anchorX: 0.5,
anchorY: 0.5,
visible: true
}), self.attachAsset('projectile_medieval', {
anchorX: 0.5,
anchorY: 0.5,
visible: false
}), self.attachAsset('projectile_modern', {
anchorX: 0.5,
anchorY: 0.5,
visible: false
})];
// Set projectile appearance by age
self.setAge = function (age) {
self.currentAge = age;
for (var i = 0; i < self.projectileAssets.length; i++) {
self.projectileAssets[i].visible = i === age;
}
};
// Default to age 0
self.setAge(0);
// Target position
self.targetX = self.x;
self.targetY = self.y;
self.speed = 40; // Fast projectile
// Set the target for the projectile to move towards
self.setTarget = function (x, y) {
self.targetX = x;
self.targetY = y;
// Calculate normalized direction
var dx = x - self.x;
var dy = y - self.y;
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist === 0) {
self.vx = self.speed;
self.vy = 0;
} else {
self.vx = dx / dist * self.speed;
self.vy = dy / dist * self.speed;
}
};
// Update method for movement
self.update = function () {
if (typeof self.lastX === "undefined") self.lastX = self.x;
if (typeof self.lastY === "undefined") self.lastY = self.y;
self.x += self.vx;
self.y += self.vy;
self.lastX = self.x;
self.lastY = self.y;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x222222
});
/****
* Game Code
****/
// Sound assets for each age and action
// Savunma kulesi assetleri (her çağ için farklı)
// Savunma kulesi assetleri (her çağ için)
// Geçiş efekti için
// Düşmanlar (çağa göre farklı renkler)
// Farklı çağlar için mermi/ok/kurşun
// Silahlar ve çağlar için farklı renklerde savunma birimi
// Oyun parametreleri
var AGES = [{
name: "Taş Çağı",
scoreToNext: 10
}, {
name: "Orta Çağ",
scoreToNext: 25
}, {
name: "Modern Çağ",
scoreToNext: 50
}];
var currentAge = 0;
var score = 0;
var wave = 1;
var money = 0;
var moneyTxt = null;
var enemies = [];
var projectiles = [];
var defender = null;
var dragNode = null;
var lastTouch = {
x: 1024,
y: 2300
};
var canShoot = true;
// Ateş hızı çağlara göre: taş 200ms, ortaçağ 120ms, modern 60ms
var shootCooldowns = [200, 120, 60];
var shootCooldown = shootCooldowns[0];
var lastShotTime = 0;
var ageFlash = null;
var ageText = null;
var scoreTxt = null;
var waveTxt = null;
var ageTxt = null;
var gameOver = false;
// Arka planlar: Her çağ için bir arka plan asset'i oluştur ve ekle
var backgrounds = [LK.getAsset('bg_stone', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0
}), LK.getAsset('bg_medieval', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0
}), LK.getAsset('bg_modern', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0
})];
// Sadece ilk çağın arka planını göster, diğerlerini gizle
for (var i = 0; i < backgrounds.length; i++) {
if (i === 0) {
backgrounds[i].visible = true;
} else {
backgrounds[i].visible = false;
}
game.addChild(backgrounds[i]);
}
// Savunma kulesi oluştur ve ekle
var defenderTower = new EnemyTower();
defenderTower.setAge(0);
defenderTower.x = 180; // Kuleyi daha sola al
defenderTower.y = 1000; // Haritanın ortasının biraz üstü (1366 merkez, 1000 üstte)
game.addChild(defenderTower);
// Savunma birimini oluştur ve kuleye göre daha sağda konumlandır
defender = new Defender();
defender.x = 600;
defender.y = 1366;
game.addChild(defender);
// --- Add two AI-controlled support NPC defenders ---
var npcDefender1 = new NpcDefender();
npcDefender1.x = 900;
npcDefender1.y = 1366 - 300; // üstte
game.addChild(npcDefender1);
var npcDefender2 = new NpcDefender();
npcDefender2.x = 900;
npcDefender2.y = 1366 + 300; // altta
game.addChild(npcDefender2);
// Skor ve çağ göstergeleri
scoreTxt = new Text2('0', {
size: 100,
fill: "#fff"
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Para göstergesi
moneyTxt = new Text2("₺ 0", {
size: 80,
fill: 0xFFD700
});
moneyTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(moneyTxt);
ageTxt = new Text2(AGES[currentAge].name, {
size: 70,
fill: 0xFFE066
});
ageTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(ageTxt);
waveTxt = new Text2('Dalga: 1', {
size: 60,
fill: "#fff"
});
waveTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(waveTxt);
// GUI pozisyonları
scoreTxt.y = 20;
scoreTxt.x = 2048 / 2;
moneyTxt.y = 20;
moneyTxt.x = 2048 - 180; // Sağ üst köşe, menüye çarpmayacak şekilde biraz içeride
ageTxt.y = 140;
ageTxt.x = 2048 / 2;
waveTxt.y = 220;
waveTxt.x = 2048 / 2;
// Çağ geçiş efekti
function showAgeFlash(newAge) {
if (ageFlash) {
ageFlash.destroy();
ageFlash = null;
}
ageFlash = LK.getAsset('age_flash', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0,
alpha: 0.0
});
game.addChild(ageFlash);
ageFlash.alpha = 0.8;
var txt = new Text2(AGES[newAge].name + "!", {
size: 180,
fill: "#222"
});
txt.anchor.set(0.5, 0.5);
txt.x = 2048 / 2;
txt.y = 2732 / 2;
game.addChild(txt);
// Play age-up sound for new age
if (newAge === 0) {
LK.getSound('ageup_stone').play();
} else if (newAge === 1) {
LK.getSound('ageup_medieval').play();
} else if (newAge === 2) {
LK.getSound('ageup_modern').play();
}
// Savunma kulesi çağını güncelle
if (typeof defenderTower !== "undefined" && defenderTower.setAge) {
defenderTower.setAge(newAge);
}
// NPC'lerin çağını güncelle
if (typeof npcDefender1 !== "undefined" && npcDefender1.setAge) {
npcDefender1.setAge(newAge);
}
if (typeof npcDefender2 !== "undefined" && npcDefender2.setAge) {
npcDefender2.setAge(newAge);
}
// Arka planı güncelle: Sadece yeni çağın arka planını göster
for (var i = 0; i < backgrounds.length; i++) {
backgrounds[i].visible = i === newAge;
}
tween(ageFlash, {
alpha: 0
}, {
duration: 1200,
easing: tween.linear,
onFinish: function onFinish() {
ageFlash.destroy();
txt.destroy();
ageFlash = null;
}
});
tween(txt, {
alpha: 0
}, {
duration: 1200,
easing: tween.linear
});
}
// Düşman dalgası oluştur
function spawnWave() {
// Düşman sayısını daha hızlı artır (ör: 5 + 2*wave)
var count = 5 + 2 * wave;
var minY = 180,
maxY = 2732 - 180;
var minX = 2048 + 100;
var maxX = 2048 + 400;
for (var i = 0; i < count; i++) {
var enemy = new Enemy();
enemy.setAge(currentAge);
// Tüm düşmanlar sağdan sola gelecek şekilde ayarlanıyor
var minY = 180,
maxY = 2732 - 180;
var minX = 2048 + 100,
maxX = 2048 + 400;
enemy.x = maxX + Math.floor(Math.random() * 200);
enemy.y = minY + Math.floor(Math.random() * (maxY - minY));
enemy.speedX = -(3 + currentAge * 1 + Math.floor(wave / 3));
enemy.speedY = 0;
enemy.update = function () {
if (typeof this.lastX === "undefined") this.lastX = this.x;
this.x += this.speedX;
this.lastX = this.x;
};
enemies.push(enemy);
game.addChild(enemy);
}
}
// İlk dalga
spawnWave();
// Sürükleme ve ateşleme
function handleMove(x, y, obj) {
// Defender movement is disabled; do nothing here
}
game.down = function (x, y, obj) {
// Savunma birimini sürükleme devre dışı
if (!gameOver) {
handleMove(x, y, obj);
// Ateşle
tryShoot(x, y);
}
};
game.move = function (x, y, obj) {
handleMove(x, y, obj);
};
game.up = function (x, y, obj) {
// Dragging disabled, do not set dragNode
};
// Ateşleme fonksiyonu
function tryShoot(x, y) {
var now = Date.now();
if (canShoot && now - lastShotTime > shootCooldown) {
var proj = new Projectile();
proj.setAge(currentAge);
proj.x = defender.x + 80;
proj.y = defender.y;
proj.setTarget(x, y);
projectiles.push(proj);
game.addChild(proj);
lastShotTime = now;
// Play shoot sound for current age
if (currentAge === 0) {
LK.getSound('shoot_stone').play();
} else if (currentAge === 1) {
LK.getSound('shoot_medieval').play();
} else if (currentAge === 2) {
LK.getSound('shoot_modern').play();
}
}
}
// Oyun güncelleme
game.update = function () {
if (gameOver) return;
// Mermileri güncelle
for (var i = projectiles.length - 1; i >= 0; i--) {
var p = projectiles[i];
p.update();
// Ekran dışıysa sil
if (p.x < -100 || p.x > 2148) {
p.destroy();
projectiles.splice(i, 1);
}
}
// NPC'leri güncelle
if (typeof npcDefender1 !== "undefined" && npcDefender1.update) {
npcDefender1.update();
}
if (typeof npcDefender2 !== "undefined" && npcDefender2.update) {
npcDefender2.update();
}
// Düşmanları güncelle
for (var j = enemies.length - 1; j >= 0; j--) {
var e = enemies[j];
e.update();
// Düşman savunma birimine ulaştıysa oyun biter
if (e.intersects(defender)) {
LK.effects.flashScreen(0xff0000, 1000);
gameOver = true;
LK.showGameOver();
return;
}
// Düşman ekranın solundan geçtiyse oyun biter
if (e.x < -100) {
LK.effects.flashScreen(0xff0000, 1000);
gameOver = true;
LK.showGameOver();
return;
}
// Mermi ile çarpışma
for (var k = projectiles.length - 1; k >= 0; k--) {
var p = projectiles[k];
if (e.intersects(p)) {
// Düşman ve mermi yok olur, skor artar
e.destroy();
p.destroy();
enemies.splice(j, 1);
projectiles.splice(k, 1);
// Play hit sound for current age
if (currentAge === 0) {
LK.getSound('hit_stone').play();
} else if (currentAge === 1) {
LK.getSound('hit_medieval').play();
} else if (currentAge === 2) {
LK.getSound('hit_modern').play();
}
score += 1;
LK.setScore(score);
scoreTxt.setText(score);
// Para sistemi: Her çağ için farklı para ekle
if (typeof money === "undefined") money = 0;
if (currentAge === 0) {
money += 1;
} else if (currentAge === 1) {
money += 2;
} else if (currentAge === 2) {
money += 3;
}
if (typeof moneyTxt !== "undefined") {
moneyTxt.setText("₺ " + money);
}
// Çağ atlama kontrolü
if (currentAge < AGES.length - 1 && score >= AGES[currentAge].scoreToNext) {
currentAge += 1;
defender.setAge(currentAge);
showAgeFlash(currentAge);
ageTxt.setText(AGES[currentAge].name);
// Çağ atladıkça ateş hızını güncelle
shootCooldown = shootCooldowns[currentAge];
}
// Kazanma kontrolü
if (score >= AGES[AGES.length - 1].scoreToNext) {
LK.showYouWin();
gameOver = true;
return;
}
break;
}
}
}
// Dalga bitti mi?
if (enemies.length === 0 && !gameOver) {
wave += 1;
waveTxt.setText('Dalga: ' + wave);
spawnWave();
}
};
// Oyun başında çağ ve skorları sıfırla
function resetGame() {
currentAge = 0;
score = 0;
money = 0;
wave = 1;
enemies = [];
projectiles = [];
defender.setAge(0);
shootCooldown = shootCooldowns[0];
defender.x = 180;
defender.y = 1366;
if (typeof moneyTxt !== "undefined") {
moneyTxt.setText("₺ 0");
}
// Reset NPC defenders
if (typeof npcDefender1 !== "undefined") {
npcDefender1.setAge(0);
npcDefender1.x = 900;
npcDefender1.y = 1366 - 300;
}
if (typeof npcDefender2 !== "undefined") {
npcDefender2.setAge(0);
npcDefender2.x = 900;
npcDefender2.y = 1366 + 300;
}
// Savunma kulesini de sıfırla
if (typeof defenderTower !== "undefined" && defenderTower.setAge) {
defenderTower.setAge(0);
defenderTower.x = 180;
defenderTower.y = 1000; // Haritanın ortasının biraz üstü
}
scoreTxt.setText('0');
ageTxt.setText(AGES[0].name);
waveTxt.setText('Dalga: 1');
gameOver = false;
// Arka planı sıfırla: Sadece ilk çağın arka planı görünsün
for (var i = 0; i < backgrounds.length; i++) {
backgrounds[i].visible = i === 0;
}
}
// Oyun yeniden başlatıldığında sıfırla
LK.on('gameStart', function () {
resetGame();
// Tüm düşman ve mermileri sil
for (var i = 0; i < enemies.length; i++) {
enemies[i].destroy();
}
for (var j = 0; j < projectiles.length; j++) {
projectiles[j].destroy();
}
enemies = [];
projectiles = [];
spawnWave();
});
taş devri döneminde savaşçı. In-Game asset. 2d. High contrast. No shadows. taş devri asker
Ortaçağ dönemi savaşçı. In-Game asset. 2d. High contrast. No shadows
Modern çağ dönemi savaşçı. In-Game asset. 2d. High contrast. No shadows
Taş devri düşman. In-Game asset. 2d. High contrast. No shadows
Modern çağ düşman. In-Game asset. 2d. High contrast. No shadows
Orta çağ dönemi düşman. In-Game asset. 2d. High contrast. No shadows
Taş devri cephane mermisi. In-Game asset. 2d. High contrast. No shadows
Modern çağ dönemi cephane mermisi. In-Game asset. 2d. High contrast. No shadows
Orta çağ dönemi silah mermisi. In-Game asset. 2d. High contrast. No shadows
Taş devri arka plan. In-Game asset. 2d. High contrast. No shadows
Modern çağ için savaş arka planı. In-Game asset. 2d. High contrast. No shadows
Orta çağ dönemi için savaş arka planı. In-Game asset. 2d. High contrast. No shadows
Taş devri Kule. In-Game asset. 2d. High contrast. No shadows
Orta çağ dönemi kule savunma. In-Game asset. 2d. High contrast. No shadows
modern çağ dönemi kule savunma. In-Game asset. 2d. High contrast. No shadows