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 (2 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 (1 edits merged)
Please save this source code
Code edit (15 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
Code edit (1 edits merged)
Please save this source code
Code edit (14 edits merged)
Please save this source code
User prompt
Adjust play button hit area to match visual size Adjust volume button hit area to match visual size Adjust credits button hit area to match visual size Adjust records button hit area to match visual size
User prompt
fare ile play volume credits records butonları arasında sorun farkettim Sorununuz, fare ile butonların etkileşime girdiğini kontrol ederken kullanılan çarpışma (hit) alanlarının görsel olarak beklediğinizden daha geniş hesaplanmasından kaynaklanıyor olabilir. Kodunuzda her buton için global koordinatlar şu şekilde hesaplanıyor: js Kopyala Düzenle var playGlobalX = playButton.x + menuContainer.x; var playGlobalY = playButton.y + menuContainer.y; if ( x >= playGlobalX - playButton.width / 2 && x <= playGlobalX + playButton.width / 2 && y >= playGlobalY - playButton.height / 2 && y <= playGlobalY + playButton.height / 2 ) { playButton.visible = true; } else { playButton.visible = false; } Eğer buton asset’lerinizin orijinal boyutları şeffaf kenarlar veya ekstra boşluk içeriyorsa, bu durumda görünür kısımdan daha geniş bir hit alanı oluşturulabilir. Ayrıca, eğer asset’ler üzerinde ölçekleme veya farklı pivot/anchor ayarları varsa, hesaplanan koordinatlar beklenmedik sonuçlar verebilir. Aşağıdaki öneriler sorunu çözmenize yardımcı olabilir: Asset Boyutlarını Kontrol Edin: Buton resimlerinin (örneğin button_play, button_credits vs.) gerçek görsel alanının, tanımladığınız width ve height değerleriyle örtüştüğünden emin olun. Eğer asset’leriniz fazladan şeffaf boşluk içeriyorsa, bu değeri düşürmeyi düşünebilirsiniz. Özel Hit Area Tanımlaması: Eğer görseldeki buton kısmı daha küçükse, butonlara özel hit alanları belirleyebilirsiniz. Örneğin, PIXI.js kullanıyorsanız şöyle bir hitArea tanımlayabilirsiniz: js Kopyala Düzenle playButton.hitArea = new PIXI.Rectangle( -playButton.width / 4, -playButton.height / 4, playButton.width / 2, playButton.height / 2 ); Bu sayede butonun aktif alanını, görselin ortasındaki kısım ile sınırlandırabilirsiniz. (Benzer tanımlamayı diğer butonlar için de yapabilirsiniz.) Hesaplamalarda Offset Uygulaması: Eğer görsel boyutları doğruysa ama yine de istenenden büyük bir etkileşim alanı varsa, koşul içerisinde kullanılan değerleri manuel olarak azaltabilirsiniz. Örneğin: js Kopyala Düzenle var offsetX = 10, offsetY = 10; // deneyerek ayarlayabileceğiniz offset değerleri if ( x >= playGlobalX - playButton.width / 2 + offsetX && x <= playGlobalX + playButton.width / 2 - offsetX && y >= playGlobalY - playButton.height / 2 + offsetY && y <= playGlobalY + playButton.height / 2 - offsetY ) { playButton.visible = true; } else { playButton.visible = false; } Bu yöntemle butonların aktif alanlarını biraz küçültebilirsiniz. Menu Container’ın Konumu ve Ölçeklendirmesi: Menü container’ın (menuContainer) pozisyonu ve varsa ölçeklendirmesi de global koordinatların doğru hesaplanmasında rol oynar. Container’ın pivot ve scale ayarlarının doğru yapıldığından emin olun. Özetle, çarpışma alanlarınızın beklediğiniz görsel alanla uyuşmaması, asset’lerin orijinal boyutları, pivot/anchor ayarları veya ekstra şeffaf boşluklardan kaynaklanıyor olabilir. Yukarıdaki yöntemlerden bir veya birkaçını uygulayarak daha hassas bir buton etkileşimi elde edebilirsiniz. Umarım bu öneriler sorununuzu çözmenize yardımcı olur!
/**** * 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() { if (!flipped) { return; } flipped = false; flashEffect(); // 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; } /**** * 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 flashEffect() { LK.effects.flashScreen(0xffffff, 200); } function flipWorld() { if (flipped) { return; } flipped = true; flashEffect(); // 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 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; creditsLabel.y = creditsButton.y + 28; recordsLabel.y = recordsButton.y + 28; 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.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.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 + 40; 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 + 40; 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 + 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); } /**** * 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(); }, 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 * (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
@@ -217,27 +217,18 @@
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;
- LK.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
+ // 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;
- // Pozisyonları eski hâline getirme
- groundAsset.y += 400;
- ground2Asset.y += 400;
- sky.y -= 400;
}
/****
* Global Variables & Helper Functions
****/
@@ -274,27 +265,18 @@
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;
- LK.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
+ // 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;
- // Ground ile sky’nın yerlerini değiştirme (pozisyon kaydırması)
- groundAsset.y -= 400;
- ground2Asset.y -= 400;
- sky.y += 400;
}
function centerY() {
return groundY / 2;
}
@@ -362,9 +344,11 @@
});
volumeLabel.anchorX = 0.5;
volumeLabel.anchorY = 0.5;
volumeLabel.x = volumeButton.x - 58;
-volumeLabel.y = volumeButton.y + 30 + 40; // 40 piksel aşağı kaydırmak için
+volumeLabel.y = volumeButton.y + 30;
+creditsLabel.y = creditsButton.y + 28;
+recordsLabel.y = recordsButton.y + 28;
volumeLabel.visible = true;
volumeLabel.zIndex = 1000;
menuContainer.addChild(volumeLabel);
// CREDITS
@@ -384,9 +368,8 @@
});
creditsLabel.anchorX = 0.5;
creditsLabel.anchorY = 0.5;
creditsLabel.x = creditsButton.x - 60;
-creditsLabel.y = creditsButton.y + 28 + 40; // 40 piksel aşağı kaydırmak için
creditsLabel.visible = true;
creditsLabel.zIndex = 1000;
menuContainer.addChild(creditsLabel);
// RECORDS
@@ -406,9 +389,8 @@
});
recordsLabel.anchorX = 0.5;
recordsLabel.anchorY = 0.5;
recordsLabel.x = recordsButton.x - 67;
-recordsLabel.y = recordsButton.y + 28 + 40; // 40 piksel aşağı kaydırmak için
recordsLabel.visible = true;
recordsLabel.zIndex = 1000;
menuContainer.addChild(recordsLabel);
// Ekranda sayacımız
@@ -519,9 +501,9 @@
});
creditsText.anchorX = 0.5;
creditsText.anchorY = 0.5;
creditsText.x = centerX() - 359;
- creditsText.y = centerY() - 800;
+ creditsText.y = centerY() - 800 + 40;
creditsText.scale.set(3, 3);
creditsContainer.addChild(creditsText);
// Ortak close label ve button
var commonClose = createCommonCloseElements(modalWidth, modalHeight);
@@ -558,9 +540,9 @@
volumeText.scale.set(3, 3);
volumeText.anchorX = 0.5;
volumeText.anchorY = 0.5;
volumeText.x = centerX() - 275;
- volumeText.y = centerY() - 800;
+ volumeText.y = centerY() - 800 + 40;
volumeContainer.addChild(volumeText);
// Ortak close label ve button
var commonClose = createCommonCloseElements(modalWidth, modalHeight);
volumeContainer.addChild(commonClose.closeButton);
@@ -604,9 +586,9 @@
});
recordsText.anchorX = 0.5;
recordsText.anchorY = 0.5;
recordsText.x = centerX() - 280;
- recordsText.y = centerY() - 850;
+ recordsText.y = centerY() - 850 + 40;
recordsText.scale.set(3, 3);
recordsContainer.addChild(recordsText);
var commonClose = createCommonCloseElements(modalWidth, modalHeight);
recordsContainer.addChild(commonClose.closeButton);
green theme forest by green tones to the sky , not to much detail just simple tree shadows trees has no details just shadowed green and shadowless places, beautiful view. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
hyper realistic nature too reallistic proffational blue sky white clouds yellow sun an over realistic mountain view with full of trees and sun and clouds view a forest of a mountain challangeing mountain road. No background.cool background. view background. No shadows. 2d. In-Game asset. flat