User prompt
spawn control_2 spawn at the spawn point as the tube that goes right to left spawned after flyin enemy wave started
User prompt
Please fix the bug: 'Cannot set properties of undefined (setting 'update')' in or related to this line: 'control_2.update = function () {' Line Number: 289
User prompt
Please fix the bug: 'Cannot set properties of undefined (setting 'update')' in or related to this line: 'control_2.update = function () {' Line Number: 289
User prompt
Please fix the bug: 'Cannot set properties of undefined (setting 'update')' in or related to this line: 'control_2.update = function () {' Line Number: 289
User prompt
Please fix the bug: 'Cannot set properties of undefined (setting 'update')' in or related to this line: 'control_2.update = function () {' Line Number: 289
User prompt
Please fix the bug: 'Cannot set properties of undefined (setting 'update')' in or related to this line: 'control_2.update = function () {' Line Number: 289
User prompt
Please fix the bug: 'Cannot set properties of undefined (setting 'update')' in or related to this line: 'control_2.update = function () {' Line Number: 289
User prompt
Please fix the bug: 'Cannot set properties of undefined (setting 'update')' in or related to this line: 'control_2.update = function () {' Line Number: 289
User prompt
Please fix the bug: 'Cannot set properties of undefined (setting 'update')' in or related to this line: 'control_2.update = function () {' Line Number: 289
User prompt
Please fix the bug: 'Cannot set properties of undefined (setting 'update')' in or related to this line: 'control_2.update = function () {' Line Number: 289
User prompt
Please fix the bug: 'Cannot set properties of undefined (setting 'update')' in or related to this line: 'control_2.update = function () {' Line Number: 289
User prompt
Please fix the bug: 'control_2 is not defined' in or related to this line: 'control_2.update = function () {' Line Number: 289
User prompt
Aşağıdaki örnekte, görünmez bir control_2 varlığını (asset) tube_2’ye tam olarak ekleyecek şekilde nasıl yerleştireceğinizi gösteriyorum. Burada control_2, tube_2’nin çocuğu olarak ekleniyor; böylece tube_2 ile birlikte hareket ediyor ve pozisyonu tube_2’ye göre ayarlanıyor. Ayrıca, control_2 update fonksiyonunda 30 coin eşiğine göre tetiklenecek (örneğin; tube içinde karakter zıpladığında). İşte örnek düzenleme: js Kopyala Düzenle // Tube2 spawn edildiği yerde, control_2’yi tube_2’ye ekleyelim: var tube2 = new Tube2(); tube2.x = 2048 / 2 + 140; tube2.y = tube2.height / 2 - 60; game.addChild(tube2); // tube_2’nin içine eklemek için control_2 varlığını alın: var control_2 = LK.getAsset('control_2', { anchorX: 0.5, anchorY: 0.5 }); // control_2’nin tube2 içindeki konumunu ayarlayın (örneğin, control ile aynı konumda olacak şekilde) control_2.x = 0; // tube2'nin merkezi control_2.y = -177.5; // control assetindeki gibi tube2.addChild(control_2); // control_2 update fonksiyonunu ekleyin: control_2.update = function () { if (player.intersects(control_2)) { // Burada, 30 coin eşiğine ulaşıldığında tetiklenmesi isteniyor. if (coinCounter >= 30) { console.log("Control_2 event triggered: coinCounter = " + coinCounter); // Buraya gerekli event işlemlerini ekleyin, örneğin: startNormalEnemy = false; game.controlActive = true; LK.setTimeout(function () { // Düşmanları temizle 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ı geçici olarak devre dışı bırak 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(); // İsteğe bağlı: coinCounter'ı sıfırlamak isterseniz burada yapabilirsiniz. // coinCounter = 0; // scoreText.setText(coinCounter.toString()); } } }; Açıklamalar Control_2’nin Tube2’ye Eklenmesi: - var control_2 = LK.getAsset('control_2', {...}); ile control_2 varlığını elde ediyoruz. - control_2.x ve control_2.y değerlerini, tube_2’nin koordinatlarına göre (relative) ayarlıyoruz. Bu sayede control_2, tube_2’nin tam ortasında (veya istediğiniz konumda) görünecek. Update Fonksiyonu: - control_2.update içinde, oyuncu (player) ile control_2’nin çakışması kontrol ediliyor. - Eğer coinCounter 30 veya daha fazla ise (yani ikinci etkinlik için eşik), gerekli event tetikleniyor (örneğin, tüm düşmanları temizlemek, oyuncuyu yok etmek, fade efektini başlatmak vb.). - Bu kısımda coinCounter sıfırlama kodu yorum satırı olarak eklenmiş; eğer isterseniz burayı açabilirsiniz. Yerleşim: - Tube2 spawn edilirken, control_2 tube2’ye child olarak ekleniyor. Böylece tube2 ile birlikte hareket ediyor ve tube2’nin koordinat sistemi içinde yer alıyor. Bu düzenleme sayesinde, control_2 tam olarak tube_2 üzerinde (veya tube_2 ile aynı konumda) konumlandırılacak ve coinCounter 30’a ulaştığında (veya daha fazla olduğunda) tetiklenecektir. Böylece oyuncu tube içinde zıplasa da, doğru şartlarda control_2 event’i çalışacaktır
User prompt
fade işlemlerinden sonra spawn olan tubede control yerine control_2 olsun ve control_2 aktifleşmesi için gereken coin 30 , 30 coine ulaşınca control_2 aktifleşiyor ve ekrandaki her şey donsun
User prompt
Aşağıdaki örnekte, kontrol objesinin update fonksiyonunda sadece 10 coin eşiğini kontrol eden ve ikinci (30 coin) eşiğine bağlı hiçbir koşul kullanmayan bir yapı gösteriyorum. Bu sayede, oyuncu kontrol alanına değdiğinde (control) eğer coinCounter 10 veya daha fazla ise ilgili event tetiklenecek; 30 coin eşiği artık dikkate alınmayacak. Aşağıdaki güncellenmiş kodu inceleyebilirsiniz: js Kopyala Düzenle // Global değişkenler (örn. kontrol aşamasını takip etmek için artık controlStage kullanmayacağız) var firstControlTriggered = false; // Bu bayrak, kontrol eventinin bir kez tetiklendiğini izler control.update = function () { if (player.intersects(control)) { // Eğer coin sayısı 10 veya daha fazlaysa (10 ve üzeri) ve henüz kontrol event'i tetiklenmediyse: if (!firstControlTriggered && coinCounter >= 10) { console.log("Control event triggered: coinCounter = " + coinCounter); // İlgili event işlemlerini yapalım: startNormalEnemy = false; game.controlActive = true; LK.setTimeout(function () { // Düşmanları temizle 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ı devre dışı bırak 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(); firstControlTriggered = true; // İsteğe bağlı: Eğer coinCounter sıfırlanmasını isterseniz burada sıfırlayabilirsiniz. // coinCounter = 0; // scoreText.setText(coinCounter.toString()); } } }; Açıklama Sadece 10 Coin Eşiği: Yukarıdaki kodda yalnızca coinCounter ≥ 10 kontrolü yer alıyor. Eğer oyuncu kontrol objesine dokunursa ve coinCounter 10 veya daha fazla ise; startNormalEnemy false olarak ayarlanıyor, game.controlActive true oluyor, Belirli aralıklarla düşmanlar temizleniyor, Oyuncu (player) 0.33 saniye sonra yok ediliyor ve enhancedFadeEffect() çağrılıyor. Böylece fade işlemleri tetikleniyor. firstControlTriggered Bayrağı: Bu bayrak, kontrol event'inin sadece bir kez tetiklenmesini sağlar. Bu sayede, coinCounter 10 veya daha fazla olduğunda event tetiklendikten sonra tekrar tetiklenmesi engellenir. 30 Coin Eşiği Kaldırıldı: Artık kontrol event'inde coinCounter 30 gibi bir eşiğe bakılmıyor. Yalnızca 10 coin eşiği esas alınıyor. Bu yapı, kontrol alanına ilk değdiğinizde ve coinCounter 10 veya daha fazla olduğunda istediğiniz fade ve respawn işlemlerini tetikleyip, ikinci bir eşik aramadan işlemi tamamlar. İsterseniz coinCounter sıfırlama işlemini ekleyip eklememeyi de tercihinize göre ayarlayabilirsiniz.
User prompt
Aşağıdaki örnekte, kontrol alanının aşamalarını takip etmek için global bir "controlStage" değişkeni kullandım. Bu sayede: İlk kontrol alanında (controlStage = 1): Oyuncunun coin sayısı 10 veya daha fazla olduğunda ilk etkinlik tetiklenecek (örneğin, sadece bir uyarı ya da efekt). Bu durumda controlStage 2'ye ayarlanacak, ancak coinCounter sıfırlanmayacak. Sonraki kontrol alanında (controlStage = 2): Oyuncunun coin sayısı 30 veya daha fazla olduğunda ikinci etkinlik (fade/respawn işlemleri) tetiklenecek. Aşağıdaki kod parçası, kontrol alanındaki update fonksiyonunun güncellenmiş halini göstermektedir: js Kopyala Düzenle // Global kontrol aşamasını takip etmek için: var controlStage = 1; control.update = function () { if (player.intersects(control)) { // İlk kontrol: Eğer controlStage 1'deyse ve coinCounter 10 veya daha fazla ise if (controlStage === 1 && coinCounter >= 10) { console.log("İlk kontrol etkinliği tetiklendi: coinCounter = " + coinCounter); // Buraya ilk etkinlik işlemlerini ekleyin (örneğin, basit bir efekt) // coinCounter sıfırlanmaz, skor korunur. controlStage = 2; // Artık sonraki kontrol aşamasına geçildi. } // İkinci kontrol: Eğer controlStage 2'deyse ve coinCounter 30 veya daha fazla ise else if (controlStage === 2 && coinCounter >= 30) { console.log("İkinci kontrol etkinliği tetiklendi: coinCounter = " + coinCounter); startNormalEnemy = false; game.controlActive = true; LK.setTimeout(function () { // Düşmanları temizle 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); // Sahnedeki tüm update fonksiyonlarını geçici olarak devre dışı bırak 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(); // İkinci etkinlikte de skor sıfırlanmasın; isterseniz burada coinCounter sıfırlama kodunu ekleyebilirsiniz. } } }; Açıklamalar Global "controlStage": Başlangıçta 1 olarak ayarlanır. İlk kontrol tetiklendiğinde 2'ye yükselir; bu sayede ikinci kontrol alanı farklı koşullarla tetiklenir. İlk etkinlik: Oyuncu kontrol objesine değdiğinde ve coinCounter en az 10 ise, ilk etkinlik tetiklenir. Bu aşamada coinCounter sıfırlanmaz (skor korunur) ve sadece controlStage değeri 2'ye ayarlanır. İkinci etkinlik: ControlStage 2'deyken, oyuncu coinCounter en az 30 olduğunda fade/respawn işlemleri başlatılır. Bu yapıyı kullanarak, kontrol alanının aktifleşme koşullarını istediğiniz gibi ayırabilirsiniz. Test ederken coin sayınızı ve kontrol alanına dokunmayı gözlemleyin; ilk aşamada 10 veya daha fazla coin olduğunda ilk etkinliğin, ikinci aşamada ise 30 veya daha fazla coin olduğunda ikinci etkinliğin tetiklenmesi gerekir. Eğer coinCounter'ın resetlenmesini ya da farklı efektler eklenmesini isterseniz, ilgili kısımları isteğinize göre uyarlayabilirsiniz.
User prompt
Kontrole dokunulduğunda skorun sıfırlanması, if bloğunda coinCounter'ı resetleyen kod satırlarından kaynaklanıyor. Eğer skorun resetlenmeden kalmasını istiyorsanız, kontrol event’inin ilk aşamasında (örneğin, coinCounter ≥ 10 olduğunda) coinCounter'ı sıfırlayan kısımları kaldırmanız ya da koşulunu değiştirmeniz gerekir. Örneğin, eğer ilk kontrol tetiklendiğinde sadece bir uyarı/efekt tetiklemek istiyor fakat skoru sıfırlamak istemiyorsanız, şu satırları kaldırın ya da yorum satırına alın: js Kopyala Düzenle coinCounter = 0; scoreText.setText(coinCounter.toString()); Bunun yerine, sadece gerekli event işlemlerini yapıp, skoru olduğu gibi bırakabilirsiniz. Örnek güncellenmiş control.update fonksiyonu şu şekilde olabilir: js Kopyala Düzenle control.update = function () { if (player.intersects(control)) { // İlk sefer: firstControlTriggered false ise ve coinCounter 10 veya daha fazla ise if (!firstControlTriggered && coinCounter >= 10) { console.log("İlk kontrol etkinliği tetiklendi: coinCounter = " + coinCounter); // Burada ilk etkinlik için gerekli işlemler yapılır, ancak coinCounter sıfırlanmaz. firstControlTriggered = true; } // Sonraki sefer: firstControlTriggered true ise ve coinCounter 30 veya daha fazla ise else if (firstControlTriggered && coinCounter >= 30) { console.log("İkinci kontrol etkinliği tetiklendi: coinCounter = " + coinCounter); startNormalEnemy = false; 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(); // Eğer isteniyorsa burada coinCounter sıfırlanabilir, ama sizin istediğiniz gibi bırakmak için bunu kaldırıyoruz. // coinCounter = 0; // scoreText.setText(coinCounter.toString()); } } }; Bu düzenleme ile; İlk kontrol tetiklendiğinde (coinCounter ≥ 10) skor sıfırlanmayacak, sadece firstControlTriggered bayrağı true yapılacak. Sonraki kontrol tetiklenmesinde (coinCounter ≥ 30) fade işlemleri başlayacak fakat skor resetlenmeyecektir. Böylece, oyuncu kontrol objesine dokunduğunda fade işlemi tetiklenir, ancak skorunuz resetlenmeden kalır. Eğer başka bir yerde coinCounter sıfırlama işlemi varsa, onu da kaldırmanız gerekebilir. Bu değişiklikleri uygulayıp test ederseniz, kontrol dokunması sonucu skor sıfırlanmadan fade işlemi gerçekleşecektir.
User prompt
Aşağıdaki örnekte, global bir bayrak (örneğin, firstControlTriggered) kullanarak; İlk kontrol aktivasyonu için: coinCounter 10 veya daha fazla olduğunda (ilk sefer için) event tetiklenecek, sonra coinCounter resetlenecek ve firstControlTriggered true olacak. Sonraki kontrol aktivasyonlarında: coinCounter 30 veya daha fazla olduğunda event tetiklenecek. Aşağıdaki kod parçası, control.update fonksiyonundaki ilgili kısmı günceller: js Kopyala Düzenle // Global bayrak ekleyin (kodun global değişkenler kısmında): var firstControlTriggered = false; Sonra, control.update fonksiyonunu şu şekilde düzenleyin: js Kopyala Düzenle control.update = function () { if (player.intersects(control)) { // İlk sefer: eğer firstControlTriggered false ise, coinCounter >= 10 ise event tetiklenecek. if (!firstControlTriggered && coinCounter >= 10) { console.log("İlk kontrol etkinliği tetiklendi: coinCounter = " + coinCounter); // Burada gerekli ilk event işlemleri yapılır (örneğin, coinCounter resetlenir) coinCounter = 0; scoreText.setText(coinCounter.toString()); firstControlTriggered = true; } // Sonraki seferler: firstControlTriggered true ise, coinCounter >= 30 olmalı. else if (firstControlTriggered && coinCounter >= 30) { console.log("İkinci kontrol etkinliği tetiklendi: coinCounter = " + coinCounter); startNormalEnemy = false; 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(); // Sonrasında coinCounter resetlenebilir, isteğe bağlı coinCounter = 0; scoreText.setText(coinCounter.toString()); } } }; Açıklamalar Global firstControlTriggered: Başlangıçta false olarak ayarlanır. İlk kontrol etkinliği tetiklendiğinde true olur. İlk Etkinlik: Eğer oyuncu kontrol objesine değerse ve coinCounter 10 veya daha fazla ise (ve firstControlTriggered false ise) ilk event tetiklenir. Bu durumda coinCounter sıfırlanır ve firstControlTriggered true yapılır. Sonraki Etkinlik: Eğer oyuncu tekrar kontrol objesine değerse ve coinCounter 30 veya daha fazla ise (ve firstControlTriggered true ise) ikinci event (fade/respawn vb.) tetiklenir. Event tetiklendiğinde coinCounter sıfırlanabilir. Bu şekilde, ilk kontrol için 10 coin, sonraki kontrol aktivasyonu için 30 coin şartı uygulanmış olur. Eğer coin sayısı 50 ise, ilk seferde 50 coin bile olsa ilk event tetiklenip coinCounter resetlenecek, sonrasında yeniden 30 coin toplanması gerekecektir. Bu yapıyı projenize ekleyerek test edebilirsiniz.
User prompt
Aşağıdaki örnekte, kontrol objesi (control) dokunulduğunda iki ayrı koşulu (threshold) bağımsız şekilde kontrol eden bir yapı sunuyorum. Yani; • Eğer coin sayısı 10 veya daha fazla ise (10, 50, 100 fark etmez) ilk etkinlik (örneğin; coin resetleme veya başka bir efekt) tetiklenecek. • Eğer coin sayısı 30 veya daha fazlaysa yine (50 coin de olsa) ikinci etkinlik (fade ve respawn işlemleri) tetiklenecek. Bunun için if–else yerine iki ayrı if bloğu kullanıyoruz. Burada coinCounter’ı resetlemeden önce her iki koşulu da bağımsız kontrol edebilirsiniz; eğer her iki event tetiklendikten sonra coin sayısını resetlemek istiyorsanız, iki etkinliği tetikledikten sonra global coinCounter’ı sıfırlayabilirsiniz. Aşağıda, control.update fonksiyonunda yapılması gereken düzenlemeyi görebilirsiniz: js Kopyala Düzenle control.update = function () { if (player.intersects(control)) { // Eğer coin sayısı 10 veya daha fazlaysa, ilk etkinliği tetikleyelim. if (coinCounter >= 10) { // İlk etkinlik işlemleri burada... // Örneğin: Bir uyarı veya efekt, isterseniz coinCounter'ı resetlemeyin. console.log("İlk etkinlik tetiklendi: coinCounter = " + coinCounter); // Eğer her iki eventten sonra coinCounter sıfırlansın isterseniz: // coinCounter = 0; // scoreText.setText(coinCounter.toString()); } // Eğer coin sayısı 30 veya daha fazlaysa, ikinci etkinliği tetikleyelim. if (coinCounter >= 30) { // İkinci etkinlik işlemleri: fade efektleri ve respawn işlemleri startNormalEnemy = false; game.controlActive = true; // 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ı geçici olarak devre dışı bırak 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); // Fade efektini başlat enhancedFadeEffect(); console.log("İkinci etkinlik tetiklendi: coinCounter = " + coinCounter); // İstenirse, her iki event sonrasında coinCounter sıfırlansın: // coinCounter = 0; // scoreText.setText(coinCounter.toString()); } } }; Açıklamalar İki ayrı if bloğu kullanarak; if (coinCounter >= 10) → İlk etkinliği tetikleyin. if (coinCounter >= 30) → İkinci etkinliği tetikleyin. Eğer coin sayısı 50 gibi yüksek bir değerdeyse, her iki if bloğu da çalışacaktır (yani hem ilk hem de ikinci etkinlik tetiklenecektir). CoinCounter’ı sıfırlamak isterseniz, hangi noktada sıfırlanmasını istediğinizi (örneğin, her iki event tetiklendiğinde veya ayrı ayrı) belirlemeniz gerekir. Yukarıdaki örnekte, yorum satırı (comment) olarak resetleme kodunu ekledim; bunu ihtiyacınıza göre aktif edebilirsiniz. Bu yapı, kontrol objesine değdiğinde coin sayısı için belirttiğiniz eşiklerden bağımsız olarak (10 ve 30) her iki etkinliğin de tetiklenmesini sağlayacaktır.
User prompt
move score counter 2 pixel right
User prompt
move score counter 4 pixel left
User prompt
move score counter 3 pixel left
User prompt
move score counter 5 pixel left
User prompt
karakter controle girdiğinde enemy ve flyin enemy duruyor ancak coin durmuyor coin de dursun
User prompt
Bu sorunu çözmek için, oyuncunun (Player) can bilgilerini (kalp sayısını) global bir değişkende saklayıp, yeni oyuncu oluşturulduğunda bu değeri kullanabilirsiniz. Yani, oyuncu hasar aldığında global bir "remainingHearts" değişkeninde güncelleme yapıp, respawn sırasında yeni oyuncu örneğini oluştururken bu değeri aktarabilirsiniz. Aşağıda iki temel değişiklik öneriyorum: Global Kalp Değişkeni: Kodun en başında veya global değişkenler bölümünde, oyuncunun kalan kalp sayısını saklamak için bir değişken tanımlayın. Örneğin: js Kopyala Düzenle var remainingHearts = 3; Ve Player loseHeart() metodunda kalp sayısı azaldığında, remainingHearts değerini de güncelleyin. Player Constructor Güncellemesi: Yeni bir Player oluşturulduğunda (respawn sırasında) kalp sayısını varsayılan 3 yerine, global remainingHearts değişkenindeki değeri kullanın. Örneğin: js Kopyala Düzenle self.hearts = (typeof remainingHearts !== 'undefined') ? remainingHearts : 3; Böylece, önceki hayatında kaybedilen kalpler korunur. Örnek düzenlemeler: Global değişken tanımı: js Kopyala Düzenle var remainingHearts = 3; // Oyuncunun başlangıç canı. Player Sınıfı (constructor ve loseHeart güncellemesi): js Kopyala Düzenle 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; // Global remainingHearts kullanarak can bilgisini ayarla: self.hearts = (typeof remainingHearts !== 'undefined') ? remainingHearts : 3; self.update = function () { // (Update kodu aynı kalıyor) }; self.jump = function () { if (!self.isJumping) { self.isJumping = true; self.velocityY = -self.jumpHeight; } }; self.loseHeart = function () { self.hearts--; remainingHearts = self.hearts; // Global can bilgisini de güncelle 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) { // Oyuncu ölmüşse 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; } }; }); Respawn sırasında yeni oyuncu oluşturma (enhancedFadeEffect içinde): Örneğin, fade sonrası yeni oyuncu spawn edilirken: js Kopyala Düzenle LK.setTimeout(function () { // Yeni oyuncu oluşturulurken global remainingHearts kullanılacak, // böylece daha önce kaybedilen can bilgisi korunmuş olacak. 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); LK.setTimeout(function () { startNormalEnemy = true; }, 10500); }, 500); Bu düzenlemelerle, oyuncu ölmüş olsa bile (örneğin, 1 veya 2 kalbi kaybetmiş olsa bile) yeni oyuncu spawn edildiğinde can bilgisi (remainingHearts) korunacaktır. Böylece, fade sonrası oyuncu önceki hayatında kaybettiği canları tekrar 3'e sıfırlamadan devam edecektir. Uygulamayı bu şekilde test ederseniz, respawn sonrası oyuncu önceki can kaybını hatırlayacak ve yeni spawn edilen oyuncu global remainingHearts değeriyle oluşturulacaktır.
/**** * 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 (destek: hem eski (homing false) hem de yeni (homing true)) 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; self.homing = false; // false: eski davranış, true: oyuncuya yönelik 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 = typeof remainingHearts !== 'undefined' ? remainingHearts : 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.invulnerable = false; // Invulnerability flag (initially false) self.hit = function () { if (!self.invulnerable) { self.loseHeart(); self.invulnerable = true; // Make player vulnerable again after 500ms LK.setTimeout(function () { self.invulnerable = false; }, 500); } }; 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(); } remainingHearts = self.hearts; // Update global remainingHearts if (hearts.length === 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; // Tube2 her zaman ön planda 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 & Flags ****/ var startNormalEnemy = true; // Normal enemy spawn, başta true; 12 sn sonra true olacak. var coinCounter = 0; var flyinEnemies = []; var playerDeaths = 0; var hearts = []; var remainingHearts = 3; // Global variable to track remaining hearts game.controlActive = false; var coins = []; var enemies = []; var enemySpawnInterval = Math.floor(Math.random() * 100) + 30; var enemySpawnCounter = 0; var stopSpawn = false; game.weaponEnabled = true; /**** * (A) Eski FlyinEnemy Spawn (sağdan sola, homing false) ****/ function spawnFlyinEnemy() { if (stopSpawn) { return; } var delay = Math.random() * 2000 + 2000; LK.setTimeout(function () { if (stopSpawn) { return; } var fe = new FlyinEnemy(); // Eski davranış: homing false fe.x = 2048; fe.y = 449; fe.zIndex = 10; game.addChild(fe); flyinEnemies.push(fe); spawnFlyinEnemy(); }, delay); } spawnFlyinEnemy(); /**** * (B) Wave şeklinde, homing davranışlı FlyinEnemy Spawn * (Wave enemy'ler Tube2’nin önünde görünmesi için z-index 2100) ****/ 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; 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; enemy.zIndex = 2100; // Tube2 z-index 2000 olduğundan, wave enemy'ler onun önünde görünsün. if (enemy.x < 1024) { enemy.scaleX = -1; } game.addChild(enemy); flyinEnemies.push(enemy); }, index * 800); // 0.8 sn arayla if (index === spawnPoints.length - 1) { LK.setTimeout(function () { spawnFlyinEnemy(); }, 10000); // 10 seconds after wave started } }); } /**** * Normal Enemy Spawn (sağdan sola, homing false) * Sadece startNormalEnemy true olduğunda update içinde spawn ediliyor. ****/ 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 - Player --- 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.hit(); // Use hit() method to trigger damage and invulnerability 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(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; 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 --- 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.hit(); // Use hit() method to trigger damage and invulnerability 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; 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; particleEffect.y = flyinEnemies[n].y + 30; game.addChild(particleEffect); LK.setTimeout(function () { particleEffect.destroy(); }, 150); flyinEnemies[n].destroy(); child.destroy(); flyinEnemies.splice(n, 1); break; } } if (flyinEnemies[n] && !flyinEnemies[n].homing && flyinEnemies[n].x < -50) { flyinEnemies[n].destroy(); flyinEnemies.splice(n, 1); } } // --- 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); /**** 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)) { for (var m = 0; m < coins.length; m++) { coins[m].velocity = 0; // Stop coin movement } startNormalEnemy = false; 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 - 65; // Move 3 pixels left counterBackground.y = 45; // Move 5 pixels up 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); } /**** enhancedFadeEffect: Fade-out, clear scene, spawn background2, Tube2, then new player ****/ 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.hearts = remainingHearts; // Use global remainingHearts for 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); LK.setTimeout(function () { startNormalEnemy = true; }, 10500); }, 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); } 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; stopSpawn = false; // Enemy spawn işlemlerine yeniden izin ver. game.isFading = false; game.fadeCompleted = true; }, 8000); } }, fadeInStepTime); } }, stepTime); } /**** 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 (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 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(); } } 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; particleEffect.y = enemies[j].y; game.addChild(particleEffect); LK.setTimeout(function () { particleEffect.destroy(); }, 150); enemies[j].destroy(); child.destroy(); enemies.splice(j, 1); break; } } } 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; 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; particleEffect.y = flyinEnemies[n].y + 30; game.addChild(particleEffect); LK.setTimeout(function () { particleEffect.destroy(); }, 150); flyinEnemies[n].destroy(); child.destroy(); flyinEnemies.splice(n, 1); break; } } if (flyinEnemies[n] && !flyinEnemies[n].homing && flyinEnemies[n].x < -50) { flyinEnemies[n].destroy(); flyinEnemies.splice(n, 1); } } 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
@@ -636,16 +636,16 @@
anchorX: 0.5,
anchorY: 0.5
});
LK.gui.top.addChild(counterBackground);
-counterBackground.x = LK.gui.top.width / 2 - 62; // Move 3 pixels right
+counterBackground.x = LK.gui.top.width / 2 - 65; // Move 3 pixels left
counterBackground.y = 45; // Move 5 pixels up
var scoreText = new Text2('0', {
size: 80,
fill: 0xFFFFFF
});
LK.gui.top.addChild(scoreText);
-scoreText.x = LK.gui.top.width / 2 - 88;
+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,
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