User prompt
game.addChild(Object.assign(LK.getAsset('_', { anchorX: 1.0, anchorY: 0.0, x: screenRight - 5, y: 5 })), { zIndex: 15000 });
User prompt
i cant see it move it to left and down
User prompt
_ assetini ekranın sağ üstüne koy
User prompt
Sorununuz, invincibility (ölüm devre dışı bırakma) kontrolü için kullanılan kod bloğunun, oyunda (play modunda) menü açıkken çalışacak şekilde yerleştirilmiş olması gibi görünüyor. Yani, oyun başladığında (menuOpen false olduğunda) game.down içindeki invincibility kontrolü hiç tetiklenmiyor. Öneriler: CounterText Event Handler’ı: Zaten counterText için bağımsız bir "down" event listener tanımlamışsınız. Bu event listener, counterText’e dokunulduğunda counterTextClicks değerini artırıp gerekli toggling işlemini yapmalı. Bu kodun oyun modunda da aktif olduğundan emin olun. Eğer counterText, LK.gui.topLeft gibi ayrı bir katmanda yer alıyorsa, bu katmanın interaktif olduğundan ve diğer dokunma olayları tarafından engellenmediğinden emin olun. game.down İçindeki Kontrolü Kaldırın: global game.down event handler’ı içerisinde invincibility kontrolünü yapmanız, menü modunda çalıştığından, play’e basıldığında (menuOpen false olduğunda) bu kontrol devre dışı kalıyor. Dolayısıyla invincibility özelliğini sadece counterText’in kendi event listener’ına bırakmak daha sağlıklı olacaktır. GUI Katmanı ve Z-Index: CounterText’in z-index’inin, oyunun diğer interaktif öğeleri tarafından kapatılmadığından emin olun. Zaten 1000 değeri veriyorsunuz ancak oyun içindeki dokunma olaylarını (örneğin game.down) geçersiz kılmıyorsa counterText’in kendi event’inin çalıştığını doğrulayın. Özet: Oyun başladığında (menuOpen false) game.down içindeki invincibility kontrolü tetiklenmediği için counterText’e dokunduğunuzda global game.down kodu çalışmıyor. Bunun yerine, counterText’in kendi "down" event listener’ı üzerinden (menüde veya oyunda her zaman aktif olacak şekilde) counterTextClicks kontrolü yapıp invincibility toggling yapmalısınız. Eğer counterText’in event listener’ı aktif fakat yine de çalışmıyorsa, counterText’in bulunduğu GUI katmanının dokunma olaylarına açık olduğundan ve diğer interaktif öğeler tarafından engellenmediğinden emin olun. Bu düzenlemeler yapıldığında, menüden play’e basıldıktan sonra da counterText’e 8 kez dokunarak invincibility’nin aktif edilip, 10 dokunuşla devreye alınması sağlanabilir.
User prompt
Muhtemelen sorun, oyunun menüden çıkıp "play"e basıldıktan sonra gameStarted true oluyor ve karakterin update döngüsünde henüz invincibility (ölüm devre dışı) aktif edilmeden ölüm koşulları tetikleniyor. Bu durum şunlara bağlı olabilir: Zamanlama: Oyun başladıktan sonra karakter hızla yere doğru hareket ediyor ve collision koşulları (örneğin, y > groundY – 100) gerçekleşiyor. Bu da counterText’e 8 kez tıklama fırsatını engelliyor. Etkinlik Katmanı (Interactive Layer): CounterText, menü modundayken interaktif olarak ayarlanmış olsa da, oyun başladığında arka plandaki diğer öğeler veya game.touchDisabled gibi ayarlar etkileşimi kısıtlayabilir. Çözüm Önerileri: Menüde İnteraktiflik: Invincibility özelliğini oyun başlamadan, yani menüdeyken aktif hale getirmeyi deneyebilirsiniz. Böylece oyun başladıktan sonra karakterin update fonksiyonuna geçmeden deathDisabled bayrağı istenen değere ulaşır. Oyun Başlatma Zamanlaması: Oyun başlamadan (gameStarted true olmadan) kısa bir süre bekleyerek counterText’in tıklanmasına imkan tanıyabilir ya da başlangıçta karakterin hareketini yavaşlatabilirsiniz. Z-Index ve Dokunma Olayları: CounterText’in zIndex değerinin diğer oyun objeleri tarafından kapatılmadığından emin olun. Mevcut kodda counterText’e zIndex 1000 vermişsiniz; bu değerin oyundaki diğer interaktif objelerden yüksek olduğundan emin olun. Özetle, oyun başladıktan sonra karakterin çok hızlı ölüm koşullarına girmesi, henüz 8 tıklamayı tamamlamadan gameOver tetiklenmesine neden oluyor. Bu nedenle, invincibility modunu (deathDisabled) oyunun başlamasından önce aktif etmek veya oyunun başlangıcını biraz geciktirmek sorunu çözebilir.
User prompt
Muhtemelen sorunun kaynağı, karakterin update fonksiyonunda deathDisabled bayrağının beklediğiniz gibi kontrol edilmemesi veya counterText’e tıklama olayının doğru çalışmaması olabilir. Aşağıdaki noktalara dikkat edebilirsiniz: Değişken Tanımlama Sırası: Character sınıfı tanımlandıktan sonra global değişkenler (ör. deathDisabled) atanıyor. JavaScript’te var ile tanımlanan değişkenler hoisted olsa da, update fonksiyonu çalışmaya başladığında deathDisabled’nin kesin değeri (false ya da true) atanmış olmalıdır. Yine de, olası karışıklığı önlemek için deathDisabled gibi global bayrakları, Character sınıf tanımından önce tanımlamayı deneyebilirsiniz. Tıklama Olayı ve İnteraktivite: counterText’in interaktif olduğundan ve dokunmatik/klik olaylarının diğer öğeler tarafından engellenmediğinden emin olun. Örneğin, counterText’in doğru container’da yer alıp, dokunma olayları diğer dokunmatik kontrollerle çakışmıyorsa (örneğin, menü veya GUI’de başka bir interaktif öğe) kontrol edin. Tıklama Zamanlaması: Eğer karakter zaten ölüm eşiğine yaklaşmışsa (örneğin, groundY – 100’ün altına inmişse) tıklamalarınız togglingden önce update fonksiyonu tarafından gameOver tetikleniyor olabilir. Bu durumda, deathDisabled bayrağını aktif hale getirmek için counterText’e yeterince erken tıkladığınızdan emin olun. Özetle, kodunuzda mantıksal olarak deathDisabled bayrağını kullanmak doğru görünüyor; ancak yukarıdaki noktalarda (değişken tanımlama sırası, interaktivite ve tıklama zamanlaması) hata veya beklenmeyen etkileşimler söz konusu olabilir. Bu alanları kontrol ederek sorunu çözebilirsiniz.
User prompt
Aşağıdaki örnekte, iki ana değişiklik yaptık: Global değişkenler ekledik: deathDisabled adlı bir bayrak (başlangıçta false) karakterin ölüm mekanizmasını kontrol eder. counterTextClicks adlı sayaç ile, sağ üstteki count (counterText) üzerine yapılan tıklamaları takip ediyoruz. CounterText’e tıklama olayı ekledik: Sağ üstteki counterText’e her tıklamada sayaç artıyor. Eğer karakter henüz ölüm modundayken (deathDisabled false iken) 8 tıklama olursa deathDisabled true olacak (yani karakter ölmeyecek). Death modundayken (deathDisabled true iken) 10 tıklama alındığında, tekrar deathDisabled false yapılarak ölüm mekanizması geri açılacak. Karakter update fonksiyonunda ölüm kontrollerini güncelledik: Eğer deathDisabled true ise, yer kontrolü ve boru/ağaç çarpışması nedeniyle oyunu sonlandıran kod blokları çalışmayacak. Aşağıda ilgili kod kısımlarını görebilirsiniz: (1) Global Değişkenler & Sayaç Tıklama Olayı js Kopyala Düzenle /**** * Global Variables & Helper Functions ****/ // Mevcut global değişkenlerin yanına ekleyin: var deathDisabled = false; var counterTextClicks = 0; // Ekranda sayacımız var counterText = new Text2('0', { size: 124.2, fill: 0xFFFFFF }); counterText.anchor.set(0, 0); counterText.x = 1315; counterText.y = 15; LK.gui.topLeft.addChild(counterText); // Sağ üstteki counterText’e tıklama olayı ekleyelim counterText.interactive = true; counterText.on('down', function () { counterTextClicks++; if (!deathDisabled && counterTextClicks >= 8) { deathDisabled = true; console.log("Karakter için ölüm devre dışı bırakıldı (invincibility ON)."); counterTextClicks = 0; // sayaç sıfırlansın } else if (deathDisabled && counterTextClicks >= 10) { deathDisabled = false; console.log("Karakter için ölüm tekrar aktif (invincibility OFF)."); counterTextClicks = 0; } }); (2) Karakter’in update Fonksiyonu İçinde Ölüm Kontrollerini Güncelleyin Karakterin update fonksiyonunda yer ve çarpışma kontrollerini, deathDisabled bayrağına göre çalıştırın. Örneğin: js Kopyala Düzenle // Character: Dokunulduğunda zıplar. var Character = Container.expand(function () { var self = Container.call(this); self.attachAsset('character', { anchorX: 0.5, anchorY: 0.5 }); self.zIndex = 4; self.velocityY = 0; self.gravity = 0.3; self.jumpStrength = -12; self.width = 350; self.height = 300; self.update = function () { if (gameStarted && !gameOver) { self.velocityY += self.gravity; self.y += self.velocityY; // Yere çok yaklaşma kontrolü (ölüm) if (!deathDisabled && self.y > groundY - 100) { self.y = groundY - 100; self.velocityY = 0; gameOver = true; endGame(); } var characterLeft = self.x - self.width / 2; var characterRight = self.x + self.width / 2; var characterTop = self.y - self.height / 2; var characterBottom = self.y + self.height / 2; // Ekran dışına çıkma kontrolü if (!deathDisabled && (characterLeft + self.width / 2 < 0 || characterRight - self.width / 2 > screenRight || characterTop + self.height / 2 < 0 || characterBottom - self.height / 2 > groundY)) { gameOver = true; endGame(); } // Çarpışma kontrolü: Tube ve Tree game.children.forEach(function (child) { if (!deathDisabled) { if (child instanceof Tube) { var tubeLeft = child.x - child.bottomTube.width / 2; var tubeRight = child.x + child.bottomTube.width / 2; var safeGapLowerEdge = child.y - child.bottomTube.height; var safeGapUpperEdge = -gapOffset + child.topTube.height; if (self.x + self.width / 2 > tubeLeft && self.x - self.width / 2 < tubeRight) { if (self.y < safeGapUpperEdge || self.y > safeGapLowerEdge) { gameOver = true; endGame(); } } } else if (child instanceof Tree) { var treeLeft = child.x - child.bottomTree.width / 2; var treeRight = child.x + child.bottomTree.width / 2; var safeGapLowerEdge = child.y - child.bottomTree.height; var safeGapUpperEdge = -gapOffset + child.topTree.height; if (self.x + self.width / 2 > treeLeft && self.x - self.width / 2 < treeRight) { if (self.y < safeGapUpperEdge || self.y > safeGapLowerEdge) { gameOver = true; endGame(); } } } } }); } }; self.jump = function () { if (!gameOver) { self.velocityY = self.jumpStrength; } }; return self; }); Bu değişikliklerle, oyun başladığında sağ üstteki counterText üzerine 8 kez tıklanırsa karakterin ölüm mekanizması devre dışı kalacak (invincibility), 10 kez tıklanırsa tekrar normal ölüm davranışı aktif hale gelecektir. Gerektiğinde bu kodu oyununuza entegre edebilirsiniz.
User prompt
Ana menüyü görünür bırakıp sadece tıklanmasını devre dışı bırakmak için, menüyü gizlemek yerine onun interaktivitesini kapatabilirsiniz. Bunun için modal açılır açılmaz, örneğin showCredits, showVolume ve showRecords fonksiyonlarında aşağıdaki iki adımı uygulayın: Interaktiviteyi Devre Dışı Bırakın: Modal açıldığında, menuOpen gibi bir bayrak ile ana menünün dokunma olaylarını işlememesini sağlayın. Örneğin, showCredits fonksiyonunun başında: js Kopyala Düzenle menuOpen = false; // Ana menü interaktif olmayacak, ancak görünür kalacak. Ana Menü Hover Efektini Engelleyin: game.move olayında, ana menü etkileşimlerinin devre dışı bırakılmasını sağlamak için bir kontrol ekleyin: js Kopyala Düzenle game.move = function (x, y, obj) { if (!menuOpen) return; // Modal açıkken hover efekti çalışmasın. var localX = x - menuContainer.x; var localY = y - menuContainer.y; playButton.visible = checkEllipseHover(playButton, localX, localY); volumeButton.visible = checkEllipseHover(volumeButton, localX, localY); creditsButton.visible = checkEllipseHover(creditsButton, localX, localY); recordsButton.visible = checkEllipseHover(recordsButton, localX, localY); }; Örnek: showCredits Fonksiyonundaki Düzenleme Eski kodda menüyü tamamen gizleyen satırı kaldırıp sadece menuOpen bayrağını false yapın: js Kopyala Düzenle function showCredits() { // Menü interaktivitesini kapatıyoruz ama görünürlüğünü değiştirmiyoruz. menuOpen = false; var creditsContainer = new Container(); creditsContainer.zIndex = 300; var modalWidth = 1250, modalHeight = 2000; var bg = LK.getAsset('second_menu', { anchorX: 0.5, anchorY: 0.5, width: modalWidth, height: modalHeight, color: 0x000000 }); bg.x = centerX(); bg.y = centerY(); creditsContainer.addChild(bg); var creditsText = new Text2("Game by\nMustafa Talha ŞEN", { fontFamily: "Arial", fontSize: 5000 * 1.03, fill: 0xffffff, align: "center" }); creditsText.anchorX = 0.5; creditsText.anchorY = 0.5; creditsText.x = centerX() - 359; creditsText.y = centerY() - 800 + 40; creditsText.scale.set(3, 3); creditsContainer.addChild(creditsText); // Modal’ı oyuna ekle. game.addChild(creditsContainer); // Close butonunu ekleyin. var closeButton = createCloseButton(); closeButton.x = bg.x + modalWidth / 2 - closeButton.width / 2 - 160; closeButton.y = bg.y - modalHeight / 2 + closeButton.height / 2 + 175; closeButton.on('down', function () { game.removeChild(creditsContainer); game.removeChild(closeButton); menuOpen = true; // Menü interaktivitesi tekrar açılır. }); game.addChild(closeButton); } Bu düzenleme ile ana menü arka planda görünmeye devam eder ancak menuOpen bayrağı sayesinde ana menü dokunma ve hover olayları işlenmez. Böylece kullanıcı sadece modal içerisindeki close butonla etkileşime girebilir.
User prompt
Modal Açıldığında Menü Etkileşimini Devre Dışı Bırakın: Her modal fonksiyonunun (örneğin, showCredits, showVolume, showRecords) en başında, global menuOpen değişkenini false yapın ve menuContainer.visible’i false ayarlayın. Bu sayede, ana menü butonları artık dokunma olaylarını işlemeyecektir. Modal Kapatıldığında Menü Etkileşimini Geri Açın: Modalın close butonuna tıklandığında, modalı kaldırdıktan sonra menuOpen’u tekrar true yapıp menuContainer.visible’i true ayarlayarak menüyü eski durumuna getirin. Aşağıda showCredits fonksiyonunun nasıl düzenleneceğine dair örnek verilmiştir (aynı mantığı showVolume ve showRecords için de uygulayabilirsiniz): js Kopyala Düzenle function showCredits() { // Menü modaldan dolayı kapalı olsun. menuOpen = false; menuContainer.visible = false; var creditsContainer = new Container(); creditsContainer.zIndex = 300; var modalWidth = 1250, modalHeight = 2000; var bg = LK.getAsset('second_menu', { anchorX: 0.5, anchorY: 0.5, width: modalWidth, height: modalHeight, color: 0x000000 }); bg.x = centerX(); bg.y = centerY(); creditsContainer.addChild(bg); var creditsText = new Text2("Game by\nMustafa Talha ŞEN", { fontFamily: "Arial", fontSize: 5000 * 1.03, fill: 0xffffff, align: "center" }); creditsText.anchorX = 0.5; creditsText.anchorY = 0.5; creditsText.x = centerX() - 359; creditsText.y = centerY() - 800 + 40; creditsText.scale.set(3, 3); creditsContainer.addChild(creditsText); // Modal’ı oyuna ekle. game.addChild(creditsContainer); // Kendi başına çalışan close butonu var closeButton = createCloseButton(); closeButton.x = bg.x + modalWidth / 2 - closeButton.width / 2 - 160; closeButton.y = bg.y - modalHeight / 2 + closeButton.height / 2 + 175; // Close butonuna tıklanınca modalı kapat ve menüyü geri aç. closeButton.on('down', function () { game.removeChild(creditsContainer); game.removeChild(closeButton); menuOpen = true; menuContainer.visible = true; }); game.addChild(closeButton); } Özet: Modal açılır açılmaz menüyü devre dışı bırakmak için menuOpen = false ve menuContainer.visible = false ayarlanır. Modal kapatıldığında, close butonunun olayında menuOpen = true ve menuContainer.visible = true ayarlanır. Bu değişikliklerle, modal ekranda aktifken (volume, credits veya records açıldığında) sadece close butonu çalışır; diğer ana menü butonları dokunma olaylarını işleme almaz.
User prompt
make record credits volume play texts %3 bigger
User prompt
count texti 5 pixel aşağı 5 pixel sola taşı
User prompt
move close button in credits screen 20 pixel up and 45 pixel right
User prompt
move close button right by 6 pixel right
User prompt
move close button 20 pixel up and 40 pixel right for volume settings menu
User prompt
move justx and close button 30 pixel up 30 pixel right for volume setting screen
User prompt
move volume settings text 30 pixel down
User prompt
move volume settings text 15 pixel down
User prompt
move just x 4 pixel left 4 pixel up
User prompt
move just x 10 pixel right 20 pixel down
User prompt
x text yerine justx adında bir asset yaptım yer değiştir ikisini
User prompt
Aşağıdaki örnek, orijinal buton boyutlarını (400×800) koruyup, yalnızca “X” metninin font boyutunu (örneğin 10 kat) büyütür. Kodunuzu kaydedip projeyi/oyunu tamamen yenilediğinizden (tarayıcıda F5 vb.) emin olun. Ayrıca başka bir yerde closeButtonContainer veya closeLabel üzerinde scale/rotation gibi işlemler varsa, bunlar metnin görünümünü etkileyebilir. function createCloseButton() { // 1) Kapsayıcı Container var closeButtonContainer = new Container(); closeButtonContainer.zIndex = 9999; // 2) Buton görseli (sarı buton), orijinal boyutunda kalsın var closeShape = LK.getAsset('button_close', { anchorX: 0.5, anchorY: 0.5, width: 400, // Orijinal değeriniz height: 800 // Orijinal değeriniz }); closeButtonContainer.addChild(closeShape); // 3) “X” metnini büyüt (örneğin 10 kat) // Eğer önceki fontSize 75 ise şimdi 750 yapıyoruz var closeLabel = new Text2("X", { fontFamily: "Arial", fontSize: 750, // 10 kat daha büyük (75 → 750) fill: 0xffffff, align: "center" }); // Metni butonun tam ortasına getirmek istiyorsanız anchor (0.5,0.5) + x=0, y=0 // Ancak sizde -12, -14 offset varsa aynı şekilde bırakabilirsiniz: closeLabel.anchorX = 0.5; closeLabel.anchorY = 0.5; closeLabel.x = -12; // İstiyorsanız 0 yapın closeLabel.y = -14; // İstiyorsanız 0 yapın closeButtonContainer.addChild(closeLabel); return closeButtonContainer; } Neden Metin Hâlâ Büyümemiş Görünebilir? Yanlış Fonksiyon Çağrısı Kodunuzda createCloseButton() yerine createCommonCloseElements() çağrılıyorsa, bu değişiklik yansımayacaktır. Gerçekten nerede/hangi fonksiyonun kullanıldığını kontrol edin. Başka Yerde Ölçeklendirme Kodunuzun başka bir bölümünde closeButtonContainer.scale.set(...) veya closeLabel.scale.set(...) gibi bir satır varsa, büyüttüğünüz font tekrar küçültülüyor olabilir. Önceki Boyut Zaten Çok Büyükse Önceden “X” zaten büyükse, 10 kat büyütme fark edilmeyebilir veya metin butonun dışında kalıyor olabilir. closeLabel.x / closeLabel.y konumunu değiştirip etrafını kontrol edin. Önbellek / Eski Kod Sorunu Tarayıcıda F5 (veya Ctrl+F5) ile tam yenileme yapmadıysanız, eski kod kalmış olabilir. Yukarıdaki kodda, butonun boyutu hiç değişmeden, sadece “X” metni büyütülmüştür. Bu sayede metin normalde çok daha büyük görünmelidir. Hâlâ aynıysa, yukarıdaki maddeleri tekrar gözden geçirin.
User prompt
Aşağıdaki örnekte buton boyutunu değiştirmeden sadece “X” metninin font boyutunu (örneğin 10 kat) büyütüyoruz. Kodun çalıştığından emin olmak için lütfen projenizi kaydedip tamamen yenilediğinizden (tarayıcıda F5 vb.) veya derlediğinizden emin olun. js Kopyala Düzenle function createCloseButton() { var closeButtonContainer = new Container(); closeButtonContainer.zIndex = 9999; // Buton görseli (sarı buton) ORİJİNAL boyutunda kalsın // (Burada örnek olarak 400x800; sizde farklı olabilir) var closeShape = LK.getAsset('button_close', { anchorX: 0.5, anchorY: 0.5, width: 400, // Orijinal değeriniz neyse onu bırakın height: 800 // Orijinal değeriniz neyse onu bırakın }); closeButtonContainer.addChild(closeShape); // “X” metnini 10 kat büyütüyoruz (örnek: 75 -> 750, 110 -> 1100 vb.) var closeLabel = new Text2("X", { fontFamily: "Arial", fontSize: 1100, // 10 kat daha büyük fill: 0xffffff, align: "center" }); // Metni tam ortalamak için anchor ayarları 0.5 closeLabel.anchorX = 0.5; closeLabel.anchorY = 0.5; // X ve Y konumlarını (0,0) bırakın ki butonun tam ortasında olsun closeLabel.x = 0; closeLabel.y = 0; closeButtonContainer.addChild(closeLabel); return closeButtonContainer; } Önemli Kontroller Gerçekten bu fonksiyon kullanılıyor mu? showCredits(), showVolume() veya showRecords() içinde createCloseButton() mi çağrılıyor, yoksa createCommonCloseElements() mi? Yanlış fonksiyon çağrılıyorsa değişiklikler görünmez. Başka yerde ölçek (scale) veya konum ayarı var mı? Buton veya “X” metni ekledikten sonra başka bir yerde closeButtonContainer.scale.set(...) ya da closeLabel.scale.set(...) gibi bir kod varsa, boyutu değiştirebilir. Projeyi tamamen yenilediğinizden emin olun. Tarayıcı önbelleği veya eski kodun kalması nedeniyle değişiklikler ekrana yansımayabilir. Kodunuzu kaydedip oyunu/uygulamayı yeniden başlatın. Bu şekilde butonun boyutu değişmeden, yalnızca “X” metni 10 kat daha büyük hale gelecektir. Eğer hâlâ büyümüş görünmüyorsa muhtemelen 2. veya 3. maddede bahsi geçen durumlar devrededir.
User prompt
Aşağıdaki örnekte, “X” metninin boyutunu mevcut hâlinden 10 kat daha büyük yapıyoruz (örneğin fontSize: 110 yerine 1100). Ayrıca buton görselinin (sarı şekil) boyutunu da orantılı büyüttük ki “X” yazısı butonu tamamen taşmasın. İhtiyaç duyarsanız değerleri değiştirerek kendinize göre ayarlayabilirsiniz: js Kopyala Düzenle function createCloseButton() { var closeButtonContainer = new Container(); closeButtonContainer.zIndex = 9999; // Buton görselini daha büyük yapıyoruz var closeShape = LK.getAsset('button_close', { anchorX: 0.5, anchorY: 0.5, width: 400, // Eski 128 yerine daha büyük height: 400 // Eski 192 yerine daha büyük }); closeButtonContainer.addChild(closeShape); // “X” metnini 10 kat büyütüyoruz (örneğin 110 -> 1100) var closeLabel = new Text2("X", { fontFamily: "Arial", fontSize: 1100, // 10 kat büyümüş fill: 0xffffff, align: "center" }); // Ortalamak için anchor’ı ortalıyoruz ve x=0, y=0 closeLabel.anchorX = 0.5; closeLabel.anchorY = 0.5; closeLabel.x = 0; closeLabel.y = 0; closeButtonContainer.addChild(closeLabel); return closeButtonContainer; } closeShape boyutlarını artırdık (ör. 400x400) ki 1100 piksel font boyutundaki “X” çok fazla taşmasın. Eğer “X” hâlâ çok büyük veya çok küçük gelirse, fontSize ve closeShape boyutlarını tekrar düzenleyebilirsiniz. closeLabel.x ve closeLabel.y değerlerini (0,0) bırakırsanız metin butonun tam ortasında kalır. Bu kodu kullanarak, “X” metninin boyutunu gerçekten 10 kat büyütmüş olacaksınız.
User prompt
x text i 100 kat büyült
User prompt
close button olduğu lokasyonda kalsın ancak x texti 4 pixel yukarı ve 2 pixel sola gitsin
/**** * Classes ****/ // Character: Dokunulduğunda zıplar. var Character = Container.expand(function () { var self = Container.call(this); self.attachAsset('character', { anchorX: 0.5, anchorY: 0.5 }); self.zIndex = 4; self.velocityY = 0; self.gravity = 0.3; self.jumpStrength = -12; self.width = 350; self.height = 300; self.update = function () { if (gameStarted && !gameOver) { self.velocityY += self.gravity; self.y += self.velocityY; if (!deathDisabled && self.y > groundY - 100) { self.y = groundY - 100; self.velocityY = 0; gameOver = true; endGame(); } var characterLeft = self.x - self.width / 2; var characterRight = self.x + self.width / 2; var characterTop = self.y - self.height / 2; var characterBottom = self.y + self.height / 2; // Ekran dışına çıkma kontrolü if (!deathDisabled && (characterLeft + self.width / 2 < 0 || characterRight - self.width / 2 > screenRight || characterTop + self.height / 2 < 0 || characterBottom - self.height / 2 > groundY)) { gameOver = true; endGame(); } // Çarpışma kontrolü: Tube ve Tree game.children.forEach(function (child) { if (!deathDisabled) { if (child instanceof Tube) { var tubeLeft = child.x - child.bottomTube.width / 2; var tubeRight = child.x + child.bottomTube.width / 2; var safeGapLowerEdge = child.y - child.bottomTube.height; var safeGapUpperEdge = -gapOffset + child.topTube.height; if (self.x + self.width / 2 > tubeLeft && self.x - self.width / 2 < tubeRight) { if (self.y < safeGapUpperEdge || self.y > safeGapLowerEdge) { gameOver = true; endGame(); } } } else if (child instanceof Tree) { var treeLeft = child.x - child.bottomTree.width / 2; var treeRight = child.x + child.bottomTree.width / 2; var safeGapLowerEdge = child.y - child.bottomTree.height; var safeGapUpperEdge = -gapOffset + child.topTree.height; if (self.x + self.width / 2 > treeLeft && self.x - self.width / 2 < treeRight) { if (self.y < safeGapUpperEdge || self.y > safeGapLowerEdge) { gameOver = true; endGame(); } } } } }); } }; self.jump = function () { if (!gameOver) { self.velocityY = self.jumpStrength; } }; return self; }); // GameOverText class var GameOverText = Container.expand(function () { var self = Container.call(this); self.text = new Text2("GAME OVER", { fontFamily: "Arial", fontSize: 2250, fill: 0xFF0000, align: "center", fontWeight: "bold" }); self.text.anchorX = 0.5; self.text.anchorY = 0.5; self.addChild(self.text); self.zIndex = 100; return self; }); // Tree class: Üst ve alt ağaç oluşturma var Tree = Container.expand(function () { var self = Container.call(this); var bottomUnit = Math.floor(Math.random() * 8) + 1; var topUnit = 9 - bottomUnit; var unitSize = groundY / totalUnits; var bottomHeight = bottomUnit * unitSize; var topHeight = topUnit * unitSize; self.y = groundY; self.bottomTree = self.attachAsset('tree', { anchorX: 0.5, anchorY: 1, width: 300, height: bottomHeight, flipY: false }); self.topTree = self.attachAsset('tree', { anchorX: 0.5, anchorY: 0.5, width: 300, height: topHeight, flipY: false }); self.topTree.rotation = Math.PI; self.topTree.y = -groundY - gapOffset + topHeight / 2; self.zIndex = 1; self.x = 2048 + 800; self.velocityX = -3.6; self.spawned = false; self.prevX = self.x; self.update = function () { if (gameStarted && !gameOver) { self.x += self.velocityX; // Sırayla ağaç-boru üretimi if (!self.spawned && self.prevX > treeSpawnThreshold && self.x <= treeSpawnThreshold) { self.spawned = true; var newTube = new Tube(); newTube.x = 2048 + 800; game.addChild(newTube); lastSpawner = newTube; } self.prevX = self.x; // Geçme sayacı if (!self.passed && character.x > self.x + self.bottomTree.width / 2) { self.passed = true; updateScore(); } } }; return self; }); // Tube class: Üst ve alt boru oluşturma var Tube = Container.expand(function () { var self = Container.call(this); var bottomUnit = Math.floor(Math.random() * 8) + 1; var topUnit = 9 - bottomUnit; var unitSize = groundY / totalUnits; var bottomHeight = bottomUnit * unitSize; var topHeight = topUnit * unitSize; self.y = groundY; self.bottomTube = self.attachAsset('tube', { anchorX: 0.5, anchorY: 1, width: 300, height: bottomHeight, flipY: false }); self.topTube = self.attachAsset('tube', { anchorX: 0.5, anchorY: 0.5, width: 300, height: topHeight, flipY: false }); self.topTube.rotation = Math.PI; self.topTube.y = -groundY - gapOffset + topHeight / 2; self.zIndex = 1; self.x = 2048 + 800; self.velocityX = -3.6; self.spawned = false; self.prevX = self.x; self.update = function () { if (gameStarted && !gameOver) { self.x += self.velocityX; // Sırayla boru-ağaç üretimi if (!self.spawned && self.prevX > tubeSpawnThreshold && self.x <= tubeSpawnThreshold) { self.spawned = true; var newTree = new Tree(); newTree.x = 2048 + 800; game.addChild(newTree); lastSpawner = newTree; } self.prevX = self.x; // Geçme sayacı if (!self.passed && character.x > self.x + self.bottomTube.width / 2) { self.passed = true; updateScore(); } } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000000 }); /**** * Game Code ****/ // Karaktere 0.2 saniyelik (200ms) zoom in-out efekti uygulayan fonksiyon function createCloseButton() { // Close button’un kendi container’ı: var closeButtonContainer = new Container(); closeButtonContainer.zIndex = 9999; // Diğer her şeyin üstünde olsun // Close butonu için ellipse (shape) var closeShape = LK.getAsset('button_close', { anchorX: 0.5, anchorY: 0.5, width: 160 * 0.8, // Adjusted width to 80% of original height: 160 * 1.2 // Adjusted height to 120% of original }); closeButtonContainer.addChild(closeShape); // “X” metni var closeLabel = LK.getAsset('justX', { anchorX: 0.5, anchorY: 0.5, x: -6, // Moved 4 pixels left y: 2 // Moved 4 pixels up }); closeButtonContainer.addChild(closeLabel); return closeButtonContainer; } function zoomEffect() { // Mevcut scale değeri (örneğin orijinal 1) var originalScale = character.scale.x; // Zoom in: %20 artış character.scale.set(originalScale * 1.2); // 300ms sonra zoom out yap, orijinal scale'e dön LK.setTimeout(function () { character.scale.set(originalScale); }, 300); } // Dünyayı ters döndürme (flip) fonksiyonu – 0.2 saniye boyunca jump/gravity devre dışı function flipWorld() { if (flipped) { return; } flipped = true; // 0.3 saniye boyunca karakterin jump ve gravity etkilerini devre dışı bırak character.gravity = 0; character.jumpStrength = 0; zoomEffect(); LK.setTimeout(function () { // Ters dünyada: gravity -0.3, jumpStrength 12 character.gravity = -0.3; character.jumpStrength = 12; }, 300); // Dünya elemanlarını ters çevir (sadece scale yöntemiyle) background.scale.y *= -1; sky.scale.y *= -1; groundAsset.scale.y *= -1; ground2Asset.scale.y *= -1; } // Dünyayı eski hâline döndürme (unflip) fonksiyonu – 0.2 saniye boyunca jump/gravity devre dışı function unflipWorld() { if (!flipped) { return; } flipped = false; character.gravity = 0; character.jumpStrength = 0; zoomEffect(); LK.setTimeout(function () { // Normal dünyada: gravity 0.3, jumpStrength -12 character.gravity = 0.3; character.jumpStrength = -12; }, 300); // Dünya elemanlarını yeniden ters çevirerek orijinal haline döndür background.scale.y *= -1; sky.scale.y *= -1; groundAsset.scale.y *= -1; ground2Asset.scale.y *= -1; } // Skoru güncelleme fonksiyonu – Her 5 skorda flip/unflip toggle function updateScore() { passCounter++; counterText.setText(passCounter); if (passCounter % 5 === 0) { if (!flipped) { flipWorld(); } else { unflipWorld(); } } } /**** * Global Variables & Helper Functions ****/ var groundY = 2732; var deathDisabled = false; var counterTextClicks = 0; var menuOpen = true; var volumeOn = true; var records = []; // En iyi 5 skoru saklar var gapOffset = 400; var gameStarted = false; var gameOver = false; var gameWait = false; // Oyun menüden çıkıp da henüz başlamamışken true olacak. var invincibilityActivated = false; // Invincibility can be activated before the game starts var screenRight = 2048; var totalUnits = 10; var tubeSpawnThreshold, treeSpawnThreshold; var lastSpawner = null; var gameOverText = null; var passCounter = 0; var lastScore = 0; // Global lastScore variable // Flip durumunu takip eden bayrak var flipped = false; function centerX() { return 2048 / 2; } function centerY() { return groundY / 2; } tubeSpawnThreshold = centerX() + (screenRight - centerX()) / 2; treeSpawnThreshold = centerX() + 3 * (screenRight - centerX()) / 4; /**** * Menu Setup ****/ var menuContainer = new Container(); menuContainer.zIndex = 200; // Menü arka planları var menuBackground = LK.getAsset('menu_background', { anchorX: 0.5, anchorY: 0.5, x: centerX(), y: centerY() }); menuBackground.zIndex = 200; menuContainer.addChild(menuBackground); var menuBackgroundPart = LK.getAsset('menu_background_part', { anchorX: 0.5, anchorY: 0.19, x: centerX(), y: centerY() }); menuBackgroundPart.zIndex = menuBackground.zIndex + 1; // 201 menuContainer.addChild(menuBackgroundPart); // Butonlar ve Label’lar // PLAY var playButton = LK.getAsset('button_play', { anchorX: 0.5, anchorY: 0.5, x: centerX() - 20, y: centerY() + 205 }); playButton.visible = false; menuContainer.addChild(playButton); var playLabel = new Text2("PLAY", { fontFamily: "Arial", fontSize: 630.25 * 1.1 * 1.08, fill: 0xffffff }); playLabel.anchorX = 0.5; playLabel.anchorY = 0.5; playLabel.x = playButton.x - 45; playLabel.y = playButton.y - -25; playLabel.visible = true; playLabel.zIndex = 1000; menuContainer.addChild(playLabel); // VOLUME var volumeButton = LK.getAsset('button_volume', { anchorX: 0.5, anchorY: 0.5, x: centerX() - 28, y: centerY() + 310 }); volumeButton.visible = false; menuContainer.addChild(volumeButton); var volumeLabel = new Text2("VOLUME", { fontFamily: "Arial", fontSize: 63.25 * 1.1 * 1.05 * 1.05 * 1.05, fill: 0xffffff }); volumeLabel.anchorX = 0.5; volumeLabel.anchorY = 0.5; volumeLabel.x = volumeButton.x - 58; volumeLabel.y = volumeButton.y + 30; volumeLabel.visible = true; volumeLabel.zIndex = 1000; menuContainer.addChild(volumeLabel); // CREDITS var creditsButton = LK.getAsset('button_credits', { anchorX: 0.5, anchorY: 0.5, x: centerX() - 30, y: centerY() + 429 }); creditsButton.visible = false; menuContainer.addChild(creditsButton); var creditsLabel = new Text2("CREDITS", { fontFamily: "Arial", fontSize: 630.25 * 1.05 * 1.05 * 1.05, fill: 0xffffff }); creditsLabel.anchorX = 0.5; creditsLabel.anchorY = 0.5; creditsLabel.x = creditsButton.x - 60; creditsLabel.y = creditsButton.y + 28; creditsLabel.visible = true; creditsLabel.zIndex = 1000; menuContainer.addChild(creditsLabel); // RECORDS var recordsButton = LK.getAsset('button_records', { anchorX: 0.5, anchorY: 0.5, x: centerX() - 30, y: centerY() + 540 }); recordsButton.visible = false; menuContainer.addChild(recordsButton); var recordsLabel = new Text2("RECORDS", { fontFamily: "Arial", fontSize: 150.25 * 1.05 * 1.05 * 1.03 * 1.05, fill: 0xffffff }); recordsLabel.anchorX = 0.5; recordsLabel.anchorY = 0.5; recordsLabel.x = recordsButton.x - 67; recordsLabel.y = recordsButton.y + 28; recordsLabel.visible = true; recordsLabel.zIndex = 1000; menuContainer.addChild(recordsLabel); // Ekranda sayacımız var counterText = new Text2('0', { size: 124.2, fill: 0xFFFFFF }); counterText.anchor.set(0, 0); counterText.x = 1315; counterText.y = 15; LK.gui.topLeft.addChild(counterText); // Sağ üstteki counterText’e tıklama olayı ekleyelim counterText.interactive = true; counterText.zIndex = 1000; // Ensure it's on top of other elements counterText.zIndex = 1000; // Ensure it's on top of other elements counterText.on('down', function () { counterTextClicks++; if (!deathDisabled && counterTextClicks >= 8) { deathDisabled = true; console.log("Karakter için ölüm devre dışı bırakıldı (invincibility ON)."); counterTextClicks = 0; // sayaç sıfırlansın } else if (deathDisabled && counterTextClicks >= 10) { deathDisabled = false; console.log("Karakter için ölüm tekrar aktif (invincibility OFF)."); counterTextClicks = 0; } }); // Arkaplanlar var background = LK.getAsset('background', { anchorX: 0.5, anchorY: 0.5, x: centerX(), y: groundY / 2 }); background.zIndex = 0; game.addChild(background); var sky = LK.getAsset('sky', { anchorX: 0.5, anchorY: 0, x: centerX(), y: 0 }); sky.zIndex = 2; game.addChild(sky); var groundAsset = LK.getAsset('ground', { anchorX: 0.5, anchorY: 0.5, x: centerX(), y: groundY - -25 }); groundAsset.zIndex = 4.1; game.addChild(groundAsset); var ground2Asset = LK.getAsset('ground2', { anchorX: 0.5, anchorY: 0.5, x: centerX(), y: groundY - 40 }); ground2Asset.zIndex = 0.5; game.addChild(ground2Asset); // Karakteri ekle var character = game.addChild(new Character()); character.x = centerX(); character.y = groundY / 2; // Menü container'ı biraz aşağı kaydırma menuContainer.y += 100; game.addChild(menuContainer); /**** * Helper Functions: Credits, Volume & Records ****/ function createCommonCloseElements(modalWidth, modalHeight) { var closeLabel = LK.getAsset('justX', { anchorX: 0.5, anchorY: 0.5, zIndex: 10000, x: 6, // Moved 4 pixels left y: 16 // Moved 4 pixels up }); var radius = 50; var closeButton = LK.getAsset('button_close', { anchorX: 0.5, anchorY: 0.5, width: radius * 2.3 * 1.2, height: radius * 2.3 * 1.2 }); closeButton.zIndex = 10000; closeButton.x = 0; // Center the button horizontally closeButton.y = 0; // Center the button vertically closeButton.addChild(closeLabel); return { closeLabel: closeLabel, closeButton: closeButton }; } function showCredits() { // Disable menu interaction when modal is opened menuOpen = false; var creditsContainer = new Container(); creditsContainer.zIndex = 300; var modalWidth = 1250, modalHeight = 2000; var bg = LK.getAsset('second_menu', { anchorX: 0.5, anchorY: 0.5, width: modalWidth, height: modalHeight, color: 0x000000 }); bg.x = centerX(); bg.y = centerY(); creditsContainer.addChild(bg); var creditsText = new Text2("Game by\nMustafa Talha ŞEN", { fontFamily: "Arial", fontSize: 5000 * 1.03, fill: 0xffffff, align: "center" }); creditsText.anchorX = 0.5; creditsText.anchorY = 0.5; creditsText.x = centerX() - 359; creditsText.y = centerY() - 800 + 40; creditsText.scale.set(3, 3); creditsContainer.addChild(creditsText); // 5) creditsContainer’ı oyuna ekle game.addChild(creditsContainer); // 6) Close butonunu tamamen bağımsız ekle var closeButton = createCloseButton(); // Örneğin, modal’ın sağ üst köşesi olsun closeButton.x = bg.x + modalWidth / 2 - closeButton.width / 2 - 160; closeButton.y = bg.y - modalHeight / 2 + closeButton.height / 2 + 175; // Tıklanınca hem creditsContainer’ı hem close butonunu kaldır closeButton.on('down', function () { game.removeChild(creditsContainer); game.removeChild(closeButton); // Enable menu interaction when modal is closed menuOpen = true; menuContainer.visible = true; }); // Close butonunu da oyuna ekle game.addChild(closeButton); } function showVolume() { // Disable menu interaction when modal is opened menuOpen = false; var volumeContainer = new Container(); volumeContainer.zIndex = 300; var modalWidth = 1250, modalHeight = 2000; var bg = LK.getAsset('second_menu', { anchorX: 0.5, anchorY: 0.5, width: modalWidth, height: modalHeight, color: 0x000000 }); bg.x = centerX(); bg.y = centerY(); volumeContainer.addChild(bg); var volumeText = new Text2("Volume Settings", { fontFamily: "Arial", fontSize: 5000 * 1.03, fill: 0xffffff }); volumeText.scale.set(3, 3); volumeText.anchorX = 0.5; volumeText.anchorY = 0.5; volumeText.x = centerX() - 275; volumeText.y = centerY() - 800 + 85; volumeContainer.addChild(volumeText); // Container’ı oyuna ekle game.addChild(volumeContainer); // Close butonu bağımsız var closeButton = createCloseButton(); closeButton.x = bg.x + modalWidth / 2 - closeButton.width / 2 - 159; closeButton.y = bg.y - modalHeight / 2 + closeButton.height / 2 + 175; closeButton.on('down', function () { game.removeChild(volumeContainer); game.removeChild(closeButton); // Enable menu interaction when modal is closed menuOpen = true; menuContainer.visible = true; }); game.addChild(closeButton); } function showRecords() { // Disable menu interaction when modal is opened menuOpen = false; var recordsContainer = new Container(); recordsContainer.zIndex = 300; var modalWidth = 1500, modalHeight = 2200; var bg = LK.getAsset('second_menu', { anchorX: 0.5, anchorY: 0.5, width: modalWidth, height: modalHeight, color: 0x000000 }); bg.x = centerX(); bg.y = centerY(); recordsContainer.addChild(bg); var recordsTextStr = "Top Scores:\n"; for (var i = 0; i < records.length; i++) { recordsTextStr += i + 1 + ". " + records[i].score + " (Attempt " + records[i].attempt + ")\n"; } if (records.length === 0) { recordsTextStr += "No records yet."; } recordsTextStr += "\nAttempts: " + records.length; recordsTextStr += "\nLast Score: " + lastScore; var recordsText = new Text2(recordsTextStr, { fontFamily: "Arial", fontSize: 5000 * 1.03, fill: 0xffffff, align: "center" }); recordsText.anchorX = 0.5; recordsText.anchorY = 0.5; recordsText.x = centerX() - 280; recordsText.y = centerY() - 850 + 40; recordsText.scale.set(3, 3); recordsContainer.addChild(recordsText); // Container’ı oyuna ekle game.addChild(recordsContainer); // Close butonu bağımsız var closeButton = createCloseButton(); closeButton.x = bg.x + modalWidth / 2 - closeButton.width / 2 - 205; closeButton.y = bg.y - modalHeight / 2 + closeButton.height / 2 + 195; closeButton.on('down', function () { game.removeChild(recordsContainer); game.removeChild(closeButton); // Enable menu interaction when modal is closed menuOpen = true; menuContainer.visible = true; }); game.addChild(closeButton); } /**** * End Game & Reset Functions ****/ function endGame() { LK.effects.flashScreen(0xFF0000, 500); character.velocityY = character.jumpStrength; character.update = function () { if (gameOver) { character.velocityY += character.gravity; character.y += character.velocityY; if (character.y > groundY + character.height) { character.y = groundY + character.height; character.velocityY = 0; } } }; game.children.forEach(function (child) { if (child.velocityX) { child.velocityX = 0; } }); game.touchDisabled = true; lastScore = passCounter; records.push({ score: passCounter, attempt: records.length + 1 }); records.sort(function (a, b) { return b.score - a.score; }); if (records.length > 5) { records = records.slice(0, 5); } LK.setTimeout(function () { game.touchDisabled = false; menuOpen = true; menuContainer.visible = true; var startY = groundY + 100; var endY = centerY() - 1270; var animationDuration = 16.5 * 5 / 1.5; var startTime = Date.now(); function animateMenu() { var currentTime = Date.now(); var elapsedTime = currentTime - startTime; var progress = Math.min(elapsedTime / animationDuration, 1); menuContainer.y = startY + (endY - startY) * progress; if (progress < 1) { LK.setTimeout(animateMenu, 16); } } animateMenu(); }, 1700); LK.setTimeout(function () { resetGame(); }, 1750); } function resetGame() { if (gameOverText) { game.removeChild(gameOverText); gameOverText = null; } // Flip'i eski hâline döndür unflipWorld(); var objectsToRemove = []; game.children.forEach(function (child) { if (child instanceof Tree || child instanceof Tube) { objectsToRemove.push(child); } }); objectsToRemove.forEach(function (obj) { game.removeChild(obj); }); game.removeChild(character); character = game.addChild(new Character()); character.x = centerX(); character.y = groundY / 2; gameStarted = false; gameOver = false; lastSpawner = null; passCounter = 0; counterText.setText(passCounter); } /**** * Eliptik hit testi için yardımcı fonksiyon ****/ function checkEllipseHover(button, lx, ly) { var scaleFactorX = 1; var scaleFactorY = 0.53; var offsetY = 40; var dx = lx - button.x; var dy = ly - (button.y + offsetY); var rx = button.width / 2 * scaleFactorX; var ry = button.height / 2 * scaleFactorY; return dx * dx / (rx * rx) + dy * dy / (ry * ry) <= 1; } /**** * Fare hareketinde hover kontrolü ****/ game.move = function (x, y, obj) { if (!menuOpen) { return; } // Modal açıkken hover efekti çalışmasın. var localX = x - menuContainer.x; var localY = y - menuContainer.y; playButton.visible = checkEllipseHover(playButton, localX, localY); volumeButton.visible = checkEllipseHover(volumeButton, localX, localY); creditsButton.visible = checkEllipseHover(creditsButton, localX, localY); recordsButton.visible = checkEllipseHover(recordsButton, localX, localY); }; /**** * Touch Event ****/ game.down = function (x, y, obj) { if (menuOpen) { if (!invincibilityActivated && counterTextClicks >= 8) { deathDisabled = true; invincibilityActivated = true; console.log("Karakter için ölüm devre dışı bırakıldı (invincibility ON)."); counterTextClicks = 0; // sayaç sıfırlansın } else if (invincibilityActivated && counterTextClicks >= 10) { deathDisabled = false; invincibilityActivated = false; console.log("Karakter için ölüm tekrar aktif (invincibility OFF)."); counterTextClicks = 0; } var localX = x - menuContainer.x; var localY = y - menuContainer.y; if (checkEllipseHover(playButton, localX, localY)) { var _animateMenu = function animateMenu() { var currentTime = Date.now(); var elapsedTime = currentTime - startTime; var progress = Math.min(elapsedTime / animationDuration, 1); menuContainer.y = startY + (endY - startY) * progress; if (progress < 1) { LK.setTimeout(_animateMenu, 1); } else { menuOpen = false; menuContainer.visible = false; gameWait = true; } }; var animationDuration = 16.5 * 5 * 2 / 1.5; var startTime = Date.now(); var startY = menuContainer.y; var endY = centerY() + 100; _animateMenu(); return; } else if (checkEllipseHover(volumeButton, localX, localY)) { showVolume(); } else if (checkEllipseHover(creditsButton, localX, localY)) { showCredits(); } else if (checkEllipseHover(recordsButton, localX, localY)) { showRecords(); } return; } else if (gameOver) { if (!game.touchDisabled) { menuOpen = true; menuContainer.visible = true; resetGame(); } } else { if (gameWait) { gameWait = false; gameStarted = true; var initialTube = new Tube(); game.addChild(initialTube); lastSpawner = initialTube; character.jump(); } else { character.jump(); character.rotation = 0.1; LK.setTimeout(function () { character.rotation = 0; }, 200); } } }; /**** * Game Loop ****/ game.update = function () { game.children.forEach(function (child) { if (child.update) { child.update(); } }); game.children.sort(function (a, b) { return (a.zIndex || 0) - (b.zIndex || 0); }); };
===================================================================
--- original.js
+++ change.js
@@ -299,8 +299,9 @@
var gapOffset = 400;
var gameStarted = false;
var gameOver = false;
var gameWait = false; // Oyun menüden çıkıp da henüz başlamamışken true olacak.
+var invincibilityActivated = false; // Invincibility can be activated before the game starts
var screenRight = 2048;
var totalUnits = 10;
var tubeSpawnThreshold, treeSpawnThreshold;
var lastSpawner = null;
@@ -435,8 +436,9 @@
LK.gui.topLeft.addChild(counterText);
// Sağ üstteki counterText’e tıklama olayı ekleyelim
counterText.interactive = true;
counterText.zIndex = 1000; // Ensure it's on top of other elements
+counterText.zIndex = 1000; // Ensure it's on top of other elements
counterText.on('down', function () {
counterTextClicks++;
if (!deathDisabled && counterTextClicks >= 8) {
deathDisabled = true;
@@ -772,8 +774,19 @@
* Touch Event
****/
game.down = function (x, y, obj) {
if (menuOpen) {
+ if (!invincibilityActivated && counterTextClicks >= 8) {
+ deathDisabled = true;
+ invincibilityActivated = true;
+ console.log("Karakter için ölüm devre dışı bırakıldı (invincibility ON).");
+ counterTextClicks = 0; // sayaç sıfırlansın
+ } else if (invincibilityActivated && counterTextClicks >= 10) {
+ deathDisabled = false;
+ invincibilityActivated = false;
+ console.log("Karakter için ölüm tekrar aktif (invincibility OFF).");
+ counterTextClicks = 0;
+ }
var localX = x - menuContainer.x;
var localY = y - menuContainer.y;
if (checkEllipseHover(playButton, localX, localY)) {
var _animateMenu = function animateMenu() {