User prompt
Kodun eski sürümünde flip işlemini sağlayan bazı satırlar vardı; yeni sürümde bu kısımlar eksik kalmış veya doğru entegre edilmemiş olabilir. Şu noktalara dikkat edin: updateScore Fonksiyonu: Tube ve Tree update fonksiyonlarında updateScore() çağrılarak, passCounter her 5’e ulaştığında flipWorld ya da unflipWorld fonksiyonları tetikleniyor mu? Eğer bu çağrılar eksikse, flip işlemi başlamayacaktır. flipWorld / unflipWorld Fonksiyonları: Bu fonksiyonlarda, dünya elemanlarının (background, sky, groundAsset, ground2Asset) scale.y değerini “*= -1” ile ters çevirdiğinizden emin olun. 200ms boyunca karakterin gravity ve jumpStrength sıfırlanıyor, ardından flip durumuna göre atanıyor mu? Kod Satır Sayısında Azalma: Kodunuzun eski sürümünde flip işlevini sağlayan ek satırlar varsa, yeni versiyonda bazı kritik kısımlar (örneğin updateScore’un Tube/Tree update’lerine eklenmiş hali) silinmiş olabilir. Önerim: Kodunuzun eski versiyonu ile yeni versiyonunu karşılaştırarak flipWorld, unflipWorld ve updateScore fonksiyonlarının tam olarak entegre olduğundan emin olun. Konsolda hata mesajı alıyor musunuz? Herhangi bir hata olmuyorsa, fonksiyonların gerçekten tetiklenip tetiklenmediğini kontrol etmek için geçici console.log() ifadeleri ekleyebilirsiniz. Örneğin, flipWorld fonksiyonunu şu şekilde kontrol edebilirsiniz: js Kopyala Düzenle function flipWorld() { if (flipped) return; flipped = true; console.log("flipWorld çalıştı"); character.gravity = 0; character.jumpStrength = 0; zoomEffect(); LK.setTimeout(function () { character.gravity = -0.3; character.jumpStrength = 12; }, 200); background.scale.y *= -1; sky.scale.y *= -1; groundAsset.scale.y *= -1; ground2Asset.scale.y *= -1; } Aynı şekilde unflipWorld fonksiyonunda da benzer log ekleyerek çağrının gerçekleştiğini doğrulayabilirsiniz. Bu kontrolleri yaptıktan sonra, eksik veya yanlış yerleştirilmiş satırları tamamlayarak flip işlemini yeniden etkin hale getirebilirsiniz. Eğer belirli bir hata mesajı veya davranış gözlemliyorsanız, detay verirseniz daha spesifik yardımcı olabilirim.
Code edit (1 edits merged)
Please save this source code
User prompt
• Efekt Süresi 0.2 saniyeye çıkarıldı: – Karakterin jump ve gravity değerleri, flip/unflip sırasında 200ms boyunca 0 olacak. – Zoom in/out efekti de 200ms sürecek. • Her 5 skorda flip durumu toggle olacak: – Örneğin: Skor 5’de (passCounter % 5 === 0) world flip, skor 10’da world orijinal hâline dönecek, skor 15’te yeniden flip olacak. Aşağıdaki kodu, flipWorld(), unflipWorld(), zoomEffect() ve updateScore() fonksiyonlarınızı güncellemek için kullanabilirsiniz: js Kopyala Düzenle // Zoom efektini 0.2 saniyede uygulayan fonksiyon function zoomEffect() { var originalScale = character.scale.x; // Varsayılan scale (örneğin 1) character.scale.set(originalScale * 1.2); // Zoom in: %20 artış setTimeout(function() { character.scale.set(originalScale); // 200ms sonra zoom out, eski hale döndür }, 200); } // Dünyayı ters döndürme (flip) fonksiyonu: Flip durumunda gravity ve jump kalıcı olarak ters ayarlanır function flipWorld() { if (flipped) return; // Zaten ters durumdaysa tekrar flip yapma flipped = true; zoomEffect(); // 0.2 saniye boyunca karakterin jump ve gravity etkilerini devre dışı bırakıyoruz character.gravity = 0; character.jumpStrength = 0; setTimeout(function() { // Ters dünyada: gravity -0.3, jumpStrength +12 character.gravity = -0.3; character.jumpStrength = 12; }, 200); // Dünya elemanlarını (background, sky, groundAsset, ground2Asset) sadece scale ile ters çeviriyoruz 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: Normal dünyada gravity ve jump ayarları geri verilir function unflipWorld() { if (!flipped) return; // Zaten düz durumdaysa tekrar unflip yapma flipped = false; zoomEffect(); // 0.2 saniye boyunca karakterin jump ve gravity etkilerini devre dışı bırakıyoruz character.gravity = 0; character.jumpStrength = 0; setTimeout(function() { // Normal dünyada: gravity 0.3, jumpStrength -12 character.gravity = 0.3; character.jumpStrength = -12; }, 200); // Dünya elemanlarını (background, sky, groundAsset, ground2Asset) scale ile yeniden ters çevirerek eski hâline 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 durumunu toggle eder function updateScore() { passCounter++; counterText.setText(passCounter); // Her 5 skorda (örneğin 5, 10, 15, ...) flip işlemi gerçekleşsin if (passCounter % 5 === 0) { if (!flipped) { flipWorld(); } else { unflipWorld(); } } } Kullanım Notları: Tube ve Tree nesnelerindeki geçiş kontrolünde (örneğin karakter nesnesi geçerken) updateScore() fonksiyonunu çağırarak skoru artırın. Böylece; – Skor 5’de world flip (gravity ve jump 0.2 saniye için devre dışı kalıp ardından ters ayarlanır). – Skor 10’da world unflip (normal ayarlara geri döner). – Her 5 skorda bu toggle işlemi gerçekleşir. Karakterin sprite’sı (scale.y) hiçbir zaman değişmediğinden, flip sırasında görsel olarak ters dönmeyecektir.
User prompt
Aşağıdaki örnekte, flash efekti yerine karaktere 0.1 saniyelik (100ms) zoom in/zoom out efekti uyguluyoruz. Bu sürede karakterin gravity ve jumpStrength değerleri 0 olarak ayarlanıyor, yani ne zıplıyor ne de düşüyor. Flip (ters döndürme) işlemi sırasında dünya elemanlarının (background, sky, groundAsset, ground2Asset) scale.y değeri tersine çevriliyor. Aşağıdaki kodu flipWorld() ve unflipWorld() fonksiyonlarını güncellemek için kullanabilirsiniz: js Kopyala Düzenle // Karakter zoom efekti: 0.1 saniye (100ms) içinde zoom in (yakınlaştır) ve hemen sonra zoom out (normal hale) döndürme function zoomEffect() { // Mevcut scale değeri (varsayım: orijinalde 1) var originalScale = character.scale.x; // Zoom in: %20 artış character.scale.set(originalScale * 1.2); // 50ms sonra (yarısı) zoom out yaparak orijinal scale’e dön setTimeout(function() { character.scale.set(originalScale); }, 50); } function flipWorld() { if (flipped) return; // Zaten ters durumda ise tekrar flip yapma flipped = true; // 0.1 saniye boyunca karakterin jump ve gravity etkilerini devre dışı bırakıyoruz: var originalGravity = character.gravity; // (Normalde 0.3) var originalJumpStrength = character.jumpStrength; // (Normalde -12) character.gravity = 0; character.jumpStrength = 0; // Karaktere zoom in-out efekti uygula zoomEffect(); // 0.1 saniye sonra (100ms) flip durumuna göre yeni değerleri ata: setTimeout(function() { // Flip durumunda karakterin yer çekimi tersine, zıplama gücü de pozitif olacak character.gravity = -0.3; character.jumpStrength = 12; }, 100); // Dünya elemanlarını ters çevir (sadece scale yoluyla) background.scale.y *= -1; sky.scale.y *= -1; groundAsset.scale.y *= -1; ground2Asset.scale.y *= -1; } function unflipWorld() { if (!flipped) return; // Zaten düz durumda ise tekrar unflip yapma flipped = false; // 0.1 saniye boyunca jump ve gravity etkilerini devre dışı bırakıyoruz: var originalGravity = character.gravity; // (Flip durumunda -0.3) var originalJumpStrength = character.jumpStrength; // (Flip durumunda 12) character.gravity = 0; character.jumpStrength = 0; // Karaktere zoom in-out efekti uygula zoomEffect(); // 0.1 saniye sonra orijinal (düz) değerleri geri ver: setTimeout(function() { character.gravity = 0.3; character.jumpStrength = -12; }, 100); // Dünya elemanlarını tekrar ters çevirerek eski hâline döndür: background.scale.y *= -1; sky.scale.y *= -1; groundAsset.scale.y *= -1; ground2Asset.scale.y *= -1; } Açıklamalar: zoomEffect() fonksiyonu, karakterin scale.x ve scale.y değerlerini %20 artırıp 50ms sonra eski haline döndürerek kısa bir zoom in/zoom out animasyonu yaratır. FlipWorld() ve unflipWorld() fonksiyonlarında, flip süresi boyunca (0.1 saniye) karakterin gravity ve jumpStrength değerleri 0 yapılır. 100ms sonra, flip durumuna uygun (ters: -0.3 ve 12, düz: 0.3 ve -12) değerler yeniden atanır. Dünya elemanlarının (background, sky, groundAsset, ground2Asset) ters çevirme işlemi, sadece scale.y’nin çarpanıyla yapılır; böylece y konumlarında herhangi bir değişiklik olmaz.
Code edit (8 edits merged)
Please save this source code
User prompt
Please fix the bug: 'Cannot read properties of undefined (reading 'y')' in or related to this line: 'creditsLabel.y = creditsButton.y + 28;' Line Number: 369
User prompt
1. Flip/Unflip Fonksiyonları Artık flipWorld() çağrıldığında: Karakterin sprite’sı (scale.y) değişmeyecek (hep 1 kalacak). Gravity ve jumpStrength kalıcı olarak tersine ayarlanacak: Düz dünyada: gravity = 0.3 ve jumpStrength = -12 Ters dünyada: gravity = -0.3 ve jumpStrength = 12 background, sky, groundAsset, ground2Asset sadece scale yoluyla ters çevrilecek. Y koordinatlarında (yer değiştirme) hiçbir ayarlama yapılmayacak; böylece ground ve sky eski pozisyonlarında kalacak. js Kopyala Düzenle function flipWorld() { if (flipped) return; // Zaten ters durumda ise tekrar flip yapma. flipped = true; flashEffect(); // Kısa beyaz flaş efekti // Karakterin hareketlerini tersine ayarla (kalıcı) character.gravity = -0.3; character.jumpStrength = 12; // Karakterin sprite’sı değişmeyecek: character.scale.y = 1; // Arka plan ve zemin elemanlarını ters çevir (sadece scale) background.scale.y *= -1; sky.scale.y *= -1; groundAsset.scale.y *= -1; ground2Asset.scale.y *= -1; } function unflipWorld() { if (!flipped) return; // Zaten düz durumda ise tekrar unflip yapma. flipped = false; flashEffect(); // Kısa beyaz flaş efekti // Karakterin hareketlerini düz hale getir: character.gravity = 0.3; character.jumpStrength = -12; // Karakterin sprite’sı hep 1 kalıyor. character.scale.y = 1; // Arka plan ve zemin elemanlarını eski haline döndür (sadece scale) background.scale.y *= -1; sky.scale.y *= -1; groundAsset.scale.y *= -1; ground2Asset.scale.y *= -1; } Not: Eğer flip/unflip çağrıları skor artışına bağlı olarak yapılacaksa, örneğin skor 1’de flip, skor 5’te unflip tetikleniyorsa ilgili noktalarda bu fonksiyonları çağırın. 2. Flash Efekti Fonksiyonu Bu fonksiyon, flip/unflip sırasında 200ms süren beyaz flaş efekti oluşturur. js Kopyala Düzenle function flashEffect() { LK.effects.flashScreen(0xffffff, 200); // Beyaz flaş, 200ms } 3. Modal (Açılır Menü) Düzenlemeleri Ana menüdeki (PLAY ekranındaki) label’lar, ekstra 40 piksel kaydırma olmadan orijinal konumunda kalacak. Ancak Records, Credits ve Volume tıklandığında açılan modallarda, içerideki metinlerin (örneğin, top skor kısmı) y konumuna +40 piksel eklenmiş olacak. Örnek: showRecords() js Kopyala Düzenle function showRecords() { 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, fill: 0xffffff, align: "center" }); recordsText.anchorX = 0.5; recordsText.anchorY = 0.5; recordsText.x = centerX() - 280; // Orijinal y değeri: centerY() - 850. +40 piksel kaydırma: recordsText.y = centerY() - 850 + 40; recordsText.scale.set(3, 3); recordsContainer.addChild(recordsText); var commonClose = createCommonCloseElements(modalWidth, modalHeight); recordsContainer.addChild(commonClose.closeButton); recordsContainer.addChild(commonClose.closeLabel); commonClose.closeButton.on('down', function () { game.removeChild(recordsContainer); menuOpen = true; menuContainer.visible = true; }); game.addChild(recordsContainer); } showCredits() ve showVolume() için de benzer şekilde: Credits: Değiştirin: creditsText.y = centerY() - 800 + 40; (Önceki değer centerY() - 800 ise şimdi centerY() - 760) Volume: Değiştirin: volumeText.y = centerY() - 800 + 40; (Önceki değer centerY() - 800 ise şimdi centerY() - 760) 4. Özet Ana Menü Label’larında artık ekstra 40px kaydırma yok (orijinal ayarları korundu). Açılır modallarda (Records, Credits, Volume) metinlerin y konumuna 40px eklenerek içerik biraz aşağı konumlandırıldı. flipWorld() / unflipWorld() fonksiyonlarında: Karakterin sprite’sı ters dönmüyor (scale.y hep 1). Gravity ve jumpStrength değerleri flip edildiğinde kalıcı olarak ters ayarlanıyor. Arka plan, sky, ground ve ground2 sadece scale yoluyla ters çevriliyor; y konumlarında hiçbir değişiklik yapılmıyor. flashEffect() flip/unflip sırasında 200ms süresince beyaz flaş efekti sağlıyor.
User prompt
Please fix the bug: 'TypeError: setTimeout is not a function' in or related to this line: 'setTimeout(function () {' Line Number: 303
User prompt
Aşağıdaki örnekte, isteklerinize göre üç ana değişiklik yapıldı: Menu Label Konumları: Volume, Credits ve Records label’larının y koordinatlarına 40 piksel ekleyerek (aşağıya kaydırarak) yeni konumları ayarlandı. Flip İşlemi Sırasında Karakterin Dönmemesi: flipWorld() ve unflipWorld() fonksiyonlarında artık karakterin scale.y değeri değiştirilmedi; bu sayede karakter hep normal (üstü doğru) kalıyor. Flip İşlemi Sırasında Karakterin Gravity & Jump Efektlerinin 0.2 Saniye Çalışmaması: flipWorld() (ve unflipWorld()) fonksiyonlarında, karakterin gravity ve jumpStrength değerleri 200ms boyunca 0’ya ayarlanıyor. Bu süre zarfında karakterin fiziksel hareketleri (düşme/zıplama) etkisiz hale geliyor, ardından orijinal değerlerine (0.3 ve –12) geri dönüyor. Aşağıda ilgili kısımların güncellenmiş kodunu bulabilirsiniz: Menu Label’larının Aşağı Kaydırılması (40 piksel): js Kopyala Düzenle // VOLUME Label 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; // Eski: volumeButton.y - -30 => volumeButton.y + 30 // 40 piksel aşağı kaydırmak için: volumeLabel.y = volumeButton.y + 30 + 40; volumeLabel.visible = true; volumeLabel.zIndex = 1000; menuContainer.addChild(volumeLabel); // CREDITS Label 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; // Eski: creditsButton.y - -28 => creditsButton.y + 28 creditsLabel.y = creditsButton.y + 28 + 40; creditsLabel.visible = true; creditsLabel.zIndex = 1000; menuContainer.addChild(creditsLabel); // RECORDS Label 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; // Eski: recordsButton.y - -28 => recordsButton.y + 28 recordsLabel.y = recordsButton.y + 28 + 40; recordsLabel.visible = true; recordsLabel.zIndex = 1000; menuContainer.addChild(recordsLabel); flipWorld() Fonksiyonunun Güncellenmiş Hali: js Kopyala Düzenle // Flaş efekti için kısa sürelik beyaz ekran (LK’nin flashScreen fonksiyonunu kullanıyoruz) function flashEffect() { LK.effects.flashScreen(0xffffff, 200); } function flipWorld() { if (flipped) return; flipped = true; flashEffect(); // Karakter için: 200ms boyunca gravity ve jump etkilerini devre dışı bırakıyoruz var originalGravity = 0.3; var originalJumpStrength = -12; character.gravity = 0; character.jumpStrength = 0; setTimeout(function() { character.gravity = originalGravity; character.jumpStrength = originalJumpStrength; }, 200); // Karakter ters dönmesin: scale.y değişmiyor (değeri hep 1 kalır) // Dünya elemanlarını (background, sky, groundAsset, ground2Asset) ters çeviriyoruz background.scale.y *= -1; sky.scale.y *= -1; groundAsset.scale.y *= -1; ground2Asset.scale.y *= -1; // Ground ile sky’nın yerlerini değiştirme (pozisyon kaydırması) groundAsset.y -= 400; ground2Asset.y -= 400; sky.y += 400; } unflipWorld() Fonksiyonunun Güncellenmiş Hali (Düz Hâline Döndürme): js Kopyala Düzenle function unflipWorld() { if (!flipped) return; flipped = false; flashEffect(); // Karakter için 200ms boyunca gravity ve jump etkilerini devre dışı bırakıyoruz var originalGravity = 0.3; var originalJumpStrength = -12; character.gravity = 0; character.jumpStrength = 0; setTimeout(function() { character.gravity = originalGravity; character.jumpStrength = originalJumpStrength; }, 200); // Karakter scale.y değeri dokunulmaz (hep 1 kalır) // Dünya elemanlarını yeniden ters çevirerek orijinal hâline döndürüyoruz background.scale.y *= -1; sky.scale.y *= -1; groundAsset.scale.y *= -1; ground2Asset.scale.y *= -1; // Pozisyonları eski hâline getirme groundAsset.y += 400; ground2Asset.y += 400; sky.y -= 400; } Not: Skor artışında (Tree veya Tube sınıflarında geçiş kontrolünde) flipWorld() ve unflipWorld() çağrıları skor 1 ve skor 5’e ulaşıldığında yapılmalı. Eğer resetGame() fonksiyonunda da dünya düzleştirme işlemi gerekiyorsa, unflipWorld()’ı çağırmaya devam edebilirsiniz. Mevcut diğer flipWorld() tanımlamalarını bu güncellenmiş sürümle değiştirmeyi unutmayın. Bu değişikliklerle: Menu üzerindeki volume, credits ve records label’ları 40 piksel aşağı kaydırılmış olur. Ekran flip işlemi sırasında karakterin görünümü (scale.y) değişmez, ve fiziksel etkileri (gravity, jump) 0.2 saniye boyunca devre dışı kalır. Arka plan, sky, ground ve ground2 ters döner, ayrıca ground ve sky’nın y koordinatları değiştirilerek yer değiştirme sağlanır. Flip geçişi sırasında kısa bir beyaz flaş efekti (200ms) gösterilir.
User prompt
0.05 saniye daha
User prompt
Please fix the bug: 'TypeError: setTimeout is not a function' in or related to this line: 'setTimeout(function () {' Line Number: 281
User prompt
• Skor 1 olduğunda dünya ters döner. • Skor 5’e ulaşıldığında dünya tekrar düz hâline döner. • Dünya dönerken (her iki durumda da) karakterin 0.2 saniye boyunca düşmesi engellenir (gravity 0 olarak atanır, 200ms sonra eski değere döner). • Karakterin kendisi ters dönmez (scale.y sabit kalır). • Ground ve ground2 ile sky’ın y koordinatları değiştirilerek yer değiştirmesi sağlanır. • Dünya döndürme esnasında, LK’nin flash efekti kullanılarak (beyaz flaş 0.2 saniyelik) efekt eklenir. Aşağıdaki kodu, oyununuzdaki ilgili kısımlara (global değişkenler, skor güncellemesi, Tube/Tree’daki geçiş kontrolü vs.) ekleyebilirsiniz: js Kopyala Düzenle // --- Global Değişkenler --- var gameWidth = 2048; // Oyun genişliği (uygun değeri kullanın) var gameHeight = 2732; // Oyun yüksekliği (groundY değeriyle uyumlu) var flipped = false; // Dünya ters dönmüş mü kontrolü var passCounter = 0; // Skor sayacı // --- Flash Efekti Fonksiyonu --- // Eğer LK.effects.flashScreen mevcutsa, onu kullanmak entegrasyon açısından daha uyumlu olur. function flashEffect() { LK.effects.flashScreen(0xffffff, 200); // Beyaz flaş, 200ms sürecek } // --- Dünya Dönme Fonksiyonu --- // Bu fonksiyon çağrıldığında dünya ters/düz döner. // Not: Karakterin scale.y değeri sabit kalacak (ters dönmeyecek). // Ayrıca, 0.2 saniye boyunca karakterin yerçekimi sıfırlanıyor. function flipWorld() { // Ters/düz durumunu tersine çeviriyoruz. flipped = !flipped; // Flaş efekti flashEffect(); // 0.2 saniye boyunca karakterin hareket etmemesi için gravity 0 yapılıyor. var originalGravity = 0.3; // Normal gravity değeri character.gravity = 0; setTimeout(function() { character.gravity = originalGravity; }, 200); // Karakter ters dönmesin: character.scale.y = 1; // Arkaplan ve zeminlerin ters çevrilmesi background.scale.y *= -1; groundAsset.scale.y *= -1; ground2Asset.scale.y *= -1; sky.scale.y *= -1; // Sky ve Ground'un yer değiştirmesi: // (Pozisyon ayarları, sahnenizin görsel ihtiyacına göre ayarlanabilir) if (flipped) { groundAsset.y -= 400; ground2Asset.y -= 400; sky.y += 400; } else { groundAsset.y += 400; ground2Asset.y += 400; sky.y -= 400; } } // --- Skor Güncelleme Fonksiyonu --- // Tube veya Tree nesnelerindeki update() fonksiyonlarında, karakter geçiş yaptığında bu fonksiyonu çağırın. function updateScore() { passCounter++; counterText.setText(passCounter); // Skor 1 ve 5 olduğunda dünya döndürme işlemi tetikleniyor. if (passCounter === 1 || passCounter === 5) { flipWorld(); } } Kullanım Notları: Skor Artışı: Tube ve Tree sınıflarının update() fonksiyonlarındaki geçiş sayacı kısmında, js Kopyala Düzenle if (!self.passed && character.x > self.x + self.bottomTube.width / 2) { self.passed = true; updateScore(); } gibi updateScore() çağırarak skor artışını ve dünya dönüşünü tetikleyebilirsiniz. Oyun Resetinde: Eğer resetGame() gibi bir fonksiyonunuz varsa, reset sırasında flipped durumunu false yapmak ve dünya elemanlarının konumunu/ölçeklerini orijinal hâline getirmek için ek sıfırlama kodları ekleyin. Pozisyon Ayarları: groundAsset, ground2Asset ve sky için y pozisyonlarında yapılan ±400 kaydırma, oyununuzun görsel ihtiyaçlarına göre uyarlanabilir. Bu düzenleme ile: • Skor 1’de dünya ters dönerken karakter 0.2 saniye hareketsiz kalır ve kendisi ters dönmez. • Skor 5’e gelindiğinde tekrar düz hâline döner. • Dönüş esnasında beyaz flaş efekti gösterilir. Test edip entegrasyonu sağlayabilirsiniz. Herhangi bir hata veya ek isteğiniz olursa, geri bildirim verebilirsiniz!
User prompt
0.1 saniye daha
User prompt
game overdan sonra ekranın resetlenmesini 0.1 saniye hızlandır
User prompt
Oyun bittiğinde veya resetlendiğinde her şeyin tekrar “düz” hâline dönmesini istiyorsanız, flip işlemini tersine çevirecek bir fonksiyon tanımlayıp bunu resetGame() (veya endGame() sonrasında) çağırmanız gerekiyor. Örneğin, aşağıdaki gibi bir unflipWorld() fonksiyonu tanımlayıp resetGame() içerisinde en başta çağırabilirsiniz: js Kopyala Düzenle // Mevcut flipWorld() fonksiyonunun tersi function unflipWorld() { flipped = false; // Ters durum bayrağını kapat character.scale.y = 1; // Karakteri düz çevir character.gravity = 0.3; // Gravity’yi tekrar pozitif yap character.jumpStrength = -12; // Jump’ı tekrar -12 yap background.scale.y = 1; // Arkaplanı düz çevir sky.scale.y = 1; // Sky'ı düz çevir groundAsset.scale.y = 1; // Zeminleri düz çevir ground2Asset.scale.y = 1; } // resetGame fonksiyonunuzun sonunda veya başında bunu çağırın function resetGame() { if (gameOverText) { game.removeChild(gameOverText); gameOverText = null; } // Flip'i eski hâline döndür unflipWorld(); // Ağaç ve boru gibi objeleri temizle var objectsToRemove = []; game.children.forEach(function (child) { if (child instanceof Tree || child instanceof Tube) { objectsToRemove.push(child); } }); objectsToRemove.forEach(function (obj) { game.removeChild(obj); }); // Karakteri yeniden oluştur game.removeChild(character); character = game.addChild(new Character()); character.x = centerX(); character.y = groundY / 2; // Skor ve değişkenleri sıfırla gameStarted = false; gameOver = false; lastSpawner = null; passCounter = 0; counterText.setText(passCounter); } Bu sayede: İlk defa skor 1 olduğunda flipWorld() tetiklenir ve her şey ters döner. Oyun bittiğinde resetGame() çağrılırken unflipWorld() de devreye girer ve tüm elemanları (karakter, arkaplan, zemin vs.) tekrar orijinal hâline çevirir. Böylece yeni oyuna sıfırdan, düz bir sahneyle başlamış olursunuz. Skor yine 1 olursa tekrar ters döner. Bu yaklaşım, her oyun döngüsünde sıfırlanmasını istediğiniz tüm özellikleri resetGame() içinde tek bir yerden yönetmenizi sağlar.
User prompt
Aşağıdaki adımları izleyerek “skor 1’e ulaştığında karakterin ve sahnenin (arkaplan, sky, ground) ters dönmesi” özelliğini ekleyebilirsiniz. Temel mantık: Globalde bir flipped = false; (ters dönme olup olmadığını takip eden) değişken tanımlıyoruz. Ters döndürme işini yapan bir fonksiyon (flipWorld()) yazıyoruz. Bu fonksiyon: Karakterin scale.y değerini -1 yaparak grafiğini ters çeviriyor. Karakterin gravity ve jumpStrength değerlerini tersine çeviriyor. background, sky, groundAsset ve ground2Asset için de scale.y = -1 yaparak onları da görsel olarak tersine döndürüyor. Skor (passCounter) tam 1 olduğunda flipWorld() fonksiyonunu çağırıyoruz. Bu çağrıyı, Tree ve Tube nesnelerinin update() fonksiyonlarında “geçme sayacını (passCounter) 1 artırdığımız” yerde yapabilirsiniz. Aşağıda, kodda eklemeniz gereken önemli bölümler örneklenmiştir: 1) Global Değişken ve Fonksiyon Tanımlama js Kopyala Düzenle /**** * Global Variables & Helper Functions ****/ var groundY = 2732; 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; var screenRight = 2048; var totalUnits = 10; var tubeSpawnThreshold, treeSpawnThreshold; var lastSpawner = null; var gameOverText = null; var passCounter = 0; var lastScore = 0; // YENİ: Skor 1'e ulaştığında ters dönüşün yapılıp yapılmadığını takip eden değişken var flipped = false; /** * Ters döndürme fonksiyonu * - Karakteri, arkaplanı, ground'u ve sky'ı ters çevirir * - Karakterin yer çekimi ve zıplama gücünü negatifine çevirir */ function flipWorld() { if (flipped) return; // Tek seferlik olsun diye flipped = true; // Karakteri ters döndür character.scale.y = -1; // Gravity ve jump tersine character.gravity = -0.3; character.jumpStrength = 12; // Arkaplanı ters döndür background.scale.y = -1; // Sky, ground, ground2 ters döndür sky.scale.y = -1; groundAsset.scale.y = -1; ground2Asset.scale.y = -1; } Bu şekilde flipWorld() fonksiyonunuz hazır olacak. 2) Skor Artarken Ters Döndürme Çağrısı Kodunuzda, Tree ve Tube sınıflarının update() fonksiyonlarında “karakter boruyu/ağacı geçtiğinde” skor artışı yapıyorsunuz. Aşağıdaki gibi passCounter++ sonrasında if (passCounter == 1 && !flipped) { flipWorld(); } eklemeniz yeterli. Tube sınıfındaki update fonksiyonunda şu satırları bulun: js Kopyala Düzenle // Geçme sayacı if (!self.passed && character.x > self.x + self.bottomTube.width / 2) { self.passed = true; passCounter += 1; counterText.setText(passCounter); // YENİ: Skor tam 1 olduğunda ters dönüş başlat if (passCounter === 1 && !flipped) { flipWorld(); } } Aynı mantığı Tree sınıfının update fonksiyonunda da uygulayın: js Kopyala Düzenle // Geçme sayacı if (!self.passed && character.x > self.x + self.bottomTree.width / 2) { self.passed = true; passCounter += 1; counterText.setText(passCounter); // YENİ: Skor tam 1 olduğunda ters dönüş başlat if (passCounter === 1 && !flipped) { flipWorld(); } } Böylece, ilk defa skor 1’e ulaşıldığında flipWorld() tetiklenecek ve hem karakter hem de sahne (arkaplan, sky, ground, ground2) görsel olarak ters dönecek. Karakterin gravity ve jumpStrength değerleri de eksiye çevrildiği için “yukarı doğru çekiliyormuş” gibi uçacak. 3) Dikkat Edilmesi Gerekenler Çarpışma/Konum Kontrolleri: Görsel olarak ters dönme yapılırken, çarpışma hesapları hâlâ normal “y” koordinat düzeneğinde işliyor olabilir. Eğer üstte “tavan” gibi bir sınır eklemek isterseniz veya “zemin” mantığını yukarı taşıyacaksanız, ilgili koşulları da tersine uyarlamanız gerekir. Anchor Noktaları: background, sky, groundAsset vb. sprite’ların anchorY değerleri farklı ise (örneğin sky için anchorY = 0), scale.y = -1 uygulandığında ekranda beklenmedik bir kayma olabilir. Gerekirse anchorY’ları 0.5 yaparak ortadan çevirme sağlayabilirsiniz veya y koordinatını da yeniden ayarlayabilirsiniz. Bu eklemelerle, skor 1’e ulaştığınızda karakter başaşağı olacak, yer çekimi yukarı doğru etkileyecek ve arka plan/zemin de görsel olarak ters dönmüş gözükecektir. Kolay gelsin!
Code edit (1 edits merged)
Please save this source code
User prompt
i cant see it can you place it top of screen
User prompt
write x text on close button
User prompt
make it 1
User prompt
10 count score dan sonra karakteri ters çevir
Code edit (10 edits merged)
Please save this source code
User prompt
records credits ve volume butonuna tıklayınca açılan pencere için second_menu kullanılsın
Code edit (1 edits merged)
Please save this source code
Code edit (1 edits merged)
Please save this source code
/**** * 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 (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 (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 (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; passCounter += 1; counterText.setText(passCounter); // YENİ: Skor tam 1 olduğunda ters dönüş başlat if (passCounter === 1 && !flipped) { flipWorld(); } } } }; 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; passCounter += 1; counterText.setText(passCounter); // YENİ: Skor tam 1 olduğunda ters dönüş başlat if (passCounter === 1 && !flipped) { flipWorld(); } } } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000000 }); /**** * Game Code ****/ /** * Ters döndürme işlemini geri alır * - Karakteri, arkaplanı, ground'u ve sky'ı düz çevirir * - Karakterin yer çekimi ve zıplama gücünü orijinaline çevirir */ function unflipWorld() { flipped = false; // Ters durum bayrağını kapat character.scale.y = 1; // Karakteri düz çevir character.gravity = 0.3; // Gravity’yi tekrar pozitif yap character.jumpStrength = -12; // Jump’ı tekrar -12 yap background.scale.y = 1; // Arkaplanı düz çevir sky.scale.y = 1; // Sky'ı düz çevir groundAsset.scale.y = 1; // Zeminleri düz çevir ground2Asset.scale.y = 1; } /**** * Global Variables & Helper Functions ****/ var groundY = 2732; 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 screenRight = 2048; var totalUnits = 10; var tubeSpawnThreshold, treeSpawnThreshold; var lastSpawner = null; var gameOverText = null; var passCounter = 0; var lastScore = 0; // Global lastScore variable // YENİ: Skor 1'e ulaştığında ters dönüşün yapılıp yapılmadığını takip eden değişken var flipped = false; function centerX() { return 2048 / 2; } /** * Ters döndürme fonksiyonu * - Karakteri, arkaplanı, ground'u ve sky'ı ters çevirir * - Karakterin yer çekimi ve zıplama gücünü negatifine çevirir */ function flipWorld() { if (flipped) { return; } // Tek seferlik olsun diye flipped = true; // Karakteri ters döndür character.scale.y = -1; // Gravity ve jump tersine character.gravity = -0.3; character.jumpStrength = 12; // Arkaplanı ters döndür background.scale.y = -1; // Sky, ground, ground2 ters döndür sky.scale.y = -1; groundAsset.scale.y = -1; ground2Asset.scale.y = -1; } 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: 63.25 * 1.1 * 1.08, // 18% increase 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; // diğer öğelerden yüksek 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, // 30% increase fill: 0xffffff }); volumeLabel.anchorX = 0.5; volumeLabel.anchorY = 0.5; volumeLabel.x = volumeButton.x - 58; volumeLabel.y = volumeButton.y - -30; // 12 piksel yukarı 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, // 25% increase 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, // 30% increase fill: 0xffffff }); recordsLabel.anchorX = 0.5; recordsLabel.anchorY = 0.5; recordsLabel.x = recordsButton.x - 67; recordsLabel.y = recordsButton.y - -28; // 12 piksel yukarı recordsLabel.visible = true; recordsLabel.zIndex = 1000; menuContainer.addChild(recordsLabel); // Ekranda sayacımız var counterText = new Text2('0', { size: 124.2, // 15% artış from 108 fill: 0xFFFFFF }); counterText.anchor.set(0, 0); counterText.x = 1320; counterText.y = 10; LK.gui.topLeft.addChild(counterText); // 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) { // close label: base close label font size (hesaplanmış değeri 35 * 1.16 * 1.15 * 1.1 * 1.2 ≈ 62) var closeLabel = new Text2("X", { fontFamily: "Arial", fontSize: Math.round(350000 * 10000.16 * 10000.15), fill: 0xffffff, align: "center" }); closeLabel.anchorX = 0.5; closeLabel.anchorY = 0.5; closeLabel.zIndex = 10000; // Konum: sağ üst köşeye yakın (20px offset) closeLabel.x = centerX() + modalWidth / 2 - 0; closeLabel.y = 350; // close button var radius = 50; var closeButton = LK.getAsset('button_close', { anchorX: 1.85, anchorY: -1.10, width: radius * 2.3 * 1.2, height: radius * 2.3 * 1.2 }); closeButton.zIndex = 10000; closeButton.x = closeLabel.x + 0; closeButton.y = closeLabel.y + 0; closeButton.addChild(closeLabel); return { closeLabel: closeLabel, closeButton: closeButton }; } function showCredits() { var creditsContainer = new Container(); creditsContainer.zIndex = 300; // Modal boyutu: 1250x2000 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, fill: 0xffffff, align: "center" }); creditsText.anchorX = 0.5; creditsText.anchorY = 0.5; creditsText.x = centerX() - 359; creditsText.y = centerY() - 800; creditsText.scale.set(3, 3); creditsContainer.addChild(creditsText); // Ortak close label ve button var commonClose = createCommonCloseElements(modalWidth, modalHeight); creditsContainer.addChild(commonClose.closeButton); creditsContainer.addChild(commonClose.closeLabel); commonClose.closeButton.on('down', function () { game.removeChild(creditsContainer); menuOpen = true; menuContainer.visible = true; }); game.addChild(creditsContainer); } function showVolume() { var volumeContainer = new Container(); volumeContainer.zIndex = 300; // Modal boyutu: 1250x2000 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, fill: 0xffffff }); volumeText.scale.set(3, 3); volumeText.anchorX = 0.5; volumeText.anchorY = 0.5; volumeText.x = centerX() - 275; volumeText.y = centerY() - 800; volumeContainer.addChild(volumeText); // Ortak close label ve button var commonClose = createCommonCloseElements(modalWidth, modalHeight); volumeContainer.addChild(commonClose.closeButton); volumeContainer.addChild(commonClose.closeLabel); commonClose.closeButton.on('down', function () { game.removeChild(volumeContainer); menuOpen = true; menuContainer.visible = true; }); game.addChild(volumeContainer); } function showRecords() { 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, fill: 0xffffff, align: "center" }); recordsText.anchorX = 0.5; recordsText.anchorY = 0.5; recordsText.x = centerX() - 280; recordsText.y = centerY() - 850; recordsText.scale.set(3, 3); recordsContainer.addChild(recordsText); var commonClose = createCommonCloseElements(modalWidth, modalHeight); recordsContainer.addChild(commonClose.closeButton); recordsContainer.addChild(commonClose.closeLabel); commonClose.closeButton.on('down', function () { game.removeChild(recordsContainer); menuOpen = true; menuContainer.visible = true; }); game.addChild(recordsContainer); } /**** * 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; } } }; // Tüm hareket eden nesneleri durdur game.children.forEach(function (child) { if (child.velocityX) { child.velocityX = 0; } }); game.touchDisabled = true; lastScore = passCounter; // Skoru kaydet 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; // Ekranın altından var endY = centerY() - 1270; // Son konum 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(); }, 1900); } 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 * (Butonun etkileşim alanını %5 daraltmak için 0.95 çarpanı ekliyoruz) ****/ function checkEllipseHover(button, lx, ly) { var scaleFactorX = 1; // Yatayda daraltma var scaleFactorY = 0.53; // Dikeyde daraltma var offsetY = 40; // Elips merkezini 30 piksel aşağı kaydırma var dx = lx - button.x; var dy = ly - (button.y + offsetY); var rx = button.width / 2 * scaleFactorX; var ry = button.height / 2 * scaleFactorY; // Elips formülü: (dx^2 / rx^2) + (dy^2 / ry^2) <= 1 ise nokta içindedir. return dx * dx / (rx * rx) + dy * dy / (ry * ry) <= 1; } /**** * Fare hareketinde hover kontrolü: butonlar yalnızca imleç üzerindeyken görünür ****/ game.move = function (x, y, obj) { // Menü container'a göre fare konumunu bul var localX = x - menuContainer.x; var localY = y - menuContainer.y; // Her buton için eliptik kontrol yapıyoruz (%5 daraltılmış elips) 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) { // Menü üzerindeyken butonlara tıklama kontrolü de eliptik olsun: var localX = x - menuContainer.x; var localY = y - menuContainer.y; if (checkEllipseHover(playButton, localX, localY)) { // Play butonuna basıldı 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) { // Oyun henüz başlamamış, ilk dokunuş gameWait = false; gameStarted = true; var initialTube = new Tube(); game.addChild(initialTube); lastSpawner = initialTube; character.jump(); } else { // Oyun zaten başlamış, normal zıplama 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
@@ -645,9 +645,9 @@
animateMenu();
}, 1700);
LK.setTimeout(function () {
resetGame();
- }, 2000);
+ }, 1900);
}
function resetGame() {
if (gameOverText) {
game.removeChild(gameOverText);