User prompt
Magnet:** Yakındaki güçlendirmeleri otomatik çeker. - **Can yenileme:** Oyuncunun canını artıran power-up. Bunları ekl
User prompt
Bizim mermilerde çok hızlı
User prompt
Düşman ve oyuncu için ölüm animasyonları - Mermi ve güçlendirme toplama efektleri - Dalga geçişlerinde ekran efektleri yap ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Müzik ekle
User prompt
Engelleri kaldır
User prompt
Upgrade yukardan aşağıya doğru düşsün eskisi gibi şuan ekran da yanıp sönüyor sadece ve düşmanın mermileri çok hızlı
User prompt
Daha Fazla Güçlendirme (Power-Up)** - Otomatik hedefleme (auto-aim) mermisi - Geçici olarak mermilerin büyümesi olması - Yavaşlatıcı (slow motion) güçlendirmesi - Geçici olarak düşmanların hareketini donduran güçlendirme
User prompt
Daha Fazla Güçlendirme (Power-Up)** - Otomatik hedefleme (auto-aim) mermisi - Geçici olarak mermilerin büyümesi veya patlayıcı olması - Yavaşlatıcı (slow motion) güçlendirmesi - Geçici olarak düşmanların hareketini donduran güçlendirme bunları ekle
User prompt
Ekranda hareket eden veya sabit engeller (duvarlar, lazerler, hareketli bloklar) - Zaman zaman ortaya çıkan tuzaklar (ör: aniden çıkan ateş, patlayan mayınlar) bunları ekle
User prompt
Düşman başlığı altında farklı düşman hareketleri ekle
User prompt
Please fix the bug: 'tween is not defined' in or related to this line: 'if (!tween) {' Line Number: 318 ↪💡 Consider importing and using the following plugins: @upit/tween.v1
Code edit (1 edits merged)
Please save this source code
User prompt
Please fix the bug: 'TypeError: tween.to is not a function' in or related to this line: 'tween.to(trail, {' Line Number: 112 ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Mermi izi ekle
User prompt
Düşmanı vurduğumda ekranın sararmasını sil
User prompt
Ekran sarsıntısını kaldır
/**** * 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) { 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 = 28; 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) { 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 = 18; 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; }); // Engel (Obstacle) - hareketli veya sabit duvar/lazer/blok var Obstacle = Container.expand(function (opts) { var self = Container.call(this); opts = opts || {}; // Varsayılanlar self.type = opts.type || "block"; // block, laser, wall self.moving = opts.moving || false; self.speed = opts.speed || 0; self.dir = opts.dir || 1; // 1: ileri, -1: geri self.range = opts.range || 0; // hareket mesafesi self.axis = opts.axis || "x"; // "x" veya "y" self.startPos = opts.startPos || 0; self.length = opts.length || 300; self.width = opts.width || 60; self.height = opts.height || 60; self.color = opts.color || 0x888888; // Grafik var obsGfx = self.attachAsset('meteor', { anchorX: 0.5, anchorY: 0.5, width: self.width, height: self.height }); obsGfx.tint = self.color; self.radius = Math.max(self.width, self.height) / 2; // Başlangıç pozisyonu if (self.axis === "x") { self.x = self.startPos; } else { self.y = self.startPos; } self.update = function () { // Hareketli engel ise if (self.moving && self.range > 0) { if (self.axis === "x") { self.x += self.speed * self.dir; if (self.x > self.startPos + self.range || self.x < self.startPos) { self.dir *= -1; } } else { self.y += self.speed * self.dir; if (self.y > self.startPos + self.range || self.y < self.startPos) { self.dir *= -1; } } } }; return self; }); // Oyuncu karakteri 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; } } }; 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); } } }; 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); playerLives--; livesText.setText('♥'.repeat(playerLives)); if (playerLives <= 0) { LK.showGameOver(); } }; 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; 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 () { self.y += self.speed; }; return self; }); // Tuzak (Trap) - zaman zaman ortaya çıkan ateş/mayın var Trap = Container.expand(function (opts) { var self = Container.call(this); opts = opts || {}; self.type = opts.type || "fire"; // fire, mine self.active = false; self.timer = 0; self.interval = opts.interval || 120; // kaç frame'de bir aktif olur self.duration = opts.duration || 60; // aktif kalma süresi self.radius = opts.radius || 70; self.x = opts.x || 2048 / 2; self.y = opts.y || 800; // Grafik var trapGfx = self.attachAsset('powerup', { anchorX: 0.5, anchorY: 0.5, width: self.radius * 2, height: self.radius * 2 }); trapGfx.tint = self.type === "fire" ? 0xff9900 : 0xff4444; trapGfx.alpha = 0.2; self.update = function () { self.timer++; if (!self.active && self.timer >= self.interval) { self.active = true; self.timer = 0; trapGfx.alpha = 0.85; } if (self.active && self.timer >= self.duration) { self.active = false; self.timer = 0; trapGfx.alpha = 0.2; } }; // Çarpışma için intersect fonksiyonu override self.isActive = function () { return self.active; }; return self; }); /**** * Initialize Game ****/ // Rastgele güçlendirme türü seçici var game = new LK.Game({ backgroundColor: 0x222831 }); /**** * Game Code ****/ // Rastgele güçlendirme türü seçici // Global değişkenler // Karakter, düşman, mermi ve güçlendirme için temel şekiller // Düşman tipi 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']; var r = Math.random(); if (r < 0.22) return 'power'; if (r < 0.32) return 'shield'; if (r < 0.42) return 'bomb'; if (r < 0.52) return 'rapid'; if (r < 0.62) return 'double'; if (r < 0.74) return 'autoaim'; if (r < 0.84) return 'bigbullet'; if (r < 0.92) return 'slow'; return 'freeze'; }; 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 obstacles = []; // Engeller var traps = []; // Tuzaklar 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 }); // Başlangıçta bazı engeller ve tuzaklar ekle function spawnObstaclesAndTraps() { // Sabit duvar var wall = new Obstacle({ type: "block", moving: false, axis: "x", startPos: 2048 / 2, width: 400, height: 60, color: 0x888888 }); wall.x = 2048 / 2; wall.y = 1200; obstacles.push(wall); game.addChild(wall); // Yatay hareketli blok var movingBlock = new Obstacle({ type: "block", moving: true, axis: "x", startPos: 400, range: 1200, speed: 7, width: 180, height: 60, color: 0x44bfff }); movingBlock.x = 400; movingBlock.y = 700; obstacles.push(movingBlock); game.addChild(movingBlock); // Dikey hareketli blok var movingBlock2 = new Obstacle({ type: "block", moving: true, axis: "y", startPos: 400, range: 800, speed: 5, width: 60, height: 180, color: 0xffa500 }); movingBlock2.x = 1600; movingBlock2.y = 400; obstacles.push(movingBlock2); game.addChild(movingBlock2); // Ateş tuzağı (zaman zaman aktif) var fireTrap = new Trap({ type: "fire", x: 2048 / 2, y: 400, interval: 180, duration: 80, radius: 80 }); traps.push(fireTrap); game.addChild(fireTrap); // Mayın tuzağı (zaman zaman aktif) var mineTrap = new Trap({ type: "mine", x: 600, y: 1800, interval: 240, duration: 60, radius: 70 }); traps.push(mineTrap); game.addChild(mineTrap); } 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); // Engelleri ve tuzakları başlat spawnObstaclesAndTraps(); // İ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 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; } } // Engelleri güncelle for (var i = obstacles.length - 1; i >= 0; i--) { var obs = obstacles[i]; obs.update && obs.update(); // Oyuncu çarpışması if (obs.intersects && obs.intersects(player)) { player.hit(); } // Mermi engel çarpışması (oyuncu mermisi) for (var j = bullets.length - 1; j >= 0; j--) { var b = bullets[j]; if (obs.intersects && obs.intersects(b)) { b.destroy(); bullets.splice(j, 1); } } } // Tuzakları güncelle for (var i = traps.length - 1; i >= 0; i--) { var trap = traps[i]; trap.update && trap.update(); if (trap.isActive && trap.isActive()) { // Oyuncu tuzağa değerse if (trap.intersects && trap.intersects(player)) { player.hit(); } // Mermi tuzağa çarparsa mermiyi yok et for (var j = bullets.length - 1; j >= 0; j--) { var b = bullets[j]; if (trap.intersects && trap.intersects(b)) { b.destroy(); bullets.splice(j, 1); } } } } // 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)) { 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(); } } b.destroy(); bullets.splice(i, 1); 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]; pu.update(); if (pu.y > 2732 + 80) { pu.destroy(); powerups.splice(i, 1); continue; } if (pu.intersects(player)) { player.gainPower(pu.type); pu.destroy(); 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'); ;
===================================================================
--- original.js
+++ change.js
@@ -110,8 +110,16 @@
}
});
}
};
+ 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) {
@@ -267,33 +275,8 @@
self.invincibleTimer = 0;
self.update = function () {
if (self.fireCooldown > 0) {
self.fireCooldown--;
- } else if (type === 'autoaim') {
- // 5 saniye boyunca otomatik hedefleme
- self.autoAimBuff = 1;
- self.autoAimBuffTimer = 300;
- LK.effects.flashObject(self, 0x00ff00, 600);
- } else if (type === 'big') {
- // 5 saniye boyunca büyük mermi
- self.bigBulletBuff = 1;
- self.bigBulletBuffTimer = 300;
- LK.effects.flashObject(self, 0xffa500, 600);
- } else if (type === 'explosive') {
- // 5 saniye boyunca patlayıcı mermi
- self.explosiveBuff = 1;
- self.explosiveBuffTimer = 300;
- LK.effects.flashObject(self, 0xffe066, 600);
- } else if (type === 'slow') {
- // 5 saniye boyunca düşman ve mermiler yavaşlar
- globalSlowMotion = 1;
- globalSlowMotionTimer = 300;
- LK.effects.flashScreen(0x00bfff, 400);
- } else if (type === 'freeze') {
- // 3 saniye boyunca düşmanlar ve mermiler donar
- globalFreeze = 1;
- globalFreezeTimer = 180;
- LK.effects.flashScreen(0x2980b9, 400);
}
// Rapid fire buff
if (self.fireRateBuff) {
self.fireRateBuffTimer--;
@@ -311,8 +294,15 @@
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) {
@@ -325,22 +315,8 @@
if (self.bigBulletBuffTimer <= 0) {
self.bigBulletBuff = 0;
}
}
- // Explosive bullet buff
- if (self.explosiveBuff) {
- self.explosiveBuffTimer--;
- if (self.explosiveBuffTimer <= 0) {
- self.explosiveBuff = 0;
- }
- }
- if (self.invincible) {
- self.invincibleTimer--;
- if (self.invincibleTimer <= 0) {
- self.invincible = false;
- playerGfx.alpha = 1;
- }
- }
};
self.shoot = function () {
if (self.fireCooldown > 0) {
return;
@@ -351,35 +327,31 @@
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: en yakın düşmana yönel
+ // Auto-aim: hedefe en yakın düşmana yönel
if (self.autoAimBuff && enemies.length > 0) {
- var closest = null,
- minDist = 99999;
+ // 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;
+ var dy = enemies[ei].y - (self.y - self.radius);
var dist = dx * dx + dy * dy;
if (dist < minDist) {
minDist = dist;
- closest = enemies[ei];
+ targetEnemy = enemies[ei];
}
}
- if (closest) {
- angle = Math.atan2(closest.y - (self.y - self.radius), closest.x - self.x);
+ if (targetEnemy) {
+ angle = Math.atan2(targetEnemy.y - (self.y - self.radius), targetEnemy.x - self.x);
}
}
var b = new Bullet(angle);
- // Big bullet
+ // Big bullet: mermi boyutunu büyüt
if (self.bigBulletBuff) {
- b.scale.set(1.8, 1.8);
- b.radius *= 1.8;
+ b.setBig();
}
- // Explosive bullet
- if (self.explosiveBuff) {
- b.isExplosive = true;
- }
b.x = self.x;
b.y = self.y - self.radius;
bullets.push(b);
game.addChild(b);
@@ -422,8 +394,32 @@
// 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);
+ }
}
};
self.hit = function () {
if (self.invincible) {
@@ -440,17 +436,19 @@
}
};
return self;
});
-// Güçlendirme türleri: 'power', 'shield', 'bomb', 'rapid', 'double', 'autoaim', 'big', 'explosive', 'slow', 'freeze'
+// 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 === 'big') color = 0xffa500;else if (self.type === 'explosive') color = 0xffe066;else if (self.type === 'slow') color = 0x00bfff;else if (self.type === 'freeze') color = 0x2980b9;
+ 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;
var puGfx = self.attachAsset('powerup', {
anchorX: 0.5,
- anchorY: 0.5
+ anchorY: 0.5,
+ width: 80,
+ height: 80
});
puGfx.tint = color;
self.radius = puGfx.width / 2;
self.speed = 6;
@@ -510,12 +508,12 @@
/****
* 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
+// Global değişkenler
+// Karakter, düşman, mermi ve güçlendirme için temel şekiller
+// Düşman tipi seçici
Enemy.randomType = function () {
var types = ["straight", "zigzag", "wave", "fast", "slow"];
var r = Math.random();
if (r < 0.45) return "straight";
@@ -524,19 +522,17 @@
if (r < 0.92) return "fast";
return "slow";
};
PowerUp.randomType = function () {
- // Daha fazla güçlendirme türü eklendi
- var types = ['power', 'shield', 'bomb', 'rapid', 'double', 'autoaim', 'big', 'explosive', 'slow', 'freeze'];
+ var types = ['power', 'shield', 'bomb', 'rapid', 'double', 'autoaim', 'bigbullet', 'slow', 'freeze'];
var r = Math.random();
- if (r < 0.18) return 'power';
- if (r < 0.28) return 'shield';
- if (r < 0.36) return 'bomb';
- if (r < 0.46) return 'rapid';
- if (r < 0.56) return 'double';
- if (r < 0.66) return 'autoaim';
- if (r < 0.76) return 'big';
- if (r < 0.84) return 'explosive';
+ if (r < 0.22) return 'power';
+ if (r < 0.32) return 'shield';
+ if (r < 0.42) return 'bomb';
+ if (r < 0.52) return 'rapid';
+ if (r < 0.62) return 'double';
+ if (r < 0.74) return 'autoaim';
+ if (r < 0.84) return 'bigbullet';
if (r < 0.92) return 'slow';
return 'freeze';
};
if (!tween) {
@@ -559,13 +555,13 @@
var waveSpawnTimer = 0;
var playerLives = 5;
var score = 0;
var dragNode = null;
-// Yeni güçlendirme efektleri için global değişkenler
-var globalSlowMotion = 0;
-var globalSlowMotionTimer = 0;
-var globalFreeze = 0;
-var globalFreezeTimer = 0;
+// 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
@@ -731,19 +727,19 @@
game.addChild(pu);
}
// Ana oyun döngüsü
game.update = function () {
- // Slow motion ve freeze efektlerini yönet
- if (globalSlowMotion) {
- globalSlowMotionTimer--;
- if (globalSlowMotionTimer <= 0) {
- globalSlowMotion = 0;
+ // Buff timers
+ if (game.slowMotionBuff) {
+ game.slowMotionBuffTimer--;
+ if (game.slowMotionBuffTimer <= 0) {
+ game.slowMotionBuff = 0;
}
}
- if (globalFreeze) {
- globalFreezeTimer--;
- if (globalFreezeTimer <= 0) {
- globalFreeze = 0;
+ if (game.freezeEnemiesBuff) {
+ game.freezeEnemiesBuffTimer--;
+ if (game.freezeEnemiesBuffTimer <= 0) {
+ game.freezeEnemiesBuff = 0;
}
}
// Engelleri güncelle
for (var i = obstacles.length - 1; i >= 0; i--) {
@@ -787,20 +783,9 @@
player.shoot();
// Mermiler
for (var i = bullets.length - 1; i >= 0; i--) {
var b = bullets[i];
- // Freeze aktifse oyuncu mermileri hareket etsin (oyuncu avantajı)
- if (!globalFreeze) {
- b.update();
- } else {
- // Sadece trail animasyonu çalışsın
- if (b.trailGroup && b.trailGroup.children) {
- for (var t = 0; t < b.trailGroup.children.length; t++) {
- var tr = b.trailGroup.children[t];
- if (tr.update) tr.update();
- }
- }
- }
+ b.update();
// Ekran dışıysa sil
if (b.y < -60 || b.x < -60 || b.x > 2048 + 60) {
b.destroy();
bullets.splice(i, 1);
@@ -823,27 +808,8 @@
if (Math.random() < 0.12) {
spawnPowerUp();
}
}
- // Patlayıcı mermi ise yakındaki düşmanlara hasar ver
- if (b.isExplosive) {
- for (var ex = 0; ex < enemies.length; ex++) {
- var exdx = enemies[ex].x - e.x;
- var exdy = enemies[ex].y - e.y;
- var exdist = Math.sqrt(exdx * exdx + exdy * exdy);
- if (enemies[ex] !== e && exdist < 180) {
- if (enemies[ex].hit && enemies[ex].hit()) {
- score += 10 * currentWave;
- scoreText.setText(score);
- LK.setScore(score);
- enemies.splice(ex, 1);
- waveEnemiesLeft--;
- ex--;
- }
- }
- }
- LK.effects.flashObject(e, 0xffe066, 300);
- }
b.destroy();
bullets.splice(i, 1);
return 1; // break
}
@@ -860,18 +826,9 @@
}
// Düşman mermileri
for (var i = enemyBullets.length - 1; i >= 0; i--) {
var eb = enemyBullets[i];
- // Freeze veya slow motion
- if (globalFreeze) {
- // Düşman mermileri donsun
- continue;
- } else if (globalSlowMotion) {
- // Yavaşlatılmış hareket
- if (LK.ticks % 3 === 0) eb.update();
- } else {
- eb.update();
- }
+ 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);
@@ -887,13 +844,13 @@
}
// Düşmanlar
for (var i = enemies.length - 1; i >= 0; i--) {
var e = enemies[i];
- // Freeze veya slow motion
- if (globalFreeze) {
- // Düşmanlar donsun
- continue;
- } else if (globalSlowMotion) {
+ // 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();
}
@@ -912,8 +869,32 @@
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];
pu.update();
@@ -930,15 +911,9 @@
}
}
// Boss aktifse boss update ve çarpışma kontrolü
if (bossActive && boss) {
- if (globalFreeze) {
- // Boss donsun
- } else if (globalSlowMotion) {
- if (LK.ticks % 3 === 0) boss.update();
- } else {
- boss.update();
- }
+ boss.update();
// Boss'a mermi çarpması
var _loop2 = function _loop2() {
b = bullets[i];
if (b.intersects(boss)) {
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