Code edit (2 edits merged)
Please save this source code
User prompt
Aşağıdaki kodda, aşağıdaki üç temel düzeltmeyi uyguladım: Normal enemy spawn’unun 12 saniye sonra başlaması: – Global startNormalEnemy bayrağı kullanılarak update içindeki enemy spawn kodu yalnızca bayrak true olduğunda çalışıyor. – Fade sonrası yeni oyuncu spawn edildikten 12 saniye sonra startNormalEnemy bayrağı true olarak ayarlanıyor. Wave (homing) enemy’lerin Tube2’nin önünde görünmesi: – Wave dalgasından üretilen FlyinEnemy’lere, Tube2’nin z-index değeri (2000) üzerinde, örneğin 2100, z-index değeri verildi. Normal enemy spawn’unun eskisi gibi çalışması: – Eski spawn fonksiyonu (sağdan sola giden FlyinEnemy) değiştirilmeden bırakıldı. Aşağıda tüm kodun modifiye edilmiş hali verilmiştir: js Kopyala Düzenle /**** * Assets ****/ LK.init.shape('overlay', {width:2048, height:2732, color:0x000000, shape:'box'}); LK.init.image('background', {width:2048, height:2732.07, id:'67d97ff4ed4e4720c972d114'}); LK.init.image('background2', {width:2048, height:2850, id:'67dacf6f4c81bb9f3792105a'}); LK.init.image('coin', {width:150, height:150, id:'67d58381540f369ec40716a5'}); LK.init.image('control', {width:300, height:10, id:'67d757ae885017473a98979d'}); LK.init.image('counter_background', {width:135, height:135, id:'67d757ae885017473a98979c'}); LK.init.image('enemy', {width:150, height:150, id:'67589498e1c6df8afc3f7fdf', flipX:1}); LK.init.image('flyin_enemy', {width:150, height:165, id:'67d6cc20228891638f6d62af', flipX:1}); LK.init.image('heart', {width:100, height:100, id:'67d966dd24ccde20f6adb0eb'}); LK.init.image('particle', {width:100, height:100, id:'67d62caff0905a2251a97ad1'}); LK.init.image('player', {width:150, height:150, id:'67589443e1c6df8afc3f7fd5'}); LK.init.image('tube_2', {width:250, height:375, id:'67d9810d24ccde20f6adb16b', flipY:1}); LK.init.image('tup_1', {width:250, height:375, id:'67d76073885017473a989801'}); LK.init.image('weapon', {width:120, height:120, id:'67d579ab540f369ec4071660'}); /**** * Classes ****/ // Coin class var Coin = Container.expand(function () { var self = Container.call(this); var coinGraphics = self.attachAsset('coin', { anchorX: 0.5, anchorY: 0.5 }); self.velocity = 5; self.zIndex = 15; self.update = function () { self.x -= self.velocity; }; }); // Enemy class var Enemy = Container.expand(function () { var self = Container.call(this); var enemyGraphics = self.attachAsset('enemy', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 5; self.zIndex = 10; self.canDamage = true; self.update = function () { self.x -= self.speed; if (self.x < -50) { self.destroy(); } }; }); // FlyinEnemy class (hem eski hem yeni davranışı destekliyor) var FlyinEnemy = Container.expand(function () { var self = Container.call(this); var flyinEnemyGraphics = self.attachAsset('flyin_enemy', { anchorX: 0.5, anchorY: 0 }); self.speed = 5; self.zIndex = 10; self.canDamage = true; // homing false => eski davranış, true => oyuncuya doğru hareket self.homing = false; self.vx = 0; self.vy = 0; self.update = function () { if (!self.homing) { self.x -= self.speed; if (self.x < -50) { self.destroy(); } } else { self.x += self.vx; self.y += self.vy; if (self.x < -200 || self.x > 2248 || self.y < -200 || self.y > 2932) { self.destroy(); } } }; }); // Player class var Player = Container.expand(function () { var self = Container.call(this); var playerGraphics = self.attachAsset('player', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 5; self.jumpHeight = 40; self.isJumping = false; self.velocityY = 0; self.isFalling = false; self.fallSpeed = 0; self.fallAcceleration = 0.7; self.fallTargetY = 2732 / 2 - 7; self.zIndex = 20; self.hearts = 3; self.update = function () { self.prevY = self.y; if (self.isFalling) { self.y += self.fallSpeed; self.fallSpeed += self.fallAcceleration; if (self.y >= self.fallTargetY) { self.y = self.fallTargetY; self.isFalling = false; self.fallSpeed = 0; game.weaponEnabled = true; } } self.prevY = self.y; if (self.isJumping) { self.y += self.velocityY; self.velocityY += 0.7; if (self.y >= 2732 / 2 - 3) { self.y = 2732 / 2 - 9; self.isJumping = false; self.velocityY = 0; } } }; self.jump = function () { if (!self.isJumping) { self.isJumping = true; self.velocityY = -self.jumpHeight; } }; self.loseHeart = function () { self.hearts--; playerDeaths++; if (playerDeaths === 1 && hearts[0]) { hearts[0].destroy(); } else if (playerDeaths === 2 && hearts[1]) { hearts[1].destroy(); } else if (playerDeaths === 3 && hearts[2]) { hearts[2].destroy(); } if (self.hearts <= 0) { for (var i = enemies.length - 1; i >= 0; i--) { enemies[i].destroy(); enemies.splice(i, 1); } for (var i = flyinEnemies.length - 1; i >= 0; i--) { flyinEnemies[i].destroy(); flyinEnemies.splice(i, 1); } for (var i = coins.length - 1; i >= 0; i--) { coins[i].destroy(); coins.splice(i, 1); } self.destroy(); game.weaponEnabled = false; } }; }); // ScrollingBackground class var ScrollingBackground = Container.expand(function () { var self = Container.call(this); self.bg1 = LK.getAsset('background', { anchorX: 0, anchorY: 0 }); self.bg1.x = 0; self.bg1.y = 0; self.addChild(self.bg1); self.bg2 = LK.getAsset('background', { anchorX: 1, anchorY: 0 }); self.bg2.scaleX = -1; self.bg2.x = self.bg1.width; self.bg2.y = 0; self.addChild(self.bg2); self.speed = 2; self.update = function () { self.bg1.x -= self.speed; self.bg2.x -= self.speed; if (self.bg1.x + self.bg1.width <= 0) { self.bg1.x = self.bg2.x + self.bg2.width; } if (self.bg2.x + self.bg2.width <= 0) { self.bg2.x = self.bg1.x + self.bg1.width; } }; }); // ScrollingBackground2 class var ScrollingBackground2 = Container.expand(function () { var self = Container.call(this); var bg1 = LK.getAsset('background2', { anchorX: 0, anchorY: 0 }); bg1.x = 0; bg1.y = 0; self.addChild(bg1); var bg2 = LK.getAsset('background2', { anchorX: 1, anchorY: 0 }); bg2.scaleX = -1; bg2.x = bg1.width; bg2.y = 0; self.addChild(bg2); self.speed = 2; self.update = function () { bg1.x -= self.speed; bg2.x -= self.speed; if (bg1.x + bg1.width <= 0) { bg1.x = bg2.x + bg2.width; } if (bg2.x + bg2.width <= 0) { bg2.x = bg1.x + bg1.width; } }; }); // Tube class var Tube = Container.expand(function () { var self = Container.call(this); var tubeGraphics = self.attachAsset('tup_1', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 5; self.zIndex = 0; self.update = function () { self.x -= self.speed; if (self.x < -50) { self.destroy(); } }; }); // Tube2 class var Tube2 = Container.expand(function () { var self = Container.call(this); var tubeGraphics = self.attachAsset('tube_2', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 5; self.zIndex = 2000; self.update = function () { self.x -= self.speed; if (self.x < -self.width) { self.destroy(); } }; }); // Weapon class var Weapon = Container.expand(function () { var self = Container.call(this); var weaponGraphics = self.attachAsset('weapon', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 40; self.update = function () { self.x += self.directionX * self.speed; self.y += self.directionY * self.speed; weaponGraphics.rotation += 0.3; if (Math.abs(game.down.x - self.x) < self.speed && Math.abs(game.down.y - self.y) < self.speed) { self.destroy(); } }; }); /**** * Initialize Game ****/ var game = new LK.Game({ width: 2048, height: 2732, backgroundColor: 0x000000 }); /**** * Game Code ****/ // Global Variables var startNormalEnemy = false; var coinCounter = 0; var flyinEnemies = []; var playerDeaths = 0; var hearts = []; game.controlActive = false; var coins = []; var enemies = []; var enemySpawnInterval = Math.floor(Math.random() * 100) + 30; var enemySpawnCounter = 0; var clearTriggered = false; var stopSpawn = false; game.weaponEnabled = true; // ----------------------------------------------------- // (A) Eski FlyinEnemy Spawn (sağdan sola giden, homing false) function spawnFlyinEnemy() { if (stopSpawn) { return; } var delay = Math.random() * 2000 + 2000; LK.setTimeout(function () { if (stopSpawn) { return; } var fe = new FlyinEnemy(); fe.x = 2048; fe.y = 449; fe.zIndex = 10; // homing false (default) game.addChild(fe); flyinEnemies.push(fe); spawnFlyinEnemy(); }, delay); } spawnFlyinEnemy(); // ----------------------------------------------------- // (B) Wave şeklinde, homing davranışlı FlyinEnemy Spawn function spawnWaveOfFlyinEnemies() { var spawnPoints = [ { x: 0, y: 0 }, { x: 2048, y: 0 }, { x: 0, y: 2732 }, { x: 2048, y: 2732 }, { x: 1024, y: 0 }, { x: 1024, y: 2732 }, { x: 0, y: 1366 }, { x: 2048, y: 1366 } ]; for (var i = spawnPoints.length - 1; i > 0; i--) { var j = Math.floor(Math.random() * (i + 1)); var temp = spawnPoints[i]; spawnPoints[i] = spawnPoints[j]; spawnPoints[j] = temp; } spawnPoints.forEach(function (point, index) { LK.setTimeout(function () { var enemy = new FlyinEnemy(); enemy.homing = true; enemy.wave = true; enemy.x = point.x; enemy.y = point.y; // Normal hesaplama: oyuncuya doğru vektör var dx = player.x - enemy.x; var dy = player.y - enemy.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance === 0) { distance = 1; } enemy.vx = (dx / distance) * enemy.speed; enemy.vy = (dy / distance) * enemy.speed; // Bu dalga enemy’lerini Tube2’nin önünde görünmesi için z-index’i 2100 yapın enemy.zIndex = 2100; // Eğer sol tarafta spawn olduysa aynalama if (enemy.x < 1024) { enemy.scaleX = -1; } game.addChild(enemy); flyinEnemies.push(enemy); }, index * 800); }); } // ----------------------------------------------------- // Normal enemy spawn (sağdan sola, update içinde) // Bu kısım yalnızca startNormalEnemy true olduğunda çalışır. game.update = function () { scrollingBackground.update(); player.update(); if (game.scrollingBg2 && game.scrollingBg2.update) { game.scrollingBg2.update(); } for (var t = 0; t < game.children.length; t++) { var child = game.children[t]; if (child instanceof Tube) { child.update(); } if (child.children) { for (var c = 0; c < child.children.length; c++) { var subChild = child.children[c]; if (subChild.update) { subChild.update(); } } } }; enemySpawnCounter++; if (startNormalEnemy && !stopSpawn && enemySpawnCounter >= enemySpawnInterval && !(LK.ticks >= 876 && LK.ticks <= 936) && !(LK.ticks >= 1776 && LK.ticks <= 1836) && !(LK.ticks >= 2676 && LK.ticks <= 2736) && !(LK.ticks >= 3576 && LK.ticks <= 3636) && !(LK.ticks >= 4476 && LK.ticks <= 4536) && !(LK.ticks >= 5376 && LK.ticks <= 5436) && !(LK.ticks >= 6276 && LK.ticks <= 6336) && !(LK.ticks >= 7776 && LK.ticks <= 7836)) { var canSpawn = true; for (var i = 0; i < enemies.length; i++) { if (enemies[i].x > 1800) { canSpawn = false; break; } } if (canSpawn) { var tubeCollision = false; for (var t = 0; t < game.children.length; t++) { var child = game.children[t]; if (child.asset && child.asset.name === 'tup_1') { var enemyRight = 2048 + 75; var enemyLeft = 2048 - 75; var tubeRight = child.x + 125; var tubeLeft = child.x - 125; if (!(enemyLeft > tubeRight || enemyRight < tubeLeft)) { tubeCollision = true; break; } } } if (!tubeCollision) { LK.setTimeout(function () { if (stopSpawn) { return; } var enemy = new Enemy(); enemy.x = 2048; enemy.y = 2732 / 2 - 13; enemy.zIndex = 10; enemies.push(enemy); game.addChild(enemy); }, 100); } enemySpawnCounter = 0; enemySpawnInterval = Math.floor(Math.random() * 100) + 30; } enemySpawnCounter = 0; enemySpawnInterval = Math.floor(Math.random() * 100) + 30; } game.children.sort(function (a, b) { return (a.zIndex || 0) - (b.zIndex || 0); }); // Çarpışma kontrolleri (Enemy, FlyinEnemy, Coin) -- Mevcut kodunuzda yer alan çarpışma işlemleri değişmeden devam ediyor... // [Bu kısımlar kodunuzun mevcut haliyle aynıdır.] // ... }; // Dokunma/kontrol game.down = function (x, y, obj) { if (player.isJumping && game.weaponEnabled) { if (!game.lastWeaponTime || Date.now() - game.lastWeaponTime > 350) { var weapon = new Weapon(); weapon.x = player.x; weapon.y = player.y; var dx = x - weapon.x; var dy = y - weapon.y; var distance = Math.sqrt(dx * dx + dy * dy); weapon.directionX = dx / distance; weapon.directionY = dy / distance; var angle = Math.acos(weapon.directionY / Math.sqrt(weapon.directionX * weapon.directionX + weapon.directionY * weapon.directionY)); var angleInDegrees = angle * (180 / Math.PI); if (angleInDegrees <= 30) { weapon.speed *= 1.3; } game.addChild(weapon); LK.setTimeout(function () { weapon.destroy(); }, 9000); game.lastWeaponTime = Date.now(); } } player.jump(); }; // Oyunu sahneye ekle LK.stage.addChild(game); // ----------------------------------------------------- // Tube Spawn (her 15 saniyede bir) function spawnTube() { if (stopSpawn) { return; } var tube = new Tube(); tube.x = 2048 + 125; tube.y = 2732 / 2 - 120; game.addChild(tube); var control = LK.getAsset('control', { anchorX: 0.5, anchorY: 0.5 }); control.x = 0; control.y = -177.5; tube.addChild(control); control.update = function () { if (coinCounter >= 1 && player.intersects(control)) { game.controlActive = true; LK.setTimeout(function () { for (var i = enemies.length - 1; i >= 0; i--) { enemies[i].destroy(); enemies.splice(i, 1); } for (var i = flyinEnemies.length - 1; i >= 0; i--) { flyinEnemies[i].destroy(); flyinEnemies.splice(i, 1); } }, 400); for (var i = 0; i < game.children.length; i++) { var obj = game.children[i]; if (obj.update) { obj.update = function () {}; } } LK.setTimeout(function () { player.destroy(); }, 330); enhancedFadeEffect(); } }; if (!stopSpawn) { LK.setTimeout(spawnTube, 15000); } } spawnTube(); // Arka Plan ve Oyuncu var scrollingBackground = new ScrollingBackground(); game.addChild(scrollingBackground); var player = game.addChild(new Player()); player.x = 2048 / 2 - 30; player.y = 2732 / 2 + 3; // Skor GUI ve Kalp var counterBackground = LK.getAsset('counter_background', { anchorX: 0.5, anchorY: 0.5 }); LK.gui.top.addChild(counterBackground); counterBackground.x = LK.gui.top.width / 2 - 60; counterBackground.y = 40; var scoreText = new Text2('0', { size: 80, fill: 0xFFFFFF }); LK.gui.top.addChild(scoreText); scoreText.x = LK.gui.top.width / 2 - 83; scoreText.y = 0; for (var i = 0; i < 3; i++) { var heart = LK.getAsset('heart', { anchorX: 0.5, anchorY: 0.5 }); LK.gui.top.addChild(heart); heart.x = 50 + i * 110 + 390; heart.y = 50; hearts.push(heart); } // In enhancedFadeEffect, after fade-out and before fade-in: function enhancedFadeEffect() { if (game.isFading || game.fadeCompleted || !game.controlActive) { return; } game.isFading = true; var overlay = LK.getAsset('overlay', { anchorX: 0, anchorY: 0 }); overlay.alpha = 0; if (!overlay.parent) { LK.stage.addChild(overlay); } var steps = 20; var duration = 500; var stepTime = duration / steps; var currentStep = 0; var fadeOutInterval = LK.setInterval(function () { if (currentStep < steps) { overlay.alpha = currentStep / steps; currentStep++; } else { LK.clearInterval(fadeOutInterval); currentStep = 0; stopSpawn = true; while (game.children.length > 0) { game.removeChild(game.children[0]); } var scrollingBg2 = new ScrollingBackground2(); scrollingBg2.alpha = 0; game.scrollingBg2 = scrollingBg2; game.addChild(scrollingBg2); var tube2 = new Tube2(); tube2.x = 2048 / 2 + 140; tube2.y = tube2.height / 2 - 60; game.addChild(tube2); LK.setTimeout(function () { var newPlayer = new Player(); newPlayer.x = 2048 / 2 - 30; newPlayer.y = tube2.y; newPlayer.isFalling = true; newPlayer.fallSpeed = 0; newPlayer.fallAcceleration = 0.7; newPlayer.fallTargetY = 2732 / 2 - 7; game.addChild(newPlayer); player = newPlayer; game.weaponEnabled = true; LK.setTimeout(function () { spawnWaveOfFlyinEnemies(); }, 800); // 12 seconds after respawn, start normal enemy spawn LK.setTimeout(function () { startNormalEnemy = true; }, 12000); }, 500); var fadeInDuration = 500; var fadeInStepTime = fadeInDuration / steps; var fadeInInterval = LK.setInterval(function () { if (currentStep < steps) { if (game.scrollingBg2) { game.scrollingBg2.alpha = currentStep / steps; } currentStep++; } else { LK.clearInterval(fadeInInterval); if (overlay.parent) { overlay.parent.removeChild(overlay); } // Pause background2 and tube2 for 8 seconds (or adjust as needed) var oldScrollingSpeed = game.scrollingBg2.speed; var oldTubeSpeed = tube2.speed; game.scrollingBg2.speed = 0; tube2.speed = 0; LK.setTimeout(function () { game.scrollingBg2.speed = oldScrollingSpeed; tube2.speed = oldTubeSpeed; game.isFading = false; game.fadeCompleted = true; }, 8000); } }, fadeInStepTime); } }, stepTime); } Açıklamalar Normal Enemy Spawn’u: – Global startNormalEnemy başlangıçta false. – Fade sonrası (enhancedFadeEffect içinde) yeni oyuncu spawn edildikten 12 saniye sonra startNormalEnemy true yapılıyor. – Update fonksiyonunda normal enemy spawn kodu yalnızca startNormalEnemy true olduğunda devreye giriyor. Wave Enemy’lerin Tube2’nin Önünde Görünmesi: – spawnWaveOfFlyinEnemies() fonksiyonunda, wave enemy spawn edildikten sonra z-index’i 2100 olarak ayarlayabilirsiniz. (Kodun ilgili kısmına ekleyebilirsiniz, örneğin spawnTimeout içinde enemy oluşturulduktan hemen sonra: js Kopyala Düzenle enemy.zIndex = 2100; Bu satırı ekleyerek tube2 (z-index 2000) önüne çıkmasını sağlayabilirsiniz.) Diğer Kısımlar: – Eski (sağdan sola) FlyinEnemy spawn fonksiyonu, fade öncesinde normal şekilde çalışmaya devam ediyor. – Tube spawn, fade efekti ve diğer çarpışma/GUI işlemleri kodda mevcut
User prompt
oyun başladığında enemy spawn true olsun
User prompt
1. Global Bir Bayrak Ekleyin Örneğin, en başa (diğer global değişkenlerin yanına) şu satırı ekleyin: js Kopyala Düzenle var startNormalEnemy = false; Bu değişken, normal enemy spawn’unun (update içindeki enemy spawn kısmının) çalışıp çalışmayacağını kontrol edecek. 2. Update Döngüsündeki Enemy Spawn Kontrolünü Bayrakla Koşullandırın Update döngüsünde enemy spawn yapan kısmı, yalnızca startNormalEnemy true olduğunda çalıştırın. Örneğin: js Kopyala Düzenle // Enemy spawn kodu (update içinde) if (startNormalEnemy && !stopSpawn && enemySpawnCounter >= enemySpawnInterval && !(LK.ticks >= 876 && LK.ticks <= 936) && /* diğer zaman aralıkları... */ ) { // enemy spawn işlemleri... } Bu sayede, startNormalEnemy false olduğu sürece update içindeki enemy spawn kısmı çalışmayacaktır. 3. İkinci Karakter Spawn’undan 12 Saniye Sonra Bayrağı True Yapın Fade sonrası yeni oyuncu spawn edildiğinde (enhancedFadeEffect fonksiyonunun içinde yeni oyuncu spawn edildikten sonra) 12 saniyelik bir gecikmeyle startNormalEnemy’yi true yapın. Örneğin: js Kopyala Düzenle // 0.5 sn sonra yeni oyuncu spawn edilen kısımda: LK.setTimeout(function () { var newPlayer = new Player(); newPlayer.x = 2048 / 2 - 30; newPlayer.y = tube2.y; newPlayer.isFalling = true; newPlayer.fallSpeed = 0; newPlayer.fallAcceleration = 0.7; newPlayer.fallTargetY = 2732 / 2 - 7; game.addChild(newPlayer); player = newPlayer; game.weaponEnabled = true; // Trigger wave spawn (örneğin flyin enemy dalga spawn) LK.setTimeout(function () { spawnWaveOfFlyinEnemies(); }, 800); // 12 saniye sonra normal enemy spawn’unu başlat LK.setTimeout(function () { startNormalEnemy = true; }, 12000); }, 500); Sonuç Bu düzenlemeyle: Yeni oyuncu (ikinci kez) spawn edildikten sonra, update içindeki normal enemy spawn kodu çalışmayacaktır çünkü startNormalEnemy başlangıçta false. Fade sonrası yeni oyuncu spawn edildikten 12 saniye sonra startNormalEnemy true olacak ve update içindeki enemy spawn işlemi eski mantıkla (sağdan sola) çalışmaya başlayacaktır. Bu şekilde, ikinci spawn sonrasında enemy’ler 12 saniye sonra eskisi gibi sağdan sola gelmeye başlayacaktır.
User prompt
1. Wave Halindeki FlyinEnemy’lerden Coin Çıkmamasını Sağlamak a. Dalga halinde (wave) spawn edilen flyin enemy’lerin bir özelliğini ayarlayın. Örneğin, spawnWaveOfFlyinEnemies() fonksiyonunda her oluşturduğunuz enemy’ye: js Kopyala Düzenle enemy.wave = true; b. Çarpışma (Weapon ile) kontrolünde, eğer ilgili flyin enemy’nin wave özelliği true ise coin üretimini atlayın. Örneğin, flyin enemy için çarpışma kontrolü yapan kısımda: js Kopyala Düzenle if (child instanceof Weapon && child.intersects(flyinEnemies[n])) { // Eğer enemy wave ise coin oluşturma if (!flyinEnemies[n].wave) { var coin = new Coin(); coin.x = flyinEnemies[n].x; coin.y = flyinEnemies[n].y + 60; // 60 px aşağıda coin.velocity = 5; game.addChild(coin); coins.push(coin); } // Ortak particle efekt işlemleri: var particleEffect = LK.getAsset('particle', { anchorX: 0.5, anchorY: 0.5, color: 0x808080 }); particleEffect.x = flyinEnemies[n].x - 30; // 30 px sola particleEffect.y = flyinEnemies[n].y + 30; // 30 px aşağıda game.addChild(particleEffect); LK.setTimeout(function () { particleEffect.destroy(); }, 150); flyinEnemies[n].destroy(); child.destroy(); flyinEnemies.splice(n, 1); break; } Bu sayede, wave olarak işaretlenmiş (yani level 2’de spawn edilen) flyin enemy’lerden coin üretilmeyecektir.
User prompt
Extend the pause duration for scrollingBg2 and tube2 to 8 seconds after player respawn
User prompt
decrease FlyinEnemy wave spawn interval to 0.8 seconds
User prompt
LK.setTimeout fonksiyonundaki 2000 milisaniyeyi 6000 milisaniye olarak değiştirmeniz yeterli. Yani: js Kopyala Düzenle // Eski hali (2 saniye) var oldScrollingSpeed = game.scrollingBg2.speed; var oldTubeSpeed = tube2.speed; game.scrollingBg2.speed = 0; tube2.speed = 0; LK.setTimeout(function () { game.scrollingBg2.speed = oldScrollingSpeed; tube2.speed = oldTubeSpeed; game.isFading = false; game.fadeCompleted = true; }, 2000); // 2000 ms = 2 saniye Bunu şu hale getirin: js Kopyala Düzenle // Yeni hali (6 saniye) var oldScrollingSpeed = game.scrollingBg2.speed; var oldTubeSpeed = tube2.speed; game.scrollingBg2.speed = 0; tube2.speed = 0; LK.setTimeout(function () { game.scrollingBg2.speed = oldScrollingSpeed; tube2.speed = oldTubeSpeed; game.isFading = false; game.fadeCompleted = true; }, 6000); // 6000 ms = 6 saniye Bu şekilde, background2 (ScrollingBackground2) ve Tube2, karakter ikinci kez spawn olduğunda 6 saniye boyunca hareketsiz kalacak ve sonra eski hızlarına geri dönecekler.
User prompt
1) FlyinEnemy Ters Dönme (Mirroring) Şu an spawnWaveOfFlyinEnemies() fonksiyonunda, “kuş” sol tarafta (x < 1024) spawn olursa enemy.flipX = true; yapıyorsunuz. Ancak flipX her zaman işe yaramayabilir. Bunun yerine konteynerin veya direkt görselin ölçek değerini -1 yaparak aynalama (mirror) etkisi sağlayabilirsiniz. Örneğin: js Kopyala Düzenle // Eğer sol tarafta spawn oluyorsa, aynala (mirror) if (enemy.x < 1024) { enemy.scaleX = -1; } Bunu, spawnWaveOfFlyinEnemies() fonksiyonundaki şu kısma ekleyin (kuşun oluşturulduğu satırlarda): js Kopyala Düzenle var enemy = new FlyinEnemy(); enemy.homing = true; enemy.x = point.x; enemy.y = point.y; // Oyuncuya doğru hareket için vx, vy hesaplaması // ... // *** Mirroring ekle *** if (enemy.x < 1024) { enemy.scaleX = -1; } // Sonra game.addChild(enemy), vb... İsterseniz flyinEnemyGraphics.scaleX = -1; da diyebilirsiniz, ancak en kolayı enemy.scaleX = -1; şeklinde konteyneri aynalamak. 2) FlyinEnemy Dalga Spawn Aralığını 1.2 Saniye Yapmak Şu an her kuşu index * 600 ms gecikmeyle spawn ediyorsunuz. Bunu 1200 ms yaparak 1.2 saniye aralığa çıkarabilirsiniz. Yani: js Kopyala Düzenle spawnPoints.forEach(function(point, index) { LK.setTimeout(function() { var enemy = new FlyinEnemy(); // ... }, index * 1200); // 1.2 sn }); Böylece her bir kuş, bir öncekinin spawn edilmesinden 1.2 saniye sonra gelecek. 3) Normal Enemy Öldüğünde Particle Efekt 15px Solda Olsun Normal enemy, Enemy - Weapon çarpışmasında şu şekilde particle oluşturuyorsunuz: js Kopyala Düzenle var particleEffect = LK.getAsset('particle', { anchorX: 0.5, anchorY: 0.5, color: 0x808080 }); particleEffect.x = enemies[j].x; particleEffect.y = enemies[j].y; game.addChild(particleEffect); LK.setTimeout(function () { particleEffect.destroy(); }, 150); Burada x koordinatını 15 piksel sola kaydırmak için: js Kopyala Düzenle particleEffect.x = enemies[j].x - 15; // 15 px sola particleEffect.y = enemies[j].y; Yani çarpışma anında (enemy yok olurken) şu hale getirin: js Kopyala Düzenle particleEffect.x = enemies[j].x - 15; particleEffect.y = enemies[j].y; 4) FlyinEnemy Öldüğünde Particle Efekt 30px Sola, 30px Aşağı Benzer şekilde, FlyinEnemy için FlyinEnemy - Weapon çarpışmasında particle efektini 30px sola ve 30px aşağıda oluşturmak istiyorsunuz. Kodunuzda şuna benzer bir kısım var: js Kopyala Düzenle var particleEffect = LK.getAsset('particle', { anchorX: 0.5, anchorY: 0.5, color: 0x808080 }); particleEffect.x = flyinEnemies[n].x; particleEffect.y = flyinEnemies[n].y; Bunu şu şekilde değiştirin: js Kopyala Düzenle particleEffect.x = flyinEnemies[n].x - 30; particleEffect.y = flyinEnemies[n].y + 30; Böylece soldan 30px, aşağıdan 30px kaydırarak efekti oluşturmuş olursunuz. Özetle Değişecek Satırlar Mirroring (8 yönden homing dalgada): js Kopyala Düzenle if (enemy.x < 1024) { enemy.scaleX = -1; } Dalga Spawn Aralığı (1.2 saniye): js Kopyala Düzenle }, index * 1200); Normal Enemy Particle: js Kopyala Düzenle particleEffect.x = enemies[j].x - 15; particleEffect.y = enemies[j].y; FlyinEnemy Particle: js Kopyala Düzenle particleEffect.x = flyinEnemies[n].x - 30; particleEffect.y = flyinEnemies[n].y + 30; Bu dört düzenlemeyi kodunuzun ilgili yerlerine eklediğinizde, Kuşlar (flyinEnemies) sol taraftan spawn olduklarında ters dönecek, Dalga halinde spawn aralığı 1.2 saniye olacak, Normal düşman (Enemy) ölürken 15px solda particle efekt gözükecek, FlyinEnemy ölürken 30px solda, 30px aşağıda particle efekt oluşacaktır.
User prompt
1. Spawn Noktalarını Belirleme ve Karıştırma Öncelikle, ekranın köşeleri ve kenar ortaları gibi 8 adet sabit spawn noktasını tanımlayın. Örneğin: js Kopyala Düzenle var spawnPoints = [ { x: 0, y: 0 }, // Sol üst { x: 2048, y: 0 }, // Sağ üst { x: 0, y: 2732 }, // Sol alt { x: 2048, y: 2732 }, // Sağ alt { x: 1024, y: 0 }, // Üst orta { x: 1024, y: 2732 }, // Alt orta { x: 0, y: 1366 }, // Sol orta { x: 2048, y: 1366 } // Sağ orta ]; Bu diziye eklediğiniz noktaları, Fisher–Yates shuffle yöntemiyle karıştırarak spawn sırasını rastgele hale getirebilirsiniz. js Kopyala Düzenle for (var i = spawnPoints.length - 1; i > 0; i--) { var j = Math.floor(Math.random() * (i + 1)); var temp = spawnPoints[i]; spawnPoints[i] = spawnPoints[j]; spawnPoints[j] = temp; } 2. Dalga Halinde 0.6 Saniye Arayla Spawn Etme Spawn noktalarını karıştırdıktan sonra, her bir noktadan 0.6 saniye arayla FlyinEnemy oluşturmak için bir döngü kullanabilirsiniz. Örneğin: js Kopyala Düzenle spawnPoints.forEach(function(point, index) { LK.setTimeout(function() { var enemy = new FlyinEnemy(); // Homing davranışı: spawn anında oyuncuya yönelim için gerekli ayarlama enemy.homing = true; enemy.x = point.x; enemy.y = point.y; // Oyuncunun mevcut konumuna göre hız vektörünü hesaplayın var dx = player.x - enemy.x; var dy = player.y - enemy.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance === 0) distance = 1; // Bölme hatasını engellemek için enemy.vx = (dx / distance) * enemy.speed; enemy.vy = (dy / distance) * enemy.speed; // Eğer spawn noktası sol tarafta ise, düşmanı mirror (ters) yapın if (enemy.x < 1024) { // 1024 = ekran genişliğinin yarısı (2048/2) enemy.flipX = true; // Veya: enemy.scaleX = -1; } game.addChild(enemy); flyinEnemies.push(enemy); }, index * 600); // Her bir düşman arasında 600 ms gecikme }); Bu yapı, spawn dizisindeki her noktadan sırasıyla düşman üretir. Her düşman spawn olduğunda, oyuncunun o anki konumunu referans alarak hız bileşenleri (vx, vy) hesaplanır. Böylece düşmanlar oyuncuya doğru yönlenir. 3. Dalga Spawn İşlemini Tetikleme Fade efektiniz tamamlandıktan ve yeni oyuncu (player) spawn edildikten sonra bu dalga spawn işlemini tetikleyebilirsiniz. Örneğin, fade sonrasında belirli bir gecikme (örneğin 800 ms) ekleyip: js Kopyala Düzenle LK.setTimeout(function(){ spawnWaveOfFlyinEnemies(); // Yukarıdaki fonksiyonu çağırın }, 800); Bu çağrı, fade işlemi sonrasında ek olarak 8 adet homing davranışlı FlyinEnemy spawn edecektir. Özet Spawn Noktaları: Ekranın 8 farklı köşesinden/kenarından sabit koordinatları belirleyin. Karıştırma: Fisher–Yates algoritması ile spawn noktasını rastgele sıraya koyun. Dalga Spawn: Her düşmanı 0.6 saniye arayla spawn edin; her düşmanın oyuncuya doğru yönelim sağlaması için hız vektörlerini hesaplayın. Mirroring: Eğer spawn noktası ekranın sol tarafındaysa, düşmanı flipX (veya scaleX = -1) ayarı ile ters çevirin. Tetikleme: Fade sonrası oyuncu spawn edildikten belli bir gecikme (örneğin 800 ms) ile bu fonksiyonu çağırarak dalga spawn işlemini başlatın. Bu adımları uyguladığınızda, fade sonrası oyuncu yeniden doğduğunda 8 adet FlyinEnemy, 0.6 saniye arayla farklı noktalardan spawn olup oyuncuya doğru hareket edecektir. Böylece Level2 kısmı referansına ihtiyaç duymadan istediğiniz davranışı elde edebilirsiniz.
User prompt
make flyin enemy spawn only 1 coin and the coin is the one 60 pixel down then the other
User prompt
spawn flyinenemy death coin 60 pixel down
User prompt
Please fix the bug: 'TypeError: Cannot read properties of undefined (reading 'update')' in or related to this line: 'enemies[j].update();' Line Number: 646
User prompt
Please fix the bug: 'TypeError: Cannot read properties of undefined (reading 'update')' in or related to this line: 'flyinEnemies[n].update();' Line Number: 685
User prompt
Please fix the bug: 'TypeError: Cannot read properties of undefined (reading 'homing')' in or related to this line: 'if (!flyinEnemies[n].homing && flyinEnemies[n].x < -50) {' Line Number: 721
Code edit (1 edits merged)
Please save this source code
User prompt
Please fix the bug: 'TypeError: Cannot read properties of undefined (reading 'update')' in or related to this line: 'flyinEnemies[n].update();' Line Number: 645
User prompt
karakter controle geldikten sonra kısa süreliğine yok oluyor fade in fade outtan sonra tekrar spawn oluyor bu spawn olduktan sonra aşağıdaki adımları izleyerek, karakter ikinci kez spawn olduktan 0.8 saniye sonra ekranın 8 ayrı kenar/köşe noktasından (rastgele sırayla) FlyinEnemy’lerin doğmasını ve oyuncuya doğru hareket etmesini sağlayabilirsiniz: 1) FlyinEnemy’lerin Oyuncuya Doğru Hareket Etmesi Mevcut FlyinEnemy sınıfı sadece x ekseninde sola doğru gidiyor. Bunun yerine, spawn olurken oyuncunun konumuna doğru bir hız vektörü hesaplayacağız. Aşağıdaki örnek, düşmanın doğduğu anda oyuncunun o anki konumuna doğru ilerlemesini sağlar. FlyinEnemy’yi güncelleyin veya benzer bir yeni sınıf oluşturun. Burada örnek olarak varolan FlyinEnemy'yi düzenliyoruz: js Kopyala Düzenle var FlyinEnemy = Container.expand(function () { var self = Container.call(this); // Görsel ekleme var flyinEnemyGraphics = self.attachAsset('flyin_enemy', { anchorX: 0.5, anchorY: 0.5 // Dilerseniz 0 yerine 0.5 alabilirsiniz }); self.speed = 5; self.zIndex = 10; self.canDamage = true; // Bu değişkenleri sonradan atayacağız self.vx = 0; self.vy = 0; // Update fonksiyonunda sola gitmek yerine (self.x -= self.speed) // vektör hızına göre hareket edelim: self.update = function () { self.x += self.vx; self.y += self.vy; // Örnek olarak, ekran dışına çıkarsa yok et if (self.x < -200 || self.x > 2248 || self.y < -200 || self.y > 2932) { self.destroy(); } }; return self; }); Burada vx ve vy değerlerini düşman yaratıldığı anda hesaplayacağız. Böylece her FlyinEnemy, spawn olduğu noktadan oyuncunun konumuna doğru gidecek. 2) 8 Yönden Rastgele Sırayla Spawn Olacak Bir Fonksiyon Yazmak Aşağıdaki fonksiyon, 8 farklı kenar/köşe noktasını (örnek olarak) bir diziye alır, bu diziyi karıştırır (shuffle), sonra sırayla FlyinEnemy üretir. Her üretilen düşman, spawn olduğu anda oyuncunun o anki konumuna doğru hız vektörünü ayarlar. Ayrıca her spawn arasında küçük bir gecikme yaparak “rastgele sırayla” ekrana giriş efektini elde ederiz. js Kopyala Düzenle function spawnWaveOfFlyinEnemies() { // Ekranın 8 farklı noktası (sol-üst, sağ-üst, sol-alt, sağ-alt, vs.) var spawnPoints = [ { x: 0, y: 0 }, // Sol üst köşe { x: 2048, y: 0 }, // Sağ üst köşe { x: 0, y: 2732 }, // Sol alt köşe { x: 2048, y: 2732 }, // Sağ alt köşe { x: 1024, y: 0 }, // Üst orta { x: 1024, y: 2732 }, // Alt orta { x: 0, y: 1366 }, // Sol orta { x: 2048, y: 1366 } // Sağ orta ]; // Diziyi karıştırma (Fisher–Yates shuffle) for (var i = spawnPoints.length - 1; i > 0; i--) { var j = Math.floor(Math.random() * (i + 1)); var temp = spawnPoints[i]; spawnPoints[i] = spawnPoints[j]; spawnPoints[j] = temp; } // Sırayla spawn etme var index = 0; function spawnNext() { if (index >= spawnPoints.length) { return; // Hepsini spawn ettik } var point = spawnPoints[index]; index++; // Yeni FlyinEnemy oluştur var fe = new FlyinEnemy(); fe.x = point.x; fe.y = point.y; // Oyuncunun o anki konumuna doğru hız vektörü hesapla var dx = player.x - fe.x; var dy = player.y - fe.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance === 0) distance = 1; // Bölme hatasını önlemek için fe.vx = (dx / distance) * fe.speed; fe.vy = (dy / distance) * fe.speed; // Oyuna ekle ve flyinEnemies dizisine dahil et game.addChild(fe); flyinEnemies.push(fe); // Sonraki düşmanı rastgele bir gecikme ile spawn et (200-500 ms arası) var nextDelay = Math.random() * 300 + 200; LK.setTimeout(spawnNext, nextDelay); } spawnNext(); } Not: Buradaki 8 nokta örnek amaçlı verilmiştir. İsterseniz tam köşeler ve kenar ortaları yerine, farklı koordinatlarla veya tamamen rastgele kenar noktalarıyla da spawn edebilirsiniz. 3) İkinci Spawn Sonrasında 0.8 Saniye Gecikmeyle Bu Fonksiyonu Çağırmak Kodunuzda ikinci kez karakterin fade sonrasında spawn olduğu kısım enhancedFadeEffect() içinde bulunuyor. Orada yeni oyuncu (newPlayer) oluşturduktan hemen sonra (veya fade-in bittiğinde) 0.8 saniye bekleyip spawnWaveOfFlyinEnemies() fonksiyonunu çağırabilirsiniz. Örneğin, enhancedFadeEffect() fonksiyonunun ilgili kısmında: js Kopyala Düzenle // Spawn player 0.5 seconds after Tube2's location LK.setTimeout(function () { var newPlayer = new Player(); newPlayer.x = 2048 / 2 - 30; newPlayer.y = tube2.y; newPlayer.isFalling = true; newPlayer.fallSpeed = 0; newPlayer.fallAcceleration = 0.7; newPlayer.fallTargetY = 2732 / 2 - 7; game.addChild(newPlayer); // Global player değişkenini güncelle player = newPlayer; // Weapon fonksiyonunu yeniden aktif et game.weaponEnabled = true; // *** 0.8 sn sonra 8 yönden dalga halinde FlyinEnemy spawn et *** LK.setTimeout(function () { spawnWaveOfFlyinEnemies(); }, 800); }, 500); Bu şekilde, karakter ikinci kez göründükten 0.8 saniye sonra spawnWaveOfFlyinEnemies() tetiklenecek ve düşmanlar rastgele sırayla 8 noktadan oyuncuya doğru hareket etmeye başlayacak. Ek Öneriler Eğer bu dalga bittikten sonra tekrar dalgalar halinde gelmesini isterseniz, spawnWaveOfFlyinEnemies() içindeki son spawnNext() çağrısı tamamlandıktan sonra tekrar fonksiyonu çağırabilirsiniz. Oyuncu sürekli hareket ediyorsa ve düşmanların her frame oyuncuya kilitlenmesini (homing) istiyorsanız, fe.update içinde her kare dx, dy hesaplaması yapmanız gerekir. Yukarıdaki örnekte, düşmanlar spawn anında oyuncunun konumunu referans alıyor ve sabit bir yönde ilerliyor. Düşmanların ekrandan çıktığında yok olması (örneğin if (self.x < -200 ...) self.destroy();) gibi ek koşullarla bellek kullanımını kontrol edebilirsiniz.
User prompt
Please fix the bug: 'TypeError: Cannot read properties of undefined (reading 'update')' in or related to this line: 'flyinEnemies[n].update();' Line Number: 653
User prompt
Please fix the bug: 'TypeError: Cannot read properties of undefined (reading 'update')' in or related to this line: 'flyinEnemies[n].update();' Line Number: 649
User prompt
Please fix the bug: 'TypeError: Cannot read properties of undefined (reading 'update')' in or related to this line: 'flyinEnemies[n].update();' Line Number: 644
User prompt
1m 35s hakkında Akıl yürütüldü Aşağıdaki adımları izleyerek, karakter ikinci kez spawn olduktan 0.8 saniye sonra ekranın 8 ayrı kenar/köşe noktasından (rastgele sırayla) FlyinEnemy’lerin doğmasını ve oyuncuya doğru hareket etmesini sağlayabilirsiniz: 1) FlyinEnemy’lerin Oyuncuya Doğru Hareket Etmesi Mevcut FlyinEnemy sınıfı sadece x ekseninde sola doğru gidiyor. Bunun yerine, spawn olurken oyuncunun konumuna doğru bir hız vektörü hesaplayacağız. Aşağıdaki örnek, düşmanın doğduğu anda oyuncunun o anki konumuna doğru ilerlemesini sağlar. FlyinEnemy’yi güncelleyin veya benzer bir yeni sınıf oluşturun. Burada örnek olarak varolan FlyinEnemy'yi düzenliyoruz: js Kopyala Düzenle var FlyinEnemy = Container.expand(function () { var self = Container.call(this); // Görsel ekleme var flyinEnemyGraphics = self.attachAsset('flyin_enemy', { anchorX: 0.5, anchorY: 0.5 // Dilerseniz 0 yerine 0.5 alabilirsiniz }); self.speed = 5; self.zIndex = 10; self.canDamage = true; // Bu değişkenleri sonradan atayacağız self.vx = 0; self.vy = 0; // Update fonksiyonunda sola gitmek yerine (self.x -= self.speed) // vektör hızına göre hareket edelim: self.update = function () { self.x += self.vx; self.y += self.vy; // Örnek olarak, ekran dışına çıkarsa yok et if (self.x < -200 || self.x > 2248 || self.y < -200 || self.y > 2932) { self.destroy(); } }; return self; }); Burada vx ve vy değerlerini düşman yaratıldığı anda hesaplayacağız. Böylece her FlyinEnemy, spawn olduğu noktadan oyuncunun konumuna doğru gidecek. 2) 8 Yönden Rastgele Sırayla Spawn Olacak Bir Fonksiyon Yazmak Aşağıdaki fonksiyon, 8 farklı kenar/köşe noktasını (örnek olarak) bir diziye alır, bu diziyi karıştırır (shuffle), sonra sırayla FlyinEnemy üretir. Her üretilen düşman, spawn olduğu anda oyuncunun o anki konumuna doğru hız vektörünü ayarlar. Ayrıca her spawn arasında küçük bir gecikme yaparak “rastgele sırayla” ekrana giriş efektini elde ederiz. js Kopyala Düzenle function spawnWaveOfFlyinEnemies() { // Ekranın 8 farklı noktası (sol-üst, sağ-üst, sol-alt, sağ-alt, vs.) var spawnPoints = [ { x: 0, y: 0 }, // Sol üst köşe { x: 2048, y: 0 }, // Sağ üst köşe { x: 0, y: 2732 }, // Sol alt köşe { x: 2048, y: 2732 }, // Sağ alt köşe { x: 1024, y: 0 }, // Üst orta { x: 1024, y: 2732 }, // Alt orta { x: 0, y: 1366 }, // Sol orta { x: 2048, y: 1366 } // Sağ orta ]; // Diziyi karıştırma (Fisher–Yates shuffle) for (var i = spawnPoints.length - 1; i > 0; i--) { var j = Math.floor(Math.random() * (i + 1)); var temp = spawnPoints[i]; spawnPoints[i] = spawnPoints[j]; spawnPoints[j] = temp; } // Sırayla spawn etme var index = 0; function spawnNext() { if (index >= spawnPoints.length) { return; // Hepsini spawn ettik } var point = spawnPoints[index]; index++; // Yeni FlyinEnemy oluştur var fe = new FlyinEnemy(); fe.x = point.x; fe.y = point.y; // Oyuncunun o anki konumuna doğru hız vektörü hesapla var dx = player.x - fe.x; var dy = player.y - fe.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance === 0) distance = 1; // Bölme hatasını önlemek için fe.vx = (dx / distance) * fe.speed; fe.vy = (dy / distance) * fe.speed; // Oyuna ekle ve flyinEnemies dizisine dahil et game.addChild(fe); flyinEnemies.push(fe); // Sonraki düşmanı rastgele bir gecikme ile spawn et (200-500 ms arası) var nextDelay = Math.random() * 300 + 200; LK.setTimeout(spawnNext, nextDelay); } spawnNext(); } Not: Buradaki 8 nokta örnek amaçlı verilmiştir. İsterseniz tam köşeler ve kenar ortaları yerine, farklı koordinatlarla veya tamamen rastgele kenar noktalarıyla da spawn edebilirsiniz. 3) İkinci Spawn Sonrasında 0.8 Saniye Gecikmeyle Bu Fonksiyonu Çağırmak Kodunuzda ikinci kez karakterin fade sonrasında spawn olduğu kısım enhancedFadeEffect() içinde bulunuyor. Orada yeni oyuncu (newPlayer) oluşturduktan hemen sonra (veya fade-in bittiğinde) 0.8 saniye bekleyip spawnWaveOfFlyinEnemies() fonksiyonunu çağırabilirsiniz. Örneğin, enhancedFadeEffect() fonksiyonunun ilgili kısmında: js Kopyala Düzenle // Spawn player 0.5 seconds after Tube2's location LK.setTimeout(function () { var newPlayer = new Player(); newPlayer.x = 2048 / 2 - 30; newPlayer.y = tube2.y; newPlayer.isFalling = true; newPlayer.fallSpeed = 0; newPlayer.fallAcceleration = 0.7; newPlayer.fallTargetY = 2732 / 2 - 7; game.addChild(newPlayer); // Global player değişkenini güncelle player = newPlayer; // Weapon fonksiyonunu yeniden aktif et game.weaponEnabled = true; // *** 0.8 sn sonra 8 yönden dalga halinde FlyinEnemy spawn et *** LK.setTimeout(function () { spawnWaveOfFlyinEnemies(); }, 800); }, 500); Bu şekilde, karakter ikinci kez göründükten 0.8 saniye sonra spawnWaveOfFlyinEnemies() tetiklenecek ve düşmanlar rastgele sırayla 8 noktadan oyuncuya doğru hareket etmeye başlayacak. Ek Öneriler Eğer bu dalga bittikten sonra tekrar dalgalar halinde gelmesini isterseniz, spawnWaveOfFlyinEnemies() içindeki son spawnNext() çağrısı tamamlandıktan sonra tekrar fonksiyonu çağırabilirsiniz. Oyuncu sürekli hareket ediyorsa ve düşmanların her frame oyuncuya kilitlenmesini (homing) istiyorsanız, fe.update içinde her kare dx, dy hesaplaması yapmanız gerekir. Yukarıdaki örnekte, düşmanlar spawn anında oyuncunun konumunu referans alıyor ve sabit bir yönde ilerliyor. Düşmanların ekrandan çıktığında yok olması (örneğin if (self.x < -200 ...) self.destroy();) gibi ek koşullarla bellek kullanımını kontrol edebilirsiniz.
User prompt
Clear enemies and flying enemies 0.4 seconds after player intersects with control asset
User prompt
33 saniye hakkında Akıl yürütüldü Aşağıdaki örnekte, kontrol assetine (control) dokunulduğu anda (yani karakter kontrol assetine değdiğinde) hem enemy hem de flyin enemy nesnelerinin temizlenmesi için control.update fonksiyonunu aşağıdaki gibi güncelleyebilirsiniz. Böylece karakterin yok olduğu geçiş sırasında, ekrandaki düşmanlar da temizlenir: js Kopyala Düzenle control.update = function () { if (coinCounter >= 1 && player.intersects(control)) { game.controlActive = true; // Ekrandaki tüm enemy nesnelerini temizle for (var i = enemies.length - 1; i >= 0; i--) { enemies[i].destroy(); enemies.splice(i, 1); } // Ekrandaki tüm flyin enemy nesnelerini temizle for (var i = flyinEnemies.length - 1; i >= 0; i--) { flyinEnemies[i].destroy(); flyinEnemies.splice(i, 1); } // Tüm oyun nesnelerinin update fonksiyonlarını boş fonksiyon yaparak oyunu donduruyoruz for (var i = 0; i < game.children.length; i++) { var obj = game.children[i]; if (obj.update) { obj.update = function () {}; } } LK.setTimeout(function () { player.destroy(); }, 330); enhancedFadeEffect(); } }; Bu düzenleme sayesinde, karakter kontrol assetine değdiğinde: İlk olarak game.controlActive true yapılır. enemies ve flyinEnemies dizilerinde bulunan tüm nesneler destroy edilip listeden kaldırılır. Sonrasında tüm oyun nesnelerinin update fonksiyonları boş hale getirilir (oyun dondurulur). 0.33 saniye sonra karakter destroy edilir ve fade efekt ile geçiş sağlanır. Yeni arka plan (background2), tube_2 spawn ve karakter yeniden spawn işlemleri enhancedFadeEffect() içerisinde yapılır.
User prompt
26 saniye hakkında Akıl yürütüldü Oyuncunun (karakterin) yok olduğu anda ekrandaki düşman (enemy), uçan düşman (flyin enemy) ve coin nesnelerinin de kaldırılmasını sağlamak için, oyuncunun yok olduğu durumlarda bu nesneleri temizlemeniz gerekir. Örneğin, Player sınıfındaki loseHeart() fonksiyonunda oyuncunun kalp sayısı sıfıra ulaştığında (yani oyuncu öldüğünde) aşağıdaki gibi ilgili dizilerdeki nesneleri destroy() metodu ile kaldırıp, dizileri temizleyebilirsiniz: js Kopyala Düzenle self.loseHeart = function () { self.hearts--; playerDeaths++; if (playerDeaths === 1 && hearts[0]) { hearts[0].destroy(); } else if (playerDeaths === 2 && hearts[1]) { hearts[1].destroy(); } else if (playerDeaths === 3 && hearts[2]) { hearts[2].destroy(); } if (self.hearts <= 0) { // Ekrandaki tüm enemy nesnelerini yok et for (var i = enemies.length - 1; i >= 0; i--) { enemies[i].destroy(); enemies.splice(i, 1); } // Ekrandaki tüm flyin enemy nesnelerini yok et for (var i = flyinEnemies.length - 1; i >= 0; i--) { flyinEnemies[i].destroy(); flyinEnemies.splice(i, 1); } // Ekrandaki tüm coin nesnelerini yok et for (var i = coins.length - 1; i >= 0; i--) { coins[i].destroy(); coins.splice(i, 1); } self.destroy(); game.weaponEnabled = false; // Weapon fonksiyonu devre dışı bırakılıyor. } };
/**** * Classes ****/ // Coin class var Coin = Container.expand(function () { var self = Container.call(this); var coinGraphics = self.attachAsset('coin', { anchorX: 0.5, anchorY: 0.5 }); self.velocity = 5; self.zIndex = 15; self.update = function () { self.x -= self.velocity; }; }); // Enemy class var Enemy = Container.expand(function () { var self = Container.call(this); var enemyGraphics = self.attachAsset('enemy', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 5; self.zIndex = 10; self.canDamage = true; self.update = function () { self.x -= self.speed; if (self.x < -50) { self.destroy(); } }; }); // FlyinEnemy class (tek sınıf, hem eski hem yeni davranışı destekliyor) var FlyinEnemy = Container.expand(function () { var self = Container.call(this); // AnchorY'yi 0.5 yaparsanız ortalayabilirsiniz var flyinEnemyGraphics = self.attachAsset('flyin_enemy', { anchorX: 0.5, anchorY: 0 }); self.speed = 5; self.zIndex = 10; self.canDamage = true; // homing = false => eski davranış (x -= speed) // homing = true => oyuncuya doğru vx, vy hareketi self.homing = false; self.vx = 0; self.vy = 0; self.update = function () { if (!self.homing) { // Eski davranış: x ekseninde sola git self.x -= self.speed; if (self.x < -50) { self.destroy(); } } else { // Homing davranışı: vx, vy ile hareket et self.x += self.vx; self.y += self.vy; // Ekranın çok dışına çıktıysa yok et if (self.x < -200 || self.x > 2248 || self.y < -200 || self.y > 2932) { self.destroy(); } } }; }); // Player class var Player = Container.expand(function () { var self = Container.call(this); var playerGraphics = self.attachAsset('player', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 5; self.jumpHeight = 40; self.isJumping = false; self.velocityY = 0; self.isFalling = false; self.fallSpeed = 0; self.fallAcceleration = 0.7; self.fallTargetY = 2732 / 2 - 7; // Normal player position self.zIndex = 20; self.hearts = 3; self.update = function () { self.prevY = self.y; if (self.isFalling) { self.y += self.fallSpeed; self.fallSpeed += self.fallAcceleration; if (self.y >= self.fallTargetY) { self.y = self.fallTargetY; self.isFalling = false; self.fallSpeed = 0; game.weaponEnabled = true; // Re-enable weapon functionality } } self.prevY = self.y; if (self.isJumping) { self.y += self.velocityY; self.velocityY += 0.7; if (self.y >= 2732 / 2 - 3) { self.y = 2732 / 2 - 9; self.isJumping = false; self.velocityY = 0; } } }; self.jump = function () { if (!self.isJumping) { self.isJumping = true; self.velocityY = -self.jumpHeight; } }; self.loseHeart = function () { self.hearts--; playerDeaths++; if (playerDeaths === 1 && hearts[0]) { hearts[0].destroy(); } else if (playerDeaths === 2 && hearts[1]) { hearts[1].destroy(); } else if (playerDeaths === 3 && hearts[2]) { hearts[2].destroy(); } if (self.hearts <= 0) { // Destroy all enemy objects on screen for (var i = enemies.length - 1; i >= 0; i--) { enemies[i].destroy(); enemies.splice(i, 1); } // Destroy all flying enemy objects on screen for (var i = flyinEnemies.length - 1; i >= 0; i--) { flyinEnemies[i].destroy(); flyinEnemies.splice(i, 1); } // Destroy all coin objects on screen for (var i = coins.length - 1; i >= 0; i--) { coins[i].destroy(); coins.splice(i, 1); } self.destroy(); game.weaponEnabled = false; // Disable weapon functionality } }; }); // ScrollingBackground class var ScrollingBackground = Container.expand(function () { var self = Container.call(this); self.bg1 = LK.getAsset('background', { anchorX: 0, anchorY: 0 }); self.bg1.x = 0; self.bg1.y = 0; self.addChild(self.bg1); self.bg2 = LK.getAsset('background', { anchorX: 1, anchorY: 0 }); self.bg2.scaleX = -1; self.bg2.x = self.bg1.width; self.bg2.y = 0; self.addChild(self.bg2); self.speed = 2; self.update = function () { self.bg1.x -= self.speed; self.bg2.x -= self.speed; if (self.bg1.x + self.bg1.width <= 0) { self.bg1.x = self.bg2.x + self.bg2.width; } if (self.bg2.x + self.bg2.width <= 0) { self.bg2.x = self.bg1.x + self.bg1.width; } }; }); // ScrollingBackground2 class var ScrollingBackground2 = Container.expand(function () { var self = Container.call(this); var bg1 = LK.getAsset('background2', { anchorX: 0, anchorY: 0 }); bg1.x = 0; bg1.y = 0; self.addChild(bg1); var bg2 = LK.getAsset('background2', { anchorX: 1, anchorY: 0 }); bg2.scaleX = -1; bg2.x = bg1.width; bg2.y = 0; self.addChild(bg2); self.speed = 2; self.update = function () { bg1.x -= self.speed; bg2.x -= self.speed; if (bg1.x + bg1.width <= 0) { bg1.x = bg2.x + bg2.width; } if (bg2.x + bg2.width <= 0) { bg2.x = bg1.x + bg1.width; } }; }); // Tube class var Tube = Container.expand(function () { var self = Container.call(this); var tubeGraphics = self.attachAsset('tup_1', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 5; self.zIndex = 0; self.update = function () { self.x -= self.speed; if (self.x < -50) { self.destroy(); } }; }); // Tube2 class var Tube2 = Container.expand(function () { var self = Container.call(this); var tubeGraphics = self.attachAsset('tube_2', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 5; // Match the speed of background2 self.zIndex = 2000; // Ensure it appears in front of the background self.update = function () { self.x -= self.speed; if (self.x < -self.width) { self.destroy(); } }; }); // Weapon class var Weapon = Container.expand(function () { var self = Container.call(this); var weaponGraphics = self.attachAsset('weapon', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 40; self.update = function () { self.x += self.directionX * self.speed; self.y += self.directionY * self.speed; weaponGraphics.rotation += 0.3; if (Math.abs(game.down.x - self.x) < self.speed && Math.abs(game.down.y - self.y) < self.speed) { self.destroy(); } }; }); /**** * Initialize Game ****/ var game = new LK.Game({ width: 2048, height: 2732, backgroundColor: 0x000000 }); /**** * Game Code ****/ // Global Variables var coinCounter = 0; var flyinEnemies = []; var playerDeaths = 0; var hearts = []; game.controlActive = false; var coins = []; var enemies = []; var enemySpawnInterval = Math.floor(Math.random() * 100) + 30; var enemySpawnCounter = 0; var clearTriggered = false; var stopSpawn = false; // Fade sonrası spawn duracak game.weaponEnabled = true; // Enable weapon functionality at the beginning // ----------------------------------------------------- // (A) ESKİ FLYIN ENEMY SPAWN: SAĞDAN GİRİP SOLA GİDER // ----------------------------------------------------- function spawnFlyinEnemy() { if (stopSpawn) { return; } var delay = Math.random() * 2000 + 2000; LK.setTimeout(function () { if (stopSpawn) { return; } var fe = new FlyinEnemy(); // homing = false => eski davranış fe.x = 2048; fe.y = 449; // Dilerseniz random yapabilirsiniz fe.zIndex = 10; // Speed varsayılan 5 (FlyinEnemy içinde tanımlı) // fe.homing = false (zaten default) game.addChild(fe); flyinEnemies.push(fe); // Tekrar spawnFlyinEnemy çağırarak sürekli spawn ediyoruz spawnFlyinEnemy(); }, delay); } spawnFlyinEnemy(); // OYUN BAŞLAR BAŞLAMAZ ESKİ MANTIK DEVAM ETSİN // Define spawn points for FlyinEnemies var spawnPoints = [{ x: 0, y: 0 }, // Sol üst { x: 2048, y: 0 }, // Sağ üst { x: 0, y: 2732 }, // Sol alt { x: 2048, y: 2732 }, // Sağ alt { x: 1024, y: 0 }, // Üst orta { x: 1024, y: 2732 }, // Alt orta { x: 0, y: 1366 }, // Sol orta { x: 2048, y: 1366 } // Sağ orta ]; // Shuffle spawn points using Fisher–Yates algorithm for (var i = spawnPoints.length - 1; i > 0; i--) { var j = Math.floor(Math.random() * (i + 1)); var temp = spawnPoints[i]; spawnPoints[i] = spawnPoints[j]; spawnPoints[j] = temp; } // ----------------------------------------------------- // (B) 8 YÖNDEN (HOMING) DALGA HALİNDE FLYIN ENEMY SPAWN // ----------------------------------------------------- function spawnWaveOfFlyinEnemies() { // Ekranın 8 farklı köşe/kenar noktası var spawnPoints = [{ x: 0, y: 0 }, // Sol üst { x: 2048, y: 0 }, // Sağ üst { x: 0, y: 2732 }, // Sol alt { x: 2048, y: 2732 }, // Sağ alt { x: 1024, y: 0 }, // Üst orta { x: 1024, y: 2732 }, // Alt orta { x: 0, y: 1366 }, // Sol orta { x: 2048, y: 1366 } // Sağ orta ]; // Fisher–Yates Shuffle ile karıştır for (var i = spawnPoints.length - 1; i > 0; i--) { var j = Math.floor(Math.random() * (i + 1)); var temp = spawnPoints[i]; spawnPoints[i] = spawnPoints[j]; spawnPoints[j] = temp; } // Spawn FlyinEnemies in waves with homing behavior spawnPoints.forEach(function (point, index) { LK.setTimeout(function () { var enemy = new FlyinEnemy(); enemy.homing = true; enemy.wave = true; enemy.x = point.x; enemy.y = point.y; // Calculate velocity vector towards the player var dx = player.x - enemy.x; var dy = player.y - enemy.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance === 0) { distance = 1; } // Prevent division by zero enemy.vx = dx / distance * enemy.speed; enemy.vy = dy / distance * enemy.speed; // Mirror enemy if spawned on the left side if (enemy.x < 1024) { enemy.scaleX = -1; } game.addChild(enemy); flyinEnemies.push(enemy); }, index * 800); // 0.8 seconds delay between each enemy spawn }); } // Fade Effect Function (2. kez arka plana geçiş) function enhancedFadeEffect() { if (game.isFading || game.fadeCompleted || !game.controlActive) { return; } game.isFading = true; var overlay = LK.getAsset('overlay', { anchorX: 0, anchorY: 0 }); overlay.alpha = 0; if (!overlay.parent) { LK.stage.addChild(overlay); } var steps = 20; var duration = 500; var stepTime = duration / steps; var currentStep = 0; // Fade-Out: overlay.alpha 0 -> 1 var fadeOutInterval = LK.setInterval(function () { if (currentStep < steps) { overlay.alpha = currentStep / steps; currentStep++; } else { LK.clearInterval(fadeOutInterval); currentStep = 0; stopSpawn = true; // Spawn işlemleri durdu // Sahnedeki her şeyi temizle while (game.children.length > 0) { game.removeChild(game.children[0]); } // Yeni background2 var scrollingBg2 = new ScrollingBackground2(); scrollingBg2.alpha = 0; game.scrollingBg2 = scrollingBg2; game.addChild(scrollingBg2); // Tube2 var tube2 = new Tube2(); tube2.x = 2048 / 2 + 140; tube2.y = tube2.height / 2 - 60; game.addChild(tube2); // 0.5 sn sonra yeni oyuncu spawn LK.setTimeout(function () { var newPlayer = new Player(); newPlayer.x = 2048 / 2 - 30; newPlayer.y = tube2.y; newPlayer.isFalling = true; newPlayer.fallSpeed = 0; newPlayer.fallAcceleration = 0.7; newPlayer.fallTargetY = 2732 / 2 - 7; game.addChild(newPlayer); player = newPlayer; game.weaponEnabled = true; // Trigger wave spawn after fade effect and player spawn LK.setTimeout(function () { spawnWaveOfFlyinEnemies(); }, 800); }, 500); // Fade-In: scrollingBg2 alpha 0 -> 1 var fadeInDuration = 500; var fadeInStepTime = fadeInDuration / steps; var fadeInInterval = LK.setInterval(function () { if (currentStep < steps) { if (game.scrollingBg2) { game.scrollingBg2.alpha = currentStep / steps; } currentStep++; } else { LK.clearInterval(fadeInInterval); if (overlay.parent) { overlay.parent.removeChild(overlay); } // 2 sn bekleyip background2 ve tube2 hareketini tekrar başlat var oldScrollingSpeed = game.scrollingBg2.speed; var oldTubeSpeed = tube2.speed; game.scrollingBg2.speed = 0; tube2.speed = 0; LK.setTimeout(function () { game.scrollingBg2.speed = oldScrollingSpeed; tube2.speed = oldTubeSpeed; game.isFading = false; game.fadeCompleted = true; }, 8000); } }, fadeInStepTime); } }, stepTime); } // Tube Spawn (her 15 saniyede bir) function spawnTube() { if (stopSpawn) { return; } var tube = new Tube(); tube.x = 2048 + 125; tube.y = 2732 / 2 - 120; game.addChild(tube); var control = LK.getAsset('control', { anchorX: 0.5, anchorY: 0.5 }); control.x = 0; control.y = -177.5; tube.addChild(control); control.update = function () { if (coinCounter >= 1 && player.intersects(control)) { game.controlActive = true; // 0.4 sn sonra düşmanları temizle LK.setTimeout(function () { for (var i = enemies.length - 1; i >= 0; i--) { enemies[i].destroy(); enemies.splice(i, 1); } for (var i = flyinEnemies.length - 1; i >= 0; i--) { flyinEnemies[i].destroy(); flyinEnemies.splice(i, 1); } }, 400); // Tüm update fonksiyonlarını boşaltarak oyunu dondur for (var i = 0; i < game.children.length; i++) { var obj = game.children[i]; if (obj.update) { obj.update = function () {}; } } // 0.33 sn sonra oyuncuyu yok et LK.setTimeout(function () { player.destroy(); }, 330); // Fade efekti enhancedFadeEffect(); } }; if (!stopSpawn) { LK.setTimeout(spawnTube, 15000); } } spawnTube(); // Arka Plan ve Oyuncu var scrollingBackground = new ScrollingBackground(); game.addChild(scrollingBackground); var player = game.addChild(new Player()); player.x = 2048 / 2 - 30; player.y = 2732 / 2 + 3; // Skor GUI ve Kalp var counterBackground = LK.getAsset('counter_background', { anchorX: 0.5, anchorY: 0.5 }); LK.gui.top.addChild(counterBackground); counterBackground.x = LK.gui.top.width / 2 - 60; counterBackground.y = 40; var scoreText = new Text2('0', { size: 80, fill: 0xFFFFFF }); LK.gui.top.addChild(scoreText); scoreText.x = LK.gui.top.width / 2 - 83; scoreText.y = 0; // Kalpler for (var i = 0; i < 3; i++) { var heart = LK.getAsset('heart', { anchorX: 0.5, anchorY: 0.5 }); LK.gui.top.addChild(heart); heart.x = 50 + i * 110 + 390; heart.y = 50; hearts.push(heart); } // Oyun Döngüsü game.update = function () { scrollingBackground.update(); player.update(); if (game.scrollingBg2 && game.scrollingBg2.update) { game.scrollingBg2.update(); } for (var t = 0; t < game.children.length; t++) { var child = game.children[t]; if (child instanceof Tube) { child.update(); } if (child.children) { for (var c = 0; c < child.children.length; c++) { var subChild = child.children[c]; if (subChild.update) { subChild.update(); } } } } enemySpawnCounter++; if (!stopSpawn && enemySpawnCounter >= enemySpawnInterval && !(LK.ticks >= 876 && LK.ticks <= 936) && !(LK.ticks >= 1776 && LK.ticks <= 1836) && !(LK.ticks >= 2676 && LK.ticks <= 2736) && !(LK.ticks >= 3576 && LK.ticks <= 3636) && !(LK.ticks >= 4476 && LK.ticks <= 4536) && !(LK.ticks >= 5376 && LK.ticks <= 5436) && !(LK.ticks >= 6276 && LK.ticks <= 6336) && !(LK.ticks >= 7776 && LK.ticks <= 7836)) { var canSpawn = true; for (var i = 0; i < enemies.length; i++) { if (enemies[i].x > 1800) { canSpawn = false; break; } } if (canSpawn) { var tubeCollision = false; for (var t = 0; t < game.children.length; t++) { var child = game.children[t]; if (child.asset && child.asset.name === 'tup_1') { var enemyRight = 2048 + 75; var enemyLeft = 2048 - 75; var tubeRight = child.x + 125; var tubeLeft = child.x - 125; if (!(enemyLeft > tubeRight || enemyRight < tubeLeft)) { tubeCollision = true; break; } } } if (!tubeCollision) { LK.setTimeout(function () { if (stopSpawn) { return; } var enemy = new Enemy(); enemy.x = 2048; enemy.y = 2732 / 2 - 13; enemy.zIndex = 10; enemies.push(enemy); game.addChild(enemy); }, 100); } enemySpawnCounter = 0; enemySpawnInterval = Math.floor(Math.random() * 100) + 30; } enemySpawnCounter = 0; enemySpawnInterval = Math.floor(Math.random() * 100) + 30; } // Z-index sıralaması game.children.sort(function (a, b) { return (a.zIndex || 0) - (b.zIndex || 0); }); // Enemy - Player çarpışmaları for (var j = enemies.length - 1; j >= 0; j--) { if (enemies[j]) { enemies[j].update(); } if (player.intersects(enemies[j]) && enemies[j].canDamage) { enemies[j].canDamage = false; LK.effects.flashScreen(0xff0000, 750, 0.0001); player.loseHeart(); if (player.hearts <= 0) { LK.showGameOver(); } } // Enemy - Weapon çarpışmaları for (var k = game.children.length - 1; k >= 0; k--) { var child = game.children[k]; if (child instanceof Weapon && child.intersects(enemies[j])) { var coin = new Coin(); coin.x = enemies[j].x; coin.y = enemies[j].y; coin.velocity = 5; game.addChild(coin); coins.push(coin); var particleEffect = LK.getAsset('particle', { anchorX: 0.5, anchorY: 0.5, color: 0x808080 }); particleEffect.x = enemies[j].x - 15; // 15 px to the left particleEffect.y = enemies[j].y; game.addChild(particleEffect); LK.setTimeout(function () { particleEffect.destroy(); }, 150); enemies[j].destroy(); child.destroy(); enemies.splice(j, 1); break; } } } // FlyinEnemy - Player/Weapon çarpışmaları for (var n = flyinEnemies.length - 1; n >= 0; n--) { if (flyinEnemies[n]) { flyinEnemies[n].update(); } if (player.intersects(flyinEnemies[n]) && flyinEnemies[n].canDamage) { flyinEnemies[n].canDamage = false; LK.effects.flashScreen(0xff0000, 750, 0.0001); player.loseHeart(); if (player.hearts <= 0) { LK.showGameOver(); } } for (var k = game.children.length - 1; k >= 0; k--) { var child = game.children[k]; if (child instanceof Weapon && child.intersects(flyinEnemies[n])) { if (!flyinEnemies[n].wave) { var coin = new Coin(); coin.x = flyinEnemies[n].x; coin.y = flyinEnemies[n].y + 60; // Spawn 60 pixels below coin.velocity = 5; game.addChild(coin); coins.push(coin); } var particleEffect = LK.getAsset('particle', { anchorX: 0.5, anchorY: 0.5, color: 0x808080 }); particleEffect.x = flyinEnemies[n].x - 30; // 30 px to the left particleEffect.y = flyinEnemies[n].y + 30; // 30 px down game.addChild(particleEffect); LK.setTimeout(function () { particleEffect.destroy(); }, 150); flyinEnemies[n].destroy(); child.destroy(); flyinEnemies.splice(n, 1); break; } } // Ekrandan sol tarafa çok çıktılarsa yok et if (flyinEnemies[n] && !flyinEnemies[n].homing && flyinEnemies[n].x < -50) { flyinEnemies[n].destroy(); flyinEnemies.splice(n, 1); } // Homing düşmanlar için de isterseniz benzer yok etme kuralı } // Coin toplanması for (var m = coins.length - 1; m >= 0; m--) { var coin = coins[m]; coin.x -= coin.velocity; if (coin.x < -100) { coin.destroy(); coins.splice(m, 1); } else if (player.intersects(coin)) { coinCounter++; scoreText.setText(coinCounter.toString()); if (coinCounter > 9 && !scoreText.movedLeft) { scoreText.x -= 20; scoreText.movedLeft = true; } coin.destroy(); coins.splice(m, 1); } } }; // Dokunma/kontrol game.down = function (x, y, obj) { if (player.isJumping && game.weaponEnabled) { if (!game.lastWeaponTime || Date.now() - game.lastWeaponTime > 350) { var weapon = new Weapon(); weapon.x = player.x; weapon.y = player.y; var dx = x - weapon.x; var dy = y - weapon.y; var distance = Math.sqrt(dx * dx + dy * dy); weapon.directionX = dx / distance; weapon.directionY = dy / distance; var angle = Math.acos(weapon.directionY / Math.sqrt(weapon.directionX * weapon.directionX + weapon.directionY * weapon.directionY)); var angleInDegrees = angle * (180 / Math.PI); if (angleInDegrees <= 30) { weapon.speed *= 1.3; } game.addChild(weapon); LK.setTimeout(function () { weapon.destroy(); }, 9000); game.lastWeaponTime = Date.now(); } } player.jump(); }; // Oyunu sahneye ekle LK.stage.addChild(game);
===================================================================
--- original.js
+++ change.js
@@ -407,8 +407,9 @@
spawnPoints.forEach(function (point, index) {
LK.setTimeout(function () {
var enemy = new FlyinEnemy();
enemy.homing = true;
+ enemy.wave = true;
enemy.x = point.x;
enemy.y = point.y;
// Calculate velocity vector towards the player
var dx = player.x - enemy.x;
@@ -722,14 +723,16 @@
}
for (var k = game.children.length - 1; k >= 0; k--) {
var child = game.children[k];
if (child instanceof Weapon && child.intersects(flyinEnemies[n])) {
- var coin = new Coin();
- coin.x = flyinEnemies[n].x;
- coin.y = flyinEnemies[n].y + 60; // Spawn 60 pixels below
- coin.velocity = 5;
- game.addChild(coin);
- coins.push(coin);
+ if (!flyinEnemies[n].wave) {
+ var coin = new Coin();
+ coin.x = flyinEnemies[n].x;
+ coin.y = flyinEnemies[n].y + 60; // Spawn 60 pixels below
+ coin.velocity = 5;
+ game.addChild(coin);
+ coins.push(coin);
+ }
var particleEffect = LK.getAsset('particle', {
anchorX: 0.5,
anchorY: 0.5,
color: 0x808080
Single 2D Mario Character. In-Game asset. 2d. Blank background.
2D Single Monster. In-Game asset. 2d. Blank background. High contrast. No shadows.. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
marionun ingiliz boru anahtarı aleti. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
red heart mario. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
completely black simple counter without sharp edges
sea and sky,pixel,realistic but detailles benzer renkler mavi ve mavi Single Game Texture. In-Game asset. 2d. Blank background. low contrast. No shadows