/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ // Boss Düşman var Boss = Container.expand(function () { var self = Container.call(this); var bossGfx = self.attachAsset('boss', { anchorX: 0.5, anchorY: 0.5 }); self.radius = bossGfx.width / 2; self.speed = 2.2 + currentWave * 0.15; self.hp = 20 + currentWave * 8; self.dir = Math.PI / 2; self.shootCooldown = 30; self.moveTimer = 0; self.targetX = 2048 / 2; self.update = function () { // Yavaşça aşağıya gelsin, sonra yatayda hareket etsin if (self.y < 400) { self.y += self.speed; } else { // Yatayda sağa-sola hareket self.moveTimer--; if (self.moveTimer <= 0) { self.targetX = 300 + Math.random() * (2048 - 600); self.moveTimer = 60 + Math.floor(Math.random() * 60); } if (Math.abs(self.x - self.targetX) > 10) { self.x += (self.targetX - self.x) * 0.07; } } // Ateş etme if (self.shootCooldown > 0) { self.shootCooldown--; } else { // 3 yönlü ateş for (var i = -1; i <= 1; i++) { var angle = Math.PI / 2 + i * Math.PI / 12; var eb = new EnemyBullet(angle); eb.x = self.x; eb.y = self.y + self.radius - 30; enemyBullets.push(eb); game.addChild(eb); } self.shootCooldown = 18 + Math.floor(Math.random() * 18); } }; self.hit = function () { self.hp--; LK.effects.flashObject(self, 0xffffff, 120); if (self.hp <= 0) { // Ölüm animasyonu: büyüyüp patlayarak yok ol tween(self, { alpha: 0, scaleX: 2.5, scaleY: 2.5 }, { duration: 500, easing: tween.cubicOut, onFinish: function onFinish() { self.destroy(); } }); return true; } return false; }; return self; }); // Oyuncu mermisi var Bullet = Container.expand(function (angle) { var self = Container.call(this); var bulletGfx = self.attachAsset('bullet', { anchorX: 0.5, anchorY: 0.5 }); self.radius = bulletGfx.width / 2; self.speed = 16; self.angle = angle || -Math.PI / 2; // Bullet trail group self.trailGroup = new Container(); self.addChild(self.trailGroup); // Trail config self.trailInterval = 0; self.trailIntervalMax = 2; // every 2 frames self.update = function () { // Move bullet self.x += Math.cos(self.angle) * self.speed; self.y += Math.sin(self.angle) * self.speed; // Bullet trail logic self.trailInterval--; if (self.trailInterval <= 0) { self.trailInterval = self.trailIntervalMax; // Create a small faded bullet as trail var trail = LK.getAsset('bullet', { anchorX: 0.5, anchorY: 0.5, width: bulletGfx.width * 0.7, height: bulletGfx.height * 0.7, x: 0, y: 0 }); trail.alpha = 0.25; self.trailGroup.addChild(trail); // Fade and shrink the trail, then remove tween(trail, { alpha: 0, width: 0, height: 0 }, { duration: 320, onFinish: function onFinish() { if (trail.parent) trail.parent.removeChild(trail); } }); } }; self.setBig = function () { // Mermi boyutunu büyüt bulletGfx.width *= 1.8; bulletGfx.height *= 1.8; self.radius = bulletGfx.width / 2; // Trail de büyüsün self.trailIntervalMax = 1; }; return self; }); // Düşman var Enemy = Container.expand(function (type) { var self = Container.call(this); var enemyGfx = self.attachAsset('enemy', { anchorX: 0.5, anchorY: 0.5 }); self.radius = enemyGfx.width / 2; // Düşman tipi seçimi self.type = type || Enemy.randomType(); // Temel parametreler self.speed = 2 + currentWave * 0.3 + Math.random() * 1.5; self.hp = 1 + Math.floor(currentWave / 2); self.dir = Math.PI / 2 + (Math.random() - 0.5) * 0.3; // Hafifçe sağa-sola sapabilir self.shootCooldown = 30 + Math.floor(Math.random() * 60); // Her düşman için rastgele başlat // Zigzag için faz self.zigzagPhase = Math.random() * Math.PI * 2; // Dalga için genlik ve frekans self.waveAmplitude = 80 + Math.random() * 60; self.waveFrequency = 0.012 + Math.random() * 0.008; // Hedefli düşman için hedef pozisyon self.targetX = 2048 / 2 + (Math.random() - 0.5) * 600; self.update = function () { // Farklı hareket tipleri if (self.type === "straight") { // Düz hareket self.y += self.speed; self.x += Math.sin(self.dir) * 2; } else if (self.type === "zigzag") { // Zigzag hareket self.y += self.speed * 0.95; self.x += Math.sin(self.y * 0.045 + self.zigzagPhase) * 12; } else if (self.type === "wave") { // Dalga hareketi self.y += self.speed * 0.92; self.x = self.targetX + Math.sin(self.y * self.waveFrequency + self.zigzagPhase) * self.waveAmplitude; } else if (self.type === "fast") { // Hızlı düz hareket self.y += self.speed + 2.5; } else if (self.type === "slow") { // Yavaş ve daha fazla can self.y += self.speed * 0.6; } else { // Varsayılan düz hareket self.y += self.speed; self.x += Math.sin(self.dir) * 2; } // Ateş etme if (self.shootCooldown > 0) { self.shootCooldown--; } else { // Kendi düz çizgisine doğru ateş et var angle = Math.PI / 2; // Düz aşağıya (ekranın altına) ateş etsin var eb = new EnemyBullet(angle); eb.x = self.x; eb.y = self.y + self.radius; enemyBullets.push(eb); game.addChild(eb); self.shootCooldown = 60 + Math.floor(Math.random() * 60); // 1-2 saniyede bir ateş } }; self.hit = function () { self.hp--; LK.effects.flashObject(self, 0xffffff, 200); if (self.hp <= 0) { // Ölüm animasyonu: küçülerek ve şeffaflaşarak yok ol tween(self, { alpha: 0, scaleX: 2, scaleY: 2 }, { duration: 350, easing: tween.cubicOut, onFinish: function onFinish() { self.destroy(); } }); return true; } return false; }; return self; }); // Düşman tipi seçici // Düşman mermisi var EnemyBullet = Container.expand(function (angle) { var self = Container.call(this); var bulletGfx = self.attachAsset('bullet', { anchorX: 0.5, anchorY: 0.5 }); bulletGfx.tint = 0xff3333; // Kırmızıya yakın renk self.radius = bulletGfx.width / 2; self.speed = 9; // Daha yavaş düşman mermisi self.angle = angle || Math.PI / 2; self.update = function () { self.x += Math.cos(self.angle) * self.speed; self.y += Math.sin(self.angle) * self.speed; }; return self; }); var Player = Container.expand(function () { var self = Container.call(this); var playerGfx = self.attachAsset('player', { anchorX: 0.5, anchorY: 0.5 }); self.radius = playerGfx.width / 2; self.fireCooldown = 0; // Atış bekleme süresi self.fireRate = 18; // Kaç frame'de bir ateş eder (60fps'de ~3 atış/sn) self.powerLevel = 1; // Güç seviyesi (daha fazla mermi için) self.invincible = false; self.invincibleTimer = 0; self.update = function () { if (self.fireCooldown > 0) { self.fireCooldown--; } // Rapid fire buff if (self.fireRateBuff) { self.fireRateBuffTimer--; self.fireRate = 3; if (self.fireRateBuffTimer <= 0) { self.fireRateBuff = 0; self.fireRate = 18 - (self.powerLevel - 1) * 4; } } // Double shot buff if (self.doubleBuff) { self.doubleBuffTimer--; self.tempPowerLevel = self.powerLevel + 1; if (self.doubleBuffTimer <= 0) { self.doubleBuff = 0; self.tempPowerLevel = null; } } if (self.invincible) { self.invincibleTimer--; if (self.invincibleTimer <= 0) { self.invincible = false; playerGfx.alpha = 1; } } // Auto-aim buff if (self.autoAimBuff) { self.autoAimBuffTimer--; if (self.autoAimBuffTimer <= 0) { self.autoAimBuff = 0; } } // Big bullet buff if (self.bigBulletBuff) { self.bigBulletBuffTimer--; if (self.bigBulletBuffTimer <= 0) { self.bigBulletBuff = 0; } } // Magnet buff timer if (self.magnetBuff) { self.magnetBuffTimer--; if (self.magnetBuffTimer <= 0) { self.magnetBuff = 0; } } }; self.shoot = function () { if (self.fireCooldown > 0) { return; } self.fireCooldown = self.fireRate; // Güç seviyesine göre mermi sayısı var spread = self.tempPowerLevel ? self.tempPowerLevel : self.powerLevel; var angleStep = Math.PI / 16; var baseAngle = -Math.PI / 2; for (var i = 0; i < spread; i++) { var angle = baseAngle + (i - (spread - 1) / 2) * angleStep; // Auto-aim: hedefe en yakın düşmana yönel if (self.autoAimBuff && enemies.length > 0) { // En yakın düşmanı bul var minDist = 99999, targetEnemy = null; for (var ei = 0; ei < enemies.length; ei++) { var dx = enemies[ei].x - self.x; var dy = enemies[ei].y - (self.y - self.radius); var dist = dx * dx + dy * dy; if (dist < minDist) { minDist = dist; targetEnemy = enemies[ei]; } } if (targetEnemy) { angle = Math.atan2(targetEnemy.y - (self.y - self.radius), targetEnemy.x - self.x); } } var b = new Bullet(angle); // Big bullet: mermi boyutunu büyüt if (self.bigBulletBuff) { b.setBig(); } b.x = self.x; b.y = self.y - self.radius; bullets.push(b); game.addChild(b); } }; self.gainPower = function (type) { // type: 'power', 'shield', 'bomb', 'rapid', 'double' if (!type || type === 'power') { if (self.powerLevel < 3) { self.powerLevel++; LK.effects.flashObject(self, 0x2980b9, 600); // Ateş hızını artır: fireRate'i azalt, minimum 6 frame/sn'ye kadar düşebilir self.fireRate = Math.max(6, self.fireRate - 4); } } else if (type === 'shield') { self.invincible = true; self.invincibleTimer = 180; // 3 saniye playerGfx.alpha = 0.4; LK.effects.flashObject(self, 0x00bfff, 800); } else if (type === 'bomb') { // Ekrandaki tüm düşmanları ve düşman mermilerini yok et for (var i = enemies.length - 1; i >= 0; i--) { enemies[i].destroy(); enemies.splice(i, 1); score += 10 * currentWave; } for (var i = enemyBullets.length - 1; i >= 0; i--) { enemyBullets[i].destroy(); enemyBullets.splice(i, 1); } scoreText.setText(score); LK.setScore(score); LK.effects.flashScreen(0xffffff, 400); } else if (type === 'rapid') { // 5 saniye boyunca ateş hızı çok yüksek self.fireRateBuff = 1; self.fireRateBuffTimer = 300; LK.effects.flashObject(self, 0xffe066, 600); } else if (type === 'double') { // 5 saniye boyunca powerLevel +1 self.doubleBuff = 1; self.doubleBuffTimer = 300; LK.effects.flashObject(self, 0x8e44ad, 600); } else if (type === 'autoaim') { // 6 saniye boyunca otomatik hedefleme self.autoAimBuff = 1; self.autoAimBuffTimer = 360; LK.effects.flashObject(self, 0x00ff00, 600); } else if (type === 'bigbullet') { // 6 saniye boyunca büyük mermi self.bigBulletBuff = 1; self.bigBulletBuffTimer = 360; LK.effects.flashObject(self, 0xffa500, 600); } else if (type === 'slow') { // 5 saniye boyunca düşman mermileri ve düşmanlar yavaşlar if (!game.slowMotionBuff || game.slowMotionBuff <= 0) { game.slowMotionBuff = 1; game.slowMotionBuffTimer = 300; LK.effects.flashScreen(0x00bfae, 400); } } else if (type === 'freeze') { // 3 saniye boyunca düşmanlar ve mermileri donar if (!game.freezeEnemiesBuff || game.freezeEnemiesBuff <= 0) { game.freezeEnemiesBuff = 1; game.freezeEnemiesBuffTimer = 180; LK.effects.flashScreen(0x7ed6ff, 400); } } else if (type === 'magnet') { // Magnet: Yakındaki tüm güçlendirmeleri oyuncuya doğru çek if (!self.magnetBuff || self.magnetBuff <= 0) { self.magnetBuff = 1; self.magnetBuffTimer = 360; // 6 saniye LK.effects.flashObject(self, 0xff00ff, 600); } } else if (type === 'heal') { // Can yenileme: Bir can ekle, maksimum 7 if (typeof playerLives !== "undefined" && playerLives < 7) { playerLives++; livesText.setText('♥'.repeat(playerLives)); LK.effects.flashObject(self, 0x00ff44, 600); } } }; self.hit = function () { if (self.invincible) { return; } self.invincible = true; self.invincibleTimer = 90; // 1.5 saniye playerGfx.alpha = 0.5; LK.effects.flashScreen(0xff0000, 500); // Ölüm animasyonu: kısa bir sarsılma ve küçülme tween(self, { scaleX: 0.7, scaleY: 0.7 }, { duration: 120, easing: tween.cubicOut, onFinish: function onFinish() { tween(self, { scaleX: 1, scaleY: 1 }, { duration: 120, easing: tween.cubicOut }); } }); playerLives--; livesText.setText('♥'.repeat(playerLives)); if (playerLives <= 0) { // Son can ise fade out animasyonu tween(self, { alpha: 0 }, { duration: 400, onFinish: function onFinish() { LK.showGameOver(); } }); } else { // Can varsa normal devam } }; return self; }); // Güçlendirme türleri: 'power', 'shield', 'bomb', 'rapid', 'double', 'autoaim', 'bigbullet', 'slow', 'freeze' var PowerUp = Container.expand(function (type) { var self = Container.call(this); self.type = type || PowerUp.randomType(); var color = 0x00ffcc; if (self.type === 'shield') color = 0x00bfff;else if (self.type === 'bomb') color = 0xff4444;else if (self.type === 'rapid') color = 0xffe066;else if (self.type === 'double') color = 0x8e44ad;else if (self.type === 'autoaim') color = 0x00ff00;else if (self.type === 'bigbullet') color = 0xffa500;else if (self.type === 'slow') color = 0x00bfae;else if (self.type === 'freeze') color = 0x7ed6ff;else if (self.type === 'magnet') color = 0xff00ff;else if (self.type === 'heal') color = 0x00ff44; var puGfx = self.attachAsset('powerup', { anchorX: 0.5, anchorY: 0.5, width: 80, height: 80 }); puGfx.tint = color; self.radius = puGfx.width / 2; self.speed = 6; self.update = function () { // PowerUp yukarıdan aşağıya doğru düşer self.y += self.speed; }; return self; }); /**** * Initialize Game ****/ // Tuzak (Trap) - zaman zaman ortaya çıkan ateş/mayın // Rastgele güçlendirme türü seçici var game = new LK.Game({ backgroundColor: 0x222831 }); /**** * Game Code ****/ // Düşman tipi seçici // Karakter, düşman, mermi ve güçlendirme için temel şekiller // Global değişkenler // Rastgele güçlendirme türü seçici Enemy.randomType = function () { var types = ["straight", "zigzag", "wave", "fast", "slow"]; var r = Math.random(); if (r < 0.45) return "straight"; if (r < 0.65) return "zigzag"; if (r < 0.8) return "wave"; if (r < 0.92) return "fast"; return "slow"; }; PowerUp.randomType = function () { var types = ['power', 'shield', 'bomb', 'rapid', 'double', 'autoaim', 'bigbullet', 'slow', 'freeze', 'magnet', 'heal']; var r = Math.random(); if (r < 0.18) return 'power'; if (r < 0.26) return 'shield'; if (r < 0.34) return 'bomb'; if (r < 0.42) return 'rapid'; if (r < 0.50) return 'double'; if (r < 0.60) return 'autoaim'; if (r < 0.70) return 'bigbullet'; if (r < 0.78) return 'slow'; if (r < 0.86) return 'freeze'; if (r < 0.93) return 'magnet'; return 'heal'; }; if (!tween) { console.error("Tween plugin failed to load!"); } if (!storage) { console.error("Storage plugin failed to load!"); } var player; var bullets = []; var enemyBullets = []; var enemies = []; var powerups = []; var boss = null; var bossActive = false; var currentWave = 1; var waveEnemiesLeft = 0; var waveSpawnTimer = 0; var playerLives = 5; var score = 0; var dragNode = null; // Bufflar game.slowMotionBuff = 0; game.slowMotionBuffTimer = 0; game.freezeEnemiesBuff = 0; game.freezeEnemiesBuffTimer = 0; // GUI: Skor ve can var scoreText = new Text2('0', { size: 100, fill: 0xFFF700 }); scoreText.anchor.set(0.5, 0); LK.gui.top.addChild(scoreText); var livesText = new Text2('♥♥♥♥♥', { size: 90, fill: 0xE74C3C }); livesText.anchor.set(0.5, 0); LK.gui.topRight.addChild(livesText); // Dalga göstergesi var waveText = new Text2('Dalga 1', { size: 70, fill: 0x00BFFF }); waveText.anchor.set(0.5, 0); LK.gui.bottom.addChild(waveText); // Oyuncu oluştur player = new Player(); player.x = 2048 / 2; player.y = 2732 - 350; game.addChild(player); // İlk dalgayı başlat startWave(currentWave); // Sürükleme/move kontrolleri function handleMove(x, y, obj) { if (dragNode) { // Sınırları kontrol et var px = Math.max(80, Math.min(2048 - 80, x)); var py = Math.max(200, Math.min(2732 - 120, y)); dragNode.x = px; dragNode.y = py; } } game.move = handleMove; game.down = function (x, y, obj) { // Oyuncuya tıklanırsa sürüklemeye başla if (player && Math.abs(x - player.x) < player.radius && Math.abs(y - player.y) < player.radius) { dragNode = player; handleMove(x, y, obj); } }; game.up = function (x, y, obj) { dragNode = null; }; // Dalga başlatıcı function startWave(wave) { // Her 5. dalgada boss gelsin // Dalga geçiş efekti: ekranı kısa süreliğine beyaza flashla ve dalga metni büyüt küçült animasyonu LK.effects.flashScreen(wave % 5 === 0 ? 0xff2222 : 0xffffff, 300); waveText.scale.set(1.7, 1.7); tween(waveText.scale, { x: 1, y: 1 }, { duration: 400, easing: tween.cubicOut }); if (wave % 5 === 0) { bossActive = true; boss = new Boss(); boss.x = 2048 / 2; boss.y = -200; game.addChild(boss); waveEnemiesLeft = 0; waveText.setText('BOSS Dalgası!'); } else { bossActive = false; boss = null; waveEnemiesLeft = 6 + wave * 2; waveSpawnTimer = 0; waveText.setText('Dalga ' + wave); } } // Düşman üretici function spawnEnemy() { // Rastgele tipli düşman oluştur var e = new Enemy(); e.x = 150 + Math.random() * (2048 - 300); e.y = -100; // Eğer slow tipliyse canı artır if (e.type === "slow") { e.hp += 2 + Math.floor(currentWave / 2); } // Eğer fast tipliyse hızı artır if (e.type === "fast") { e.speed += 2.5; } enemies.push(e); game.addChild(e); } // Güçlendirme üretici function spawnPowerUp() { var pu = new PowerUp(PowerUp.randomType()); pu.x = 200 + Math.random() * (2048 - 400); pu.y = -80; powerups.push(pu); game.addChild(pu); } // Ana oyun döngüsü game.update = function () { // Buff timers if (game.slowMotionBuff) { game.slowMotionBuffTimer--; if (game.slowMotionBuffTimer <= 0) { game.slowMotionBuff = 0; } } if (game.freezeEnemiesBuff) { game.freezeEnemiesBuffTimer--; if (game.freezeEnemiesBuffTimer <= 0) { game.freezeEnemiesBuff = 0; } } // Oyuncu update player.update(); // Otomatik ateş player.shoot(); // Mermiler for (var i = bullets.length - 1; i >= 0; i--) { var b = bullets[i]; b.update(); // Ekran dışıysa sil if (b.y < -60 || b.x < -60 || b.x > 2048 + 60) { b.destroy(); bullets.splice(i, 1); continue; } // Düşman çarpışması var _loop = function _loop() { e = enemies[j]; if (b.intersects(e)) { // Mermi çarpma efekti: kısa bir büyüme ve fade out tween(b, { scaleX: 1.7, scaleY: 1.7, alpha: 0 }, { duration: 120, easing: tween.cubicOut, onFinish: function onFinish() { b.destroy(); } }); bullets.splice(i, 1); if (e.hit()) { // Düşman öldü score += 10 * currentWave; scoreText.setText(score); LK.setScore(score); // Patlama efekti (custom: ekranı turuncuya flashla) // Sarı ekran sarsıntısı kaldırıldı enemies.splice(j, 1); waveEnemiesLeft--; // Güçlendirme düşürme şansı if (Math.random() < 0.12) { spawnPowerUp(); } } return 1; // break } }, e, originalX, originalY, shakeTimes, shakeDuration, shakeCount; for (var j = enemies.length - 1; j >= 0; j--) { if (_loop()) break; } } // Düşman mermileri for (var i = enemyBullets.length - 1; i >= 0; i--) { var eb = enemyBullets[i]; eb.update(); // Ekran dışıysa sil if (eb.y < -60 || eb.y > 2732 + 60 || eb.x < -60 || eb.x > 2048 + 60) { eb.destroy(); enemyBullets.splice(i, 1); continue; } // Oyuncuya çarpışma if (eb.intersects(player)) { eb.destroy(); enemyBullets.splice(i, 1); player.hit(); continue; } } // Düşmanlar for (var i = enemies.length - 1; i >= 0; i--) { var e = enemies[i]; // Freeze: düşmanlar hareket etmesin if (game.freezeEnemiesBuff) { // update çağrılmasın, sadece animasyonlar dursun } else if (game.slowMotionBuff) { // Yavaşlat: update fonksiyonunu daha az uygula if (LK.ticks % 3 === 0) e.update(); } else { e.update(); } // Ekran dışıysa sil if (e.y > 2732 + 100) { e.destroy(); enemies.splice(i, 1); waveEnemiesLeft--; continue; } // Oyuncu çarpışması if (e.intersects(player)) { e.destroy(); enemies.splice(i, 1); waveEnemiesLeft--; player.hit(); continue; } } // Düşman mermileri for (var i = enemyBullets.length - 1; i >= 0; i--) { var eb = enemyBullets[i]; if (game.freezeEnemiesBuff) { // Düşman mermileri hareket etmesin } else if (game.slowMotionBuff) { if (LK.ticks % 3 === 0) eb.update(); } else { eb.update(); } // Ekran dışıysa sil if (eb.y < -60 || eb.y > 2732 + 60 || eb.x < -60 || eb.x > 2048 + 60) { eb.destroy(); enemyBullets.splice(i, 1); continue; } // Oyuncuya çarpışma if (eb.intersects(player)) { eb.destroy(); enemyBullets.splice(i, 1); player.hit(); continue; } } // Güçlendirmeler for (var i = powerups.length - 1; i >= 0; i--) { var pu = powerups[i]; // Magnet effect: Eğer oyuncuda magnet buff varsa, powerup'ı oyuncuya çek if (player.magnetBuff && player.magnetBuff > 0) { var dx = player.x - pu.x; var dy = player.y - pu.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist < 600) { var pull = 0.18 + (600 - dist) / 1200; // Yakınsa daha hızlı çeker pu.x += dx * pull; pu.y += dy * pull; } } pu.update(); if (pu.y > 2732 + 80) { pu.destroy(); powerups.splice(i, 1); continue; } if (pu.intersects(player)) { // Güçlendirme toplama efekti: büyüyüp fade out tween(pu, { scaleX: 1.7, scaleY: 1.7, alpha: 0 }, { duration: 180, easing: tween.cubicOut, onFinish: function onFinish() { pu.destroy(); } }); player.gainPower(pu.type); powerups.splice(i, 1); continue; } } // Boss aktifse boss update ve çarpışma kontrolü if (bossActive && boss) { boss.update(); // Boss'a mermi çarpması var _loop2 = function _loop2() { b = bullets[i]; if (b.intersects(boss)) { if (boss.hit()) { // Boss öldü score += 500 * currentWave; scoreText.setText(score); LK.setScore(score); // Boss patlama efekti (custom: ekranı kırmızıya flashla) LK.effects.flashScreen(0xff2222, 400); bossActive = false; boss = null; currentWave++; startWave(currentWave); } b.destroy(); bullets.splice(i, 1); } }, b, originalX, originalY, shakeTimes, shakeDuration, shakeCount; for (var i = bullets.length - 1; i >= 0; i--) { _loop2(); } // Boss oyuncuya çarparsa if (boss && boss.intersects(player)) { boss.destroy(); bossActive = false; boss = null; player.hit(); currentWave++; startWave(currentWave); } } else { // Dalga yönetimi if (waveEnemiesLeft <= 0 && enemies.length === 0) { currentWave++; startWave(currentWave); } } // Düşman üretimi if (waveEnemiesLeft > 0) { waveSpawnTimer--; if (waveSpawnTimer <= 0) { spawnEnemy(); waveEnemiesLeft--; waveSpawnTimer = Math.max(18, 60 - currentWave * 2); // Dalga arttıkça daha hızlı } } }; // Oyun başında skor ve canı sıfırla score = 0; LK.setScore(0); playerLives = 5; livesText.setText('♥'.repeat(playerLives)); scoreText.setText(score); currentWave = 1; waveText.setText('Dalga 1'); // Müzik başlat LK.playMusic('bgmusic'); ; ;
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
// Boss Düşman
var Boss = Container.expand(function () {
var self = Container.call(this);
var bossGfx = self.attachAsset('boss', {
anchorX: 0.5,
anchorY: 0.5
});
self.radius = bossGfx.width / 2;
self.speed = 2.2 + currentWave * 0.15;
self.hp = 20 + currentWave * 8;
self.dir = Math.PI / 2;
self.shootCooldown = 30;
self.moveTimer = 0;
self.targetX = 2048 / 2;
self.update = function () {
// Yavaşça aşağıya gelsin, sonra yatayda hareket etsin
if (self.y < 400) {
self.y += self.speed;
} else {
// Yatayda sağa-sola hareket
self.moveTimer--;
if (self.moveTimer <= 0) {
self.targetX = 300 + Math.random() * (2048 - 600);
self.moveTimer = 60 + Math.floor(Math.random() * 60);
}
if (Math.abs(self.x - self.targetX) > 10) {
self.x += (self.targetX - self.x) * 0.07;
}
}
// Ateş etme
if (self.shootCooldown > 0) {
self.shootCooldown--;
} else {
// 3 yönlü ateş
for (var i = -1; i <= 1; i++) {
var angle = Math.PI / 2 + i * Math.PI / 12;
var eb = new EnemyBullet(angle);
eb.x = self.x;
eb.y = self.y + self.radius - 30;
enemyBullets.push(eb);
game.addChild(eb);
}
self.shootCooldown = 18 + Math.floor(Math.random() * 18);
}
};
self.hit = function () {
self.hp--;
LK.effects.flashObject(self, 0xffffff, 120);
if (self.hp <= 0) {
// Ölüm animasyonu: büyüyüp patlayarak yok ol
tween(self, {
alpha: 0,
scaleX: 2.5,
scaleY: 2.5
}, {
duration: 500,
easing: tween.cubicOut,
onFinish: function onFinish() {
self.destroy();
}
});
return true;
}
return false;
};
return self;
});
// Oyuncu mermisi
var Bullet = Container.expand(function (angle) {
var self = Container.call(this);
var bulletGfx = self.attachAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.radius = bulletGfx.width / 2;
self.speed = 16;
self.angle = angle || -Math.PI / 2;
// Bullet trail group
self.trailGroup = new Container();
self.addChild(self.trailGroup);
// Trail config
self.trailInterval = 0;
self.trailIntervalMax = 2; // every 2 frames
self.update = function () {
// Move bullet
self.x += Math.cos(self.angle) * self.speed;
self.y += Math.sin(self.angle) * self.speed;
// Bullet trail logic
self.trailInterval--;
if (self.trailInterval <= 0) {
self.trailInterval = self.trailIntervalMax;
// Create a small faded bullet as trail
var trail = LK.getAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5,
width: bulletGfx.width * 0.7,
height: bulletGfx.height * 0.7,
x: 0,
y: 0
});
trail.alpha = 0.25;
self.trailGroup.addChild(trail);
// Fade and shrink the trail, then remove
tween(trail, {
alpha: 0,
width: 0,
height: 0
}, {
duration: 320,
onFinish: function onFinish() {
if (trail.parent) trail.parent.removeChild(trail);
}
});
}
};
self.setBig = function () {
// Mermi boyutunu büyüt
bulletGfx.width *= 1.8;
bulletGfx.height *= 1.8;
self.radius = bulletGfx.width / 2;
// Trail de büyüsün
self.trailIntervalMax = 1;
};
return self;
});
// Düşman
var Enemy = Container.expand(function (type) {
var self = Container.call(this);
var enemyGfx = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
self.radius = enemyGfx.width / 2;
// Düşman tipi seçimi
self.type = type || Enemy.randomType();
// Temel parametreler
self.speed = 2 + currentWave * 0.3 + Math.random() * 1.5;
self.hp = 1 + Math.floor(currentWave / 2);
self.dir = Math.PI / 2 + (Math.random() - 0.5) * 0.3; // Hafifçe sağa-sola sapabilir
self.shootCooldown = 30 + Math.floor(Math.random() * 60); // Her düşman için rastgele başlat
// Zigzag için faz
self.zigzagPhase = Math.random() * Math.PI * 2;
// Dalga için genlik ve frekans
self.waveAmplitude = 80 + Math.random() * 60;
self.waveFrequency = 0.012 + Math.random() * 0.008;
// Hedefli düşman için hedef pozisyon
self.targetX = 2048 / 2 + (Math.random() - 0.5) * 600;
self.update = function () {
// Farklı hareket tipleri
if (self.type === "straight") {
// Düz hareket
self.y += self.speed;
self.x += Math.sin(self.dir) * 2;
} else if (self.type === "zigzag") {
// Zigzag hareket
self.y += self.speed * 0.95;
self.x += Math.sin(self.y * 0.045 + self.zigzagPhase) * 12;
} else if (self.type === "wave") {
// Dalga hareketi
self.y += self.speed * 0.92;
self.x = self.targetX + Math.sin(self.y * self.waveFrequency + self.zigzagPhase) * self.waveAmplitude;
} else if (self.type === "fast") {
// Hızlı düz hareket
self.y += self.speed + 2.5;
} else if (self.type === "slow") {
// Yavaş ve daha fazla can
self.y += self.speed * 0.6;
} else {
// Varsayılan düz hareket
self.y += self.speed;
self.x += Math.sin(self.dir) * 2;
}
// Ateş etme
if (self.shootCooldown > 0) {
self.shootCooldown--;
} else {
// Kendi düz çizgisine doğru ateş et
var angle = Math.PI / 2; // Düz aşağıya (ekranın altına) ateş etsin
var eb = new EnemyBullet(angle);
eb.x = self.x;
eb.y = self.y + self.radius;
enemyBullets.push(eb);
game.addChild(eb);
self.shootCooldown = 60 + Math.floor(Math.random() * 60); // 1-2 saniyede bir ateş
}
};
self.hit = function () {
self.hp--;
LK.effects.flashObject(self, 0xffffff, 200);
if (self.hp <= 0) {
// Ölüm animasyonu: küçülerek ve şeffaflaşarak yok ol
tween(self, {
alpha: 0,
scaleX: 2,
scaleY: 2
}, {
duration: 350,
easing: tween.cubicOut,
onFinish: function onFinish() {
self.destroy();
}
});
return true;
}
return false;
};
return self;
});
// Düşman tipi seçici
// Düşman mermisi
var EnemyBullet = Container.expand(function (angle) {
var self = Container.call(this);
var bulletGfx = self.attachAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5
});
bulletGfx.tint = 0xff3333; // Kırmızıya yakın renk
self.radius = bulletGfx.width / 2;
self.speed = 9; // Daha yavaş düşman mermisi
self.angle = angle || Math.PI / 2;
self.update = function () {
self.x += Math.cos(self.angle) * self.speed;
self.y += Math.sin(self.angle) * self.speed;
};
return self;
});
var Player = Container.expand(function () {
var self = Container.call(this);
var playerGfx = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
self.radius = playerGfx.width / 2;
self.fireCooldown = 0; // Atış bekleme süresi
self.fireRate = 18; // Kaç frame'de bir ateş eder (60fps'de ~3 atış/sn)
self.powerLevel = 1; // Güç seviyesi (daha fazla mermi için)
self.invincible = false;
self.invincibleTimer = 0;
self.update = function () {
if (self.fireCooldown > 0) {
self.fireCooldown--;
}
// Rapid fire buff
if (self.fireRateBuff) {
self.fireRateBuffTimer--;
self.fireRate = 3;
if (self.fireRateBuffTimer <= 0) {
self.fireRateBuff = 0;
self.fireRate = 18 - (self.powerLevel - 1) * 4;
}
}
// Double shot buff
if (self.doubleBuff) {
self.doubleBuffTimer--;
self.tempPowerLevel = self.powerLevel + 1;
if (self.doubleBuffTimer <= 0) {
self.doubleBuff = 0;
self.tempPowerLevel = null;
}
}
if (self.invincible) {
self.invincibleTimer--;
if (self.invincibleTimer <= 0) {
self.invincible = false;
playerGfx.alpha = 1;
}
}
// Auto-aim buff
if (self.autoAimBuff) {
self.autoAimBuffTimer--;
if (self.autoAimBuffTimer <= 0) {
self.autoAimBuff = 0;
}
}
// Big bullet buff
if (self.bigBulletBuff) {
self.bigBulletBuffTimer--;
if (self.bigBulletBuffTimer <= 0) {
self.bigBulletBuff = 0;
}
}
// Magnet buff timer
if (self.magnetBuff) {
self.magnetBuffTimer--;
if (self.magnetBuffTimer <= 0) {
self.magnetBuff = 0;
}
}
};
self.shoot = function () {
if (self.fireCooldown > 0) {
return;
}
self.fireCooldown = self.fireRate;
// Güç seviyesine göre mermi sayısı
var spread = self.tempPowerLevel ? self.tempPowerLevel : self.powerLevel;
var angleStep = Math.PI / 16;
var baseAngle = -Math.PI / 2;
for (var i = 0; i < spread; i++) {
var angle = baseAngle + (i - (spread - 1) / 2) * angleStep;
// Auto-aim: hedefe en yakın düşmana yönel
if (self.autoAimBuff && enemies.length > 0) {
// En yakın düşmanı bul
var minDist = 99999,
targetEnemy = null;
for (var ei = 0; ei < enemies.length; ei++) {
var dx = enemies[ei].x - self.x;
var dy = enemies[ei].y - (self.y - self.radius);
var dist = dx * dx + dy * dy;
if (dist < minDist) {
minDist = dist;
targetEnemy = enemies[ei];
}
}
if (targetEnemy) {
angle = Math.atan2(targetEnemy.y - (self.y - self.radius), targetEnemy.x - self.x);
}
}
var b = new Bullet(angle);
// Big bullet: mermi boyutunu büyüt
if (self.bigBulletBuff) {
b.setBig();
}
b.x = self.x;
b.y = self.y - self.radius;
bullets.push(b);
game.addChild(b);
}
};
self.gainPower = function (type) {
// type: 'power', 'shield', 'bomb', 'rapid', 'double'
if (!type || type === 'power') {
if (self.powerLevel < 3) {
self.powerLevel++;
LK.effects.flashObject(self, 0x2980b9, 600);
// Ateş hızını artır: fireRate'i azalt, minimum 6 frame/sn'ye kadar düşebilir
self.fireRate = Math.max(6, self.fireRate - 4);
}
} else if (type === 'shield') {
self.invincible = true;
self.invincibleTimer = 180; // 3 saniye
playerGfx.alpha = 0.4;
LK.effects.flashObject(self, 0x00bfff, 800);
} else if (type === 'bomb') {
// Ekrandaki tüm düşmanları ve düşman mermilerini yok et
for (var i = enemies.length - 1; i >= 0; i--) {
enemies[i].destroy();
enemies.splice(i, 1);
score += 10 * currentWave;
}
for (var i = enemyBullets.length - 1; i >= 0; i--) {
enemyBullets[i].destroy();
enemyBullets.splice(i, 1);
}
scoreText.setText(score);
LK.setScore(score);
LK.effects.flashScreen(0xffffff, 400);
} else if (type === 'rapid') {
// 5 saniye boyunca ateş hızı çok yüksek
self.fireRateBuff = 1;
self.fireRateBuffTimer = 300;
LK.effects.flashObject(self, 0xffe066, 600);
} else if (type === 'double') {
// 5 saniye boyunca powerLevel +1
self.doubleBuff = 1;
self.doubleBuffTimer = 300;
LK.effects.flashObject(self, 0x8e44ad, 600);
} else if (type === 'autoaim') {
// 6 saniye boyunca otomatik hedefleme
self.autoAimBuff = 1;
self.autoAimBuffTimer = 360;
LK.effects.flashObject(self, 0x00ff00, 600);
} else if (type === 'bigbullet') {
// 6 saniye boyunca büyük mermi
self.bigBulletBuff = 1;
self.bigBulletBuffTimer = 360;
LK.effects.flashObject(self, 0xffa500, 600);
} else if (type === 'slow') {
// 5 saniye boyunca düşman mermileri ve düşmanlar yavaşlar
if (!game.slowMotionBuff || game.slowMotionBuff <= 0) {
game.slowMotionBuff = 1;
game.slowMotionBuffTimer = 300;
LK.effects.flashScreen(0x00bfae, 400);
}
} else if (type === 'freeze') {
// 3 saniye boyunca düşmanlar ve mermileri donar
if (!game.freezeEnemiesBuff || game.freezeEnemiesBuff <= 0) {
game.freezeEnemiesBuff = 1;
game.freezeEnemiesBuffTimer = 180;
LK.effects.flashScreen(0x7ed6ff, 400);
}
} else if (type === 'magnet') {
// Magnet: Yakındaki tüm güçlendirmeleri oyuncuya doğru çek
if (!self.magnetBuff || self.magnetBuff <= 0) {
self.magnetBuff = 1;
self.magnetBuffTimer = 360; // 6 saniye
LK.effects.flashObject(self, 0xff00ff, 600);
}
} else if (type === 'heal') {
// Can yenileme: Bir can ekle, maksimum 7
if (typeof playerLives !== "undefined" && playerLives < 7) {
playerLives++;
livesText.setText('♥'.repeat(playerLives));
LK.effects.flashObject(self, 0x00ff44, 600);
}
}
};
self.hit = function () {
if (self.invincible) {
return;
}
self.invincible = true;
self.invincibleTimer = 90; // 1.5 saniye
playerGfx.alpha = 0.5;
LK.effects.flashScreen(0xff0000, 500);
// Ölüm animasyonu: kısa bir sarsılma ve küçülme
tween(self, {
scaleX: 0.7,
scaleY: 0.7
}, {
duration: 120,
easing: tween.cubicOut,
onFinish: function onFinish() {
tween(self, {
scaleX: 1,
scaleY: 1
}, {
duration: 120,
easing: tween.cubicOut
});
}
});
playerLives--;
livesText.setText('♥'.repeat(playerLives));
if (playerLives <= 0) {
// Son can ise fade out animasyonu
tween(self, {
alpha: 0
}, {
duration: 400,
onFinish: function onFinish() {
LK.showGameOver();
}
});
} else {
// Can varsa normal devam
}
};
return self;
});
// Güçlendirme türleri: 'power', 'shield', 'bomb', 'rapid', 'double', 'autoaim', 'bigbullet', 'slow', 'freeze'
var PowerUp = Container.expand(function (type) {
var self = Container.call(this);
self.type = type || PowerUp.randomType();
var color = 0x00ffcc;
if (self.type === 'shield') color = 0x00bfff;else if (self.type === 'bomb') color = 0xff4444;else if (self.type === 'rapid') color = 0xffe066;else if (self.type === 'double') color = 0x8e44ad;else if (self.type === 'autoaim') color = 0x00ff00;else if (self.type === 'bigbullet') color = 0xffa500;else if (self.type === 'slow') color = 0x00bfae;else if (self.type === 'freeze') color = 0x7ed6ff;else if (self.type === 'magnet') color = 0xff00ff;else if (self.type === 'heal') color = 0x00ff44;
var puGfx = self.attachAsset('powerup', {
anchorX: 0.5,
anchorY: 0.5,
width: 80,
height: 80
});
puGfx.tint = color;
self.radius = puGfx.width / 2;
self.speed = 6;
self.update = function () {
// PowerUp yukarıdan aşağıya doğru düşer
self.y += self.speed;
};
return self;
});
/****
* Initialize Game
****/
// Tuzak (Trap) - zaman zaman ortaya çıkan ateş/mayın
// Rastgele güçlendirme türü seçici
var game = new LK.Game({
backgroundColor: 0x222831
});
/****
* Game Code
****/
// Düşman tipi seçici
// Karakter, düşman, mermi ve güçlendirme için temel şekiller
// Global değişkenler
// Rastgele güçlendirme türü seçici
Enemy.randomType = function () {
var types = ["straight", "zigzag", "wave", "fast", "slow"];
var r = Math.random();
if (r < 0.45) return "straight";
if (r < 0.65) return "zigzag";
if (r < 0.8) return "wave";
if (r < 0.92) return "fast";
return "slow";
};
PowerUp.randomType = function () {
var types = ['power', 'shield', 'bomb', 'rapid', 'double', 'autoaim', 'bigbullet', 'slow', 'freeze', 'magnet', 'heal'];
var r = Math.random();
if (r < 0.18) return 'power';
if (r < 0.26) return 'shield';
if (r < 0.34) return 'bomb';
if (r < 0.42) return 'rapid';
if (r < 0.50) return 'double';
if (r < 0.60) return 'autoaim';
if (r < 0.70) return 'bigbullet';
if (r < 0.78) return 'slow';
if (r < 0.86) return 'freeze';
if (r < 0.93) return 'magnet';
return 'heal';
};
if (!tween) {
console.error("Tween plugin failed to load!");
}
if (!storage) {
console.error("Storage plugin failed to load!");
}
var player;
var bullets = [];
var enemyBullets = [];
var enemies = [];
var powerups = [];
var boss = null;
var bossActive = false;
var currentWave = 1;
var waveEnemiesLeft = 0;
var waveSpawnTimer = 0;
var playerLives = 5;
var score = 0;
var dragNode = null;
// Bufflar
game.slowMotionBuff = 0;
game.slowMotionBuffTimer = 0;
game.freezeEnemiesBuff = 0;
game.freezeEnemiesBuffTimer = 0;
// GUI: Skor ve can
var scoreText = new Text2('0', {
size: 100,
fill: 0xFFF700
});
scoreText.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreText);
var livesText = new Text2('♥♥♥♥♥', {
size: 90,
fill: 0xE74C3C
});
livesText.anchor.set(0.5, 0);
LK.gui.topRight.addChild(livesText);
// Dalga göstergesi
var waveText = new Text2('Dalga 1', {
size: 70,
fill: 0x00BFFF
});
waveText.anchor.set(0.5, 0);
LK.gui.bottom.addChild(waveText);
// Oyuncu oluştur
player = new Player();
player.x = 2048 / 2;
player.y = 2732 - 350;
game.addChild(player);
// İlk dalgayı başlat
startWave(currentWave);
// Sürükleme/move kontrolleri
function handleMove(x, y, obj) {
if (dragNode) {
// Sınırları kontrol et
var px = Math.max(80, Math.min(2048 - 80, x));
var py = Math.max(200, Math.min(2732 - 120, y));
dragNode.x = px;
dragNode.y = py;
}
}
game.move = handleMove;
game.down = function (x, y, obj) {
// Oyuncuya tıklanırsa sürüklemeye başla
if (player && Math.abs(x - player.x) < player.radius && Math.abs(y - player.y) < player.radius) {
dragNode = player;
handleMove(x, y, obj);
}
};
game.up = function (x, y, obj) {
dragNode = null;
};
// Dalga başlatıcı
function startWave(wave) {
// Her 5. dalgada boss gelsin
// Dalga geçiş efekti: ekranı kısa süreliğine beyaza flashla ve dalga metni büyüt küçült animasyonu
LK.effects.flashScreen(wave % 5 === 0 ? 0xff2222 : 0xffffff, 300);
waveText.scale.set(1.7, 1.7);
tween(waveText.scale, {
x: 1,
y: 1
}, {
duration: 400,
easing: tween.cubicOut
});
if (wave % 5 === 0) {
bossActive = true;
boss = new Boss();
boss.x = 2048 / 2;
boss.y = -200;
game.addChild(boss);
waveEnemiesLeft = 0;
waveText.setText('BOSS Dalgası!');
} else {
bossActive = false;
boss = null;
waveEnemiesLeft = 6 + wave * 2;
waveSpawnTimer = 0;
waveText.setText('Dalga ' + wave);
}
}
// Düşman üretici
function spawnEnemy() {
// Rastgele tipli düşman oluştur
var e = new Enemy();
e.x = 150 + Math.random() * (2048 - 300);
e.y = -100;
// Eğer slow tipliyse canı artır
if (e.type === "slow") {
e.hp += 2 + Math.floor(currentWave / 2);
}
// Eğer fast tipliyse hızı artır
if (e.type === "fast") {
e.speed += 2.5;
}
enemies.push(e);
game.addChild(e);
}
// Güçlendirme üretici
function spawnPowerUp() {
var pu = new PowerUp(PowerUp.randomType());
pu.x = 200 + Math.random() * (2048 - 400);
pu.y = -80;
powerups.push(pu);
game.addChild(pu);
}
// Ana oyun döngüsü
game.update = function () {
// Buff timers
if (game.slowMotionBuff) {
game.slowMotionBuffTimer--;
if (game.slowMotionBuffTimer <= 0) {
game.slowMotionBuff = 0;
}
}
if (game.freezeEnemiesBuff) {
game.freezeEnemiesBuffTimer--;
if (game.freezeEnemiesBuffTimer <= 0) {
game.freezeEnemiesBuff = 0;
}
}
// Oyuncu update
player.update();
// Otomatik ateş
player.shoot();
// Mermiler
for (var i = bullets.length - 1; i >= 0; i--) {
var b = bullets[i];
b.update();
// Ekran dışıysa sil
if (b.y < -60 || b.x < -60 || b.x > 2048 + 60) {
b.destroy();
bullets.splice(i, 1);
continue;
}
// Düşman çarpışması
var _loop = function _loop() {
e = enemies[j];
if (b.intersects(e)) {
// Mermi çarpma efekti: kısa bir büyüme ve fade out
tween(b, {
scaleX: 1.7,
scaleY: 1.7,
alpha: 0
}, {
duration: 120,
easing: tween.cubicOut,
onFinish: function onFinish() {
b.destroy();
}
});
bullets.splice(i, 1);
if (e.hit()) {
// Düşman öldü
score += 10 * currentWave;
scoreText.setText(score);
LK.setScore(score);
// Patlama efekti (custom: ekranı turuncuya flashla)
// Sarı ekran sarsıntısı kaldırıldı
enemies.splice(j, 1);
waveEnemiesLeft--;
// Güçlendirme düşürme şansı
if (Math.random() < 0.12) {
spawnPowerUp();
}
}
return 1; // break
}
},
e,
originalX,
originalY,
shakeTimes,
shakeDuration,
shakeCount;
for (var j = enemies.length - 1; j >= 0; j--) {
if (_loop()) break;
}
}
// Düşman mermileri
for (var i = enemyBullets.length - 1; i >= 0; i--) {
var eb = enemyBullets[i];
eb.update();
// Ekran dışıysa sil
if (eb.y < -60 || eb.y > 2732 + 60 || eb.x < -60 || eb.x > 2048 + 60) {
eb.destroy();
enemyBullets.splice(i, 1);
continue;
}
// Oyuncuya çarpışma
if (eb.intersects(player)) {
eb.destroy();
enemyBullets.splice(i, 1);
player.hit();
continue;
}
}
// Düşmanlar
for (var i = enemies.length - 1; i >= 0; i--) {
var e = enemies[i];
// Freeze: düşmanlar hareket etmesin
if (game.freezeEnemiesBuff) {
// update çağrılmasın, sadece animasyonlar dursun
} else if (game.slowMotionBuff) {
// Yavaşlat: update fonksiyonunu daha az uygula
if (LK.ticks % 3 === 0) e.update();
} else {
e.update();
}
// Ekran dışıysa sil
if (e.y > 2732 + 100) {
e.destroy();
enemies.splice(i, 1);
waveEnemiesLeft--;
continue;
}
// Oyuncu çarpışması
if (e.intersects(player)) {
e.destroy();
enemies.splice(i, 1);
waveEnemiesLeft--;
player.hit();
continue;
}
}
// Düşman mermileri
for (var i = enemyBullets.length - 1; i >= 0; i--) {
var eb = enemyBullets[i];
if (game.freezeEnemiesBuff) {
// Düşman mermileri hareket etmesin
} else if (game.slowMotionBuff) {
if (LK.ticks % 3 === 0) eb.update();
} else {
eb.update();
}
// Ekran dışıysa sil
if (eb.y < -60 || eb.y > 2732 + 60 || eb.x < -60 || eb.x > 2048 + 60) {
eb.destroy();
enemyBullets.splice(i, 1);
continue;
}
// Oyuncuya çarpışma
if (eb.intersects(player)) {
eb.destroy();
enemyBullets.splice(i, 1);
player.hit();
continue;
}
}
// Güçlendirmeler
for (var i = powerups.length - 1; i >= 0; i--) {
var pu = powerups[i];
// Magnet effect: Eğer oyuncuda magnet buff varsa, powerup'ı oyuncuya çek
if (player.magnetBuff && player.magnetBuff > 0) {
var dx = player.x - pu.x;
var dy = player.y - pu.y;
var dist = Math.sqrt(dx * dx + dy * dy);
if (dist < 600) {
var pull = 0.18 + (600 - dist) / 1200; // Yakınsa daha hızlı çeker
pu.x += dx * pull;
pu.y += dy * pull;
}
}
pu.update();
if (pu.y > 2732 + 80) {
pu.destroy();
powerups.splice(i, 1);
continue;
}
if (pu.intersects(player)) {
// Güçlendirme toplama efekti: büyüyüp fade out
tween(pu, {
scaleX: 1.7,
scaleY: 1.7,
alpha: 0
}, {
duration: 180,
easing: tween.cubicOut,
onFinish: function onFinish() {
pu.destroy();
}
});
player.gainPower(pu.type);
powerups.splice(i, 1);
continue;
}
}
// Boss aktifse boss update ve çarpışma kontrolü
if (bossActive && boss) {
boss.update();
// Boss'a mermi çarpması
var _loop2 = function _loop2() {
b = bullets[i];
if (b.intersects(boss)) {
if (boss.hit()) {
// Boss öldü
score += 500 * currentWave;
scoreText.setText(score);
LK.setScore(score);
// Boss patlama efekti (custom: ekranı kırmızıya flashla)
LK.effects.flashScreen(0xff2222, 400);
bossActive = false;
boss = null;
currentWave++;
startWave(currentWave);
}
b.destroy();
bullets.splice(i, 1);
}
},
b,
originalX,
originalY,
shakeTimes,
shakeDuration,
shakeCount;
for (var i = bullets.length - 1; i >= 0; i--) {
_loop2();
}
// Boss oyuncuya çarparsa
if (boss && boss.intersects(player)) {
boss.destroy();
bossActive = false;
boss = null;
player.hit();
currentWave++;
startWave(currentWave);
}
} else {
// Dalga yönetimi
if (waveEnemiesLeft <= 0 && enemies.length === 0) {
currentWave++;
startWave(currentWave);
}
}
// Düşman üretimi
if (waveEnemiesLeft > 0) {
waveSpawnTimer--;
if (waveSpawnTimer <= 0) {
spawnEnemy();
waveEnemiesLeft--;
waveSpawnTimer = Math.max(18, 60 - currentWave * 2); // Dalga arttıkça daha hızlı
}
}
};
// Oyun başında skor ve canı sıfırla
score = 0;
LK.setScore(0);
playerLives = 5;
livesText.setText('♥'.repeat(playerLives));
scoreText.setText(score);
currentWave = 1;
waveText.setText('Dalga 1');
// Müzik başlat
LK.playMusic('bgmusic');
;
;
2d spaceship beatifull. In-Game asset. 2d. High contrast. No shadows
Yukarı doğru 3 ok upgrade. In-Game asset. 2d. High contrast. No shadows
2d bullet. In-Game asset. 2d. High contrast. No shadows
Meteor 2d. In-Game asset. 2d. High contrast. No shadows
2d enemy spaceship arka plana uyumlu olsun. In-Game asset. 2d. High contrast. No shadows
2d enemy boss spaceship. In-Game asset. 2d. High contrast. No shadows