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); } }); } }; 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; } } }; 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; var b = new Bullet(angle); 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); } }; 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' 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; var puGfx = self.attachAsset('powerup', { anchorX: 0.5, anchorY: 0.5 }); 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 ****/ // 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']; var r = Math.random(); if (r < 0.35) return 'power'; if (r < 0.55) return 'shield'; if (r < 0.7) return 'bomb'; if (r < 0.85) return 'rapid'; return 'double'; }; 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; // 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 () { // 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]; 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; } } // 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
@@ -202,8 +202,57 @@
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', {
@@ -337,8 +386,48 @@
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
****/
@@ -382,8 +471,10 @@
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;
@@ -395,8 +486,79 @@
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,
@@ -415,8 +577,10 @@
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) {
@@ -484,8 +648,44 @@
game.addChild(pu);
}
// Ana oyun döngüsü
game.update = function () {
+ // 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();
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