Code edit (4 edits merged)
Please save this source code
User prompt
Please fix the bug: 'Cannot set properties of undefined (setting 'gravity')' in or related to this line: 'bg2.gravity = 0.03;' Line Number: 425
User prompt
Örneğin, background için gravity değerini 0.03 ve jumpStrength değerini –0.15 olarak ayarlayabilirsiniz. Bu durumda: Gravity değeri 0’a çok yakın (yani neredeyse hiç etki etmiyor) JumpStrength değeri ise 0’dan daha uzak, yani background hafif bir sıçrama yapıyor Ayrıca, background update fonksiyonunda yerçekiminin yukarı doğru etkileşmesi için: js Kopyala Düzenle child.velocityY -= child.gravity; child.y += child.velocityY; olarak güncelleyin. Aşağıda ilgili satırların güncellenmiş hali yer alıyor: js Kopyala Düzenle // Background için: background.velocityY = 0; background.gravity = 0.03; // 0'a çok yakın bir değer background.jumpStrength = -0.15; // 0'dan daha uzak ama azıcık // bg2 için de aynı: bg2.velocityY = 0; bg2.gravity = 0.03; bg2.jumpStrength = -0.15; Ve game loop'da background ve bg2 güncellemesi: js Kopyala Düzenle if (!gameOver && !menuOpen && gameStarted) { child.x -= 7.2; child.velocityY -= child.gravity; child.y += child.velocityY; } Böylece, background (ve bg2) yerçekimi yukarı doğru çalışacak ve zıplama sırasında -0.15 değeri uygulanarak arka planın biraz sıçraması sağlanacaktır.
User prompt
Background için yerçekimi (gravity) yönünü yukarı doğru yapmak istiyorsanız, güncelleme (update) fonksiyonunda background ve bg2 için yerçekimi ekleme işlemini tersine çevirmeniz gerekir. Yani, şuan kodda: js Kopyala Düzenle child.velocityY += child.gravity; child.y += child.velocityY; şeklinde yazılmış. Yerçekiminin yukarı doğru (y ekseninde azalma) etki etmesi için bunu şu şekilde değiştirin: js Kopyala Düzenle child.velocityY -= child.gravity; child.y += child.velocityY; Böylece background için yerçekimi, container'daki gibi yukarı doğru (velocityY'nin azalarak, y konumunun düşmesi) çalışacaktır.
User prompt
Aşağıdaki örnekte background ve bg2 için gravity ile jumpStrength değerlerini inanılmaz küçük (örneğin 0.05 ve –0.1 gibi) olarak ayarladım. Ayrıca resetGame fonksiyonunda background ve bg2’nin y konumunu başlangıç değeri (groundY/2) olacak şekilde sıfırladım. Aşağıdaki kod parçalarında ilgili değişiklikleri görebilirsiniz: 1. Background ve bg2 Ayarları (Başlangıçta): js Kopyala Düzenle var background = LK.getAsset('background', { anchorX: 0.5, anchorY: 0.5, x: centerX(), y: groundY / 2 }); background.zIndex = 0; // İnanılmaz küçük değerler: background.velocityY = 0; background.gravity = 0.05; background.jumpStrength = -0.1; game.addChild(background); var bg2 = LK.getAsset('bg2', { anchorX: 0.5, anchorY: 0.5, x: centerX() + 2807.2, y: groundY / 2 }); bg2.zIndex = 0; bg2.velocityY = 0; bg2.gravity = 0.05; bg2.jumpStrength = -0.1; game.addChild(bg2); 2. Karakterin jump Fonksiyonu (Background ve bg2’ye Etki): js Kopyala Düzenle self.jump = function () { if (!gameOver && gameStarted) { self.velocityY = self.jumpStrength; LK.getSound('wingeffect').play(); // Karakter zıpladığında background ve bg2'ye de aynı küçük değerleri uygula: background.velocityY = background.jumpStrength; bg2.velocityY = bg2.jumpStrength; background3DContainer.velocityY = background3DContainer.jumpStrength; bgEffect3DContainer.velocityY = bgEffect3DContainer.jumpStrength; } }; 3. Game Loop'da Background Güncellemesi: (Background ve bg2 güncellenirken, artık mevcut gravity değeri (0.05) kullanılacak.) js Kopyala Düzenle if (!gameOver && !menuOpen && gameStarted) { child.x -= 7.2; child.velocityY += child.gravity; child.y += child.velocityY; } 4. ResetGame Fonksiyonunda Background ve bg2'nin Konumunu Sıfırlama: ResetGame fonksiyonuna background ve bg2'nin y konumunu başlangıç değerine (groundY/2) döndürecek satırları ekledim: js Kopyala Düzenle function resetGame() { if (gameOverText) { game.removeChild(gameOverText); gameOverText = null; } 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 = centerY(); // Background yatay konumları sıfırlanıyor, ayrıca y konumunu başlangıç değeri yapıyoruz: background.x = centerX(); background.y = groundY / 2; bg2.x = centerX() + 2807.2; bg2.y = groundY / 2; background.velocityX = -3.6; bg2.velocityX = -3.6; bg2.scale.x = 1; gameStarted = false; gameOver = false; character.preventDeath = false; underscoreAsset.preventDeath = false; lastSpawner = null; passCounter = 0; underscoreTouchCount = 0; counterText.setText(passCounter); // Reset container'ların konumunu ve velocity değerlerini (3D arka plan için) background3DContainer.y = 2350; bgEffect3DContainer.y = 2350; background3DContainer.velocityY = 0; bgEffect3DContainer.velocityY = 0; } Bu düzenlemelerle, background ve bg2 artık inanılmaz küçük gravity/jump değerleriyle hareket edecek; ayrıca karakter öldükten sonra, resetGame fonksiyonunda konumları sıfırlanarak başlangıç konumuna (groundY/2) geri dönecekler.
User prompt
Aşağıdaki kodda, background ve bg2 için zıplama gücünü azaltıp (jumpStrength = –8) yerçekimini artırdım (gravity = 0.5). Artık karakter zıpladığında background ve bg2 de aşağıdaki değerlerle hareket edecek: js Kopyala Düzenle var background = LK.getAsset('background', { anchorX: 0.5, anchorY: 0.5, x: centerX(), y: groundY / 2 }); background.zIndex = 0; // Yeni ayarlar: jumpStrength azaltıldı, gravity artırıldı background.velocityY = 0; background.gravity = 0.5; background.jumpStrength = -8; game.addChild(background); var bg2 = LK.getAsset('bg2', { anchorX: 0.5, anchorY: 0.5, x: centerX() + 2807.2, y: groundY / 2 }); bg2.zIndex = 0; bg2.velocityY = 0; bg2.gravity = 0.5; bg2.jumpStrength = -8; game.addChild(bg2); Ayrıca, karakterin jump fonksiyonunda background ve bg2 için aynı değerler uygulanıyor: js Kopyala Düzenle self.jump = function () { if (!gameOver && gameStarted) { self.velocityY = self.jumpStrength; LK.getSound('wingeffect').play(); // Karakter zıpladığında background ve bg2'ye de jump etkisi uyguluyoruz: background.velocityY = background.jumpStrength; bg2.velocityY = bg2.jumpStrength; background3DContainer.velocityY = background3DContainer.jumpStrength; bgEffect3DContainer.velocityY = bgEffect3DContainer.jumpStrength; } }; Ve game loop'da background ve bg2'nun dikey hareketleri şu şekilde güncelleniyor: js Kopyala Düzenle if (!gameOver && !menuOpen && gameStarted) { child.x -= 7.2; child.velocityY += child.gravity; child.y += child.velocityY; } Bu güncellemeler sayesinde, background ve bg2, container'ın hareket özelliklerine göre (daha düşük zıplama ve daha yüksek yerçekimi) hareket edecektir.
User prompt
Eğer background'un konumunu sarmalayan bir container kullanmadan, doğrudan background asset'ine aynı jump ve gravity efektini vermek istiyorsan, background nesnesine de velocity, gravity ve jumpStrength gibi özellikler ekleyip, karakter zıpladığında bu değerleri uygulayabilirsin. Örneğin: Başlangıçta background özelliklerini ayarlayın: Kodunuzun background'u eklediğiniz kısımına hemen ekleyin: js Kopyala Düzenle background.velocityY = 0; background.gravity = 0.3; // Container ile aynı gravity background.jumpStrength = -12; // Container ile aynı jumpStrength bg2.velocityY = 0; bg2.gravity = 0.3; bg2.jumpStrength = -12; Karakter zıpladığında background'a da etki edin: Karakterin jump fonksiyonunda background ve bg2 için de aynı jumpStrength'i uygulayın: js Kopyala Düzenle self.jump = function () { if (!gameOver && gameStarted) { self.velocityY = self.jumpStrength; LK.getSound('wingeffect').play(); // Karakter zıpladığında background ve bg2'ye de jump etkisi uyguluyoruz: background.velocityY = background.jumpStrength; bg2.velocityY = bg2.jumpStrength; } }; Game Loop'da background'u güncelleyin: game.update fonksiyonunuzun uygun bir yerinde (örneğin diğer update çağrılarından sonra) background ve bg2'nun dikey hareketini hesaplayın: js Kopyala Düzenle if (gameStarted && !gameOver) { background.velocityY += background.gravity; background.y += background.velocityY; bg2.velocityY += bg2.gravity; bg2.y += bg2.velocityY; } Bu sayede, background ve bg2 normalde sabit kalır; ancak karakter zıpladığında aynı container'daki gibi belirlediğiniz jumpStrength ve gravity ile dikey hareket yaparlar. Böylece zıplama ve yerçekimi büyüklüğü ve yönü, container ile aynı olur.
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
User prompt
Konteyner sınırlarını üstten 100 pixel ve alttan 200 pixel genişletelim Arka plan için daha hafif bir yer çekimi etkisi oluşturalım (ay atmosferi benzeri) Konteyner Sınırları ve Yer Çekimi DeğişiklikleriCode Yaptığım değişiklikler: Konteyner Sınırları: Üst sınırı 2000'den 1900'e düşürdüm (100 pixel yukarı) Alt sınırı 2400'den 2600'e artırdım (200 pixel aşağı) Başlangıç ve reset pozisyonlarını yeni alt sınıra uygun olarak güncelledim Ay Atmosferi Benzeri Yer Çekimi: Yer çekimi etkisini this.gravity * 0.6 olarak azalttım (%60 yer çekimi) jumpStrength değerini 12'den 8'e düşürdüm - daha hafif bir yerçekimi olduğunda zıplama tepki kuvveti de daha az olmalı Bu değişiklikler, arka planın daha geniş bir aralıkta hareket etmesini sağlayacak ve arka plana ay atmosferi hissi verecek şekilde daha hafif bir yer çekimi etkisi uygulayacaktır. Karakter zıpladığında arka plan daha yavaş hareket edecek ve "ay yüzeyindeymiş" gibi bir his uyandıracaktır.
User prompt
Containere uygulanan gravity değerini yüzdeelli azalt
User prompt
Containere uygulanan gravity değerlerini minus yap
User prompt
Karakter ilk zıpladığı anda container yukarı doğru zıplasın karakterin zıplamasından 3 kat daha yükseğe zıplasın ama çok uzun sürsün 1 dakika sürsün mesela max yüksekliğine çıkması
User prompt
Karakter gravity tarafından aşağı çekildiği zamanlarda container yukarı doğru bir kuvvet ile çekilsin
User prompt
Container karaktere gravity uygulandığında yukarı çıksın
User prompt
Container oyun başladığında yavaşça yukarı çıksın
Code edit (1 edits merged)
Please save this source code
Code edit (2 edits merged)
Please save this source code
User prompt
Aşağıdaki örnekte, tek bir container oluşturuyoruz. Bu container; Sürekli olarak update fonksiyonunda y ekseninde sabit (örneğin 0.5 piksel) aşağı doğru hareket ediyor. Container'a her tıklamada ekstra bir miktar (örneğin 50 piksel) aşağıya doğru kayıyor. Y değeri belirlediğimiz sınırlar içinde (örneğin maksimum 2400) kalıyor. Aşağıdaki kodu oyununuzdaki uygun yerde (örneğin oyun başlangıcında) kullanabilirsiniz: js Kopyala Düzenle // Örnek container oluşturuluyor var myContainer = new Container(); myContainer.x = centerX(); // Ekranın yatay ortasında myContainer.y = 2000; // Başlangıçta y = 2000 (örneğin en üst sınır) // Sabit aşağı doğru hareket hızı (update fonksiyonunda uygulanacak) var containerDownwardSpeed = 0.5; // Her tıklamada ek olarak uygulanacak aşağı doğru kayma miktarı var extraDownDelta = 50; // Container'ın update fonksiyonu: her frame sabit hızda aşağıya doğru hareket eder myContainer.update = function() { // Oyun başlamışsa veya sürekli hareket isteniyorsa; gerekirse gameStarted kontrolü ekleyebilirsiniz this.y += containerDownwardSpeed; // Maksimum y sınırını 2400 olarak ayarlıyoruz (isteğe bağlı) if (this.y > 2400) { this.y = 2400; } }; // Container'a tıklama (touch/down) olayı ekliyoruz myContainer.on('down', function() { // Tıklamada ekstra aşağı kayma ekliyoruz this.y += extraDownDelta; if (this.y > 2400) { this.y = 2400; } }); // Oluşturulan container'ı oyuna ekleyelim game.addChild(myContainer); Açıklama: myContainer.update: Her frame çağrıldığında container'ın y konumuna containerDownwardSpeed (0.5) eklenir. Böylece container sürekli aşağıya kayar. myContainer.on('down'): Kullanıcı container'a tıkladığında (veya dokunduğunda) ekstraDownDelta (50) kadar y konumu artırılır. Clamp: Her iki durumda da y değeri maksimum 2400 ile sınırlandırılır. Bu örnek, tek bir container için tıklama ve sürekli hareket davranışını sağlar. Kendi oyununuzdaki diğer container’lar veya global değişkenler ile uyumlu hale getirmek için değerleri ve konumları ihtiyacınıza göre ayarlayabilirsiniz.
Code edit (1 edits merged)
Please save this source code
User prompt
Please fix the bug: 'ReferenceError: containerScrollSpeed is not defined' in or related to this line: 'child.x -= containerScrollSpeed;' Line Number: 876
Code edit (1 edits merged)
Please save this source code
User prompt
Please fix the bug: 'ReferenceError: containerScrollSpeed is not defined' in or related to this line: 'child.x -= containerScrollSpeed;' Line Number: 873
Code edit (16 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; if (!self.intersects(underscoreAsset) && !self.preventDeath) { 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; if (characterLeft + self.width / 2 < 0 || characterRight - self.width / 2 > screenRight || characterTop + self.height / 2 < 0 || characterBottom - self.height / 2 > groundY) { gameOver = true; endGame(); } 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) { if (!self.intersects(underscoreAsset) && !self.preventDeath) { 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) { if (!self.intersects(underscoreAsset) && !self.preventTreeDeath) { gameOver = true; endGame(); } } } } }); } }; self.jump = function () { if (!gameOver && gameStarted) { self.velocityY = self.jumpStrength; LK.getSound('wingeffect').play(); // Karakter zıpladığında container’lara da "zıplama" efekti veriyoruz. // Karakter yukarı zıplarken (velocityY negatif), container'lar aşağı doğru hareket etsin: background3DContainer.velocityY = background3DContainer.jumpStrength; // pozitif değer bgEffect3DContainer.velocityY = bgEffect3DContainer.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; 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; if (!self.passed && character.x > self.x + self.bottomTree.width / 2) { self.passed = true; updateScore(); } } }; return self; }); /**** * Tube class: Üst ve alt boru oluşturma ****/ var Tube = Container.expand(function () { var self = Container.call(this); var bottomUnit = Math.floor(Math.random() * 8) + 1; var topUnit = 9 - bottomUnit; var unitSize = groundY / totalUnits; var bottomHeight = bottomUnit * unitSize; var topHeight = topUnit * unitSize; self.y = groundY; self.bottomTube = self.attachAsset('tube', { anchorX: 0.5, anchorY: 1, width: 300, height: bottomHeight, flipY: false }); self.topTube = self.attachAsset('tube', { anchorX: 0.5, anchorY: 0.5, width: 300, height: topHeight, flipY: false }); self.topTube.rotation = Math.PI; self.topTube.y = -groundY - gapOffset + topHeight / 2; self.zIndex = 1; self.x = 2048 + 800; self.velocityX = -3.6; self.spawned = false; self.prevX = self.x; self.update = function () { if (gameStarted && !gameOver) { self.x += self.velocityX; if (self.velocityX === 0) { background.velocityX = 0; bg2.velocityX = 0; } 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; if (!self.passed && character.x > self.x + self.bottomTube.width / 2) { self.passed = true; updateScore(); } } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000000 }); /**** * Game Code ****/ /**** * Global Variables & Helper Functions ****/ var groundY = 2732; var menuOpen = true; var volumeOn = true; var records = []; 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; var backgroundScrollSpeed = 7.2; var underscoreTouchCount = 0; var containerScrollSpeed = 7.2; // Define containerScrollSpeed with a default value var flipped = false; function centerX() { return 2048 / 2; } function centerY() { return groundY / 2; } tubeSpawnThreshold = centerX() + (screenRight - centerX()) / 2; treeSpawnThreshold = centerX() + 3 * (screenRight - centerX()) / 4; // Menü Setup var menuContainer = new Container(); menuContainer.zIndex = 200; var menuBackground = LK.getAsset('menu_background', { anchorX: 0.5, anchorY: 0.5, x: centerX(), y: centerY() + 625 }); menuBackground.zIndex = 1000; menuContainer.addChild(menuBackground); var menuBackgroundPart = LK.getAsset('menu_background_part', { anchorX: 0.5, anchorY: 0.19, x: centerX() - 1030, y: centerY() - 2866 }); menuBackgroundPart.zIndex = menuBackground.zIndex + 1; menuBackground.addChild(menuBackgroundPart); var playButton = LK.getAsset('button_play', { anchorX: 0.5, anchorY: 0.5, x: centerX() - 20, y: centerY() + 205 }); playButton.visible = false; menuContainer.addChild(playButton); var playLabel = new Text2("PLAY", { fontFamily: "Arial", fontSize: 630.25 * 1.1 * 1.08 * 1.5, fill: 0xffffff }); playLabel.anchorX = 0.5; playLabel.anchorY = 0.5; playLabel.x = playButton.x - 45; playLabel.y = playButton.y - -25; playLabel.visible = true; playLabel.zIndex = 1000; menuContainer.addChild(playLabel); var volumeButton = LK.getAsset('button_volume', { anchorX: 0.5, anchorY: 0.5, x: centerX() - 28, y: centerY() + 320 }); volumeButton.visible = false; menuContainer.addChild(volumeButton); var volumeLabel = new Text2("VOLUME", { fontFamily: "Arial", fontSize: 63.25 * 1.1 * 1.05 * 1.05 * 1.05 * 1.5, fill: 0xffffff }); volumeLabel.anchorX = 0.5; volumeLabel.anchorY = 0.5; volumeLabel.x = volumeButton.x - 58; volumeLabel.y = volumeButton.y + 30; volumeLabel.visible = true; volumeLabel.zIndex = 1000; menuContainer.addChild(volumeLabel); 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 * 1.5, 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); 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 * 1.5, fill: 0xffffff }); recordsLabel.anchorX = 0.5; recordsLabel.anchorY = 0.5; recordsLabel.x = recordsButton.x - 67; recordsLabel.y = recordsButton.y + 28; recordsLabel.visible = true; recordsLabel.zIndex = 1000; menuContainer.addChild(recordsLabel); var counterText = new Text2('0', { size: 124.2, fill: 0xFFFFFF }); counterText.anchor.set(0, 0); counterText.x = 1315; counterText.y = 15; LK.gui.topLeft.addChild(counterText); var background = LK.getAsset('background', { anchorX: 0.5, anchorY: 0.5, x: centerX(), y: groundY / 2 }); background.zIndex = 0; game.addChild(background); var bg2 = LK.getAsset('bg2', { anchorX: 0.5, anchorY: 0.5, x: centerX() + 2807.2, y: groundY / 2 }); bg2.zIndex = 0; game.addChild(bg2); 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.4, x: centerX(), y: groundY - -25 }); groundAsset.zIndex = 4.1; game.addChild(groundAsset); var ground2Asset = LK.getAsset('ground2', { anchorX: 0.5, anchorY: 0.05, x: centerX(), y: groundY - 40 }); ground2Asset.zIndex = 0.5; game.addChild(ground2Asset); function updateScore() { passCounter++; counterText.setText(passCounter); } // Karakter bağlı 3D arka plan ve efekt – başlangıçta container y = 1040 (ilk spawn noktası) var background3D = LK.getAsset('3dlikebackground', { anchorX: 0.5, anchorY: 0.5 }); var background3DContainer = new Container(); background3DContainer.offsetY = 0; background3DContainer.velocityY = 0; background3DContainer.gravity = 0.3; // Normal gravity (aşağı doğru) background3DContainer.jumpStrength = 12; // Karakter zıpladığında container'ların alacağı hız (pozitif) background3DContainer.isInverted = false; background3DContainer.addChild(background3D); background3DContainer.x = centerX(); // İlk spawn y değeri 1040 background3DContainer.y = 1040; // Container update: gravity etkisiyle velocityY artar background3DContainer.update = function () { this.velocityY += this.gravity; this.y += this.velocityY; }; game.addChild(background3DContainer); var bgEffect3D = LK.getAsset('3dbgeffect', { anchorX: 0.5, anchorY: 0.5 }); var bgEffect3DContainer = new Container(); bgEffect3DContainer.offsetY = 0; bgEffect3DContainer.velocityY = 0; bgEffect3DContainer.gravity = 0.3; // Normal gravity (aşağı doğru) bgEffect3DContainer.jumpStrength = 12; bgEffect3DContainer.isInverted = false; bgEffect3DContainer.addChild(bgEffect3D); bgEffect3DContainer.x = background3DContainer.x + 2807; bgEffect3DContainer.y = 1040; bgEffect3DContainer.update = function () { this.velocityY += this.gravity; this.y += this.velocityY; }; game.addChild(bgEffect3DContainer); var underscoreAsset = LK.getAsset('_', { anchorX: 0.5, anchorY: 0.5, x: centerX() + 1000, y: centerY() }); underscoreAsset.zIndex = 15000; game.addChild(underscoreAsset); underscoreAsset.on('down', function () { underscoreTouchCount++; if (underscoreTouchCount >= 5) { character.preventDeath = true; character.preventTreeDeath = true; } }); game.children.sort(function (a, b) { return (a.zIndex || 0) - (b.zIndex || 0); }); // Create and add the character var character = game.addChild(new Character()); character.x = centerX(); character.y = centerY(); // Menü konumunu ayarla menuContainer.y += 100; game.addChild(menuContainer); /**** * Helper Functions: Credits, Volume & Records ****/ function createCommonCloseElements(modalWidth, modalHeight) { var closeLabel = LK.getAsset('justX', { anchorX: 0.5, anchorY: 0.5, zIndex: 100000, x: -9, y: 6 }); var radius = 50; var closeButton = LK.getAsset('button_close', { anchorX: 0.5, anchorY: 0.5, width: radius * 2.3 * 1.2, height: radius * 2.3 * 1.2 }); closeButton.zIndex = 10000; closeButton.x = 0; closeButton.y = 0; closeButton.addChild(closeLabel); return closeButton; } function showCredits() { menuOpen = false; var creditsContainer = new Container(); creditsContainer.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(); creditsContainer.addChild(bg); var creditsText = new Text2("Game by\nMustafa Talha ŞEN", { fontFamily: "Arial", fontSize: 5000 * 1.03, fill: 0xffffff, align: "center" }); creditsText.anchorX = 0.5; creditsText.anchorY = 0.5; creditsText.x = centerX() - 359; creditsText.y = centerY() - 800 + 40; creditsText.scale.set(3, 3); creditsContainer.addChild(creditsText); game.addChild(creditsContainer); var closeButton = createCommonCloseElements(modalWidth, modalHeight); closeButton.x = bg.x + modalWidth / 2 - closeButton.width / 2 - 185; closeButton.y = bg.y - modalHeight / 2 + closeButton.height / 2 + 230; creditsContainer.addChild(closeButton); closeButton.on('down', function () { game.removeChild(creditsContainer); menuOpen = true; menuContainer.visible = true; }); } function showVolume() { menuOpen = false; var volumeContainer = new Container(); volumeContainer.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(); volumeContainer.addChild(bg); var currentMusicName = new Text2("Next Music", { fontFamily: "Arial", fontSize: 5000 * 1.103, fill: 0xffffff, align: "center" }); currentMusicName.anchorX = 0.5; currentMusicName.anchorY = 0.5; currentMusicName.x = centerX() - 250; currentMusicName.y = centerY() - 650 + 40 - 300 + 100; currentMusicName.scale.set(3, 3); volumeContainer.addChild(currentMusicName); var musicButton = LK.getAsset('Musicbutton', { anchorX: 0.5, anchorY: 0.5, x: centerX() - 280 + 250, y: centerY() - 350 + 40 - 150 }); musicButton.on('down', function () { playNextMusic(); }); volumeContainer.addChild(musicButton); game.addChild(volumeContainer); var closeButton = createCommonCloseElements(modalWidth, modalHeight); closeButton.x = bg.x + modalWidth / 2 - closeButton.width / 2 - 185; closeButton.y = bg.y - modalHeight / 2 + closeButton.height / 2 + 230; volumeContainer.addChild(closeButton); closeButton.on('down', function () { game.removeChild(volumeContainer); menuOpen = true; menuContainer.visible = true; }); } function showRecords() { menuOpen = false; var recordsContainer = new Container(); recordsContainer.zIndex = 300; var modalWidth = 1500, modalHeight = 2200; var bg = LK.getAsset('second_menu', { anchorX: 0.5, anchorY: 0.5, width: modalWidth, height: modalHeight, color: 0x000000 }); bg.x = centerX(); bg.y = centerY(); recordsContainer.addChild(bg); var recordsTextStr = "Top Scores:\n"; for (var i = 0; i < records.length; i++) { recordsTextStr += i + 1 + ". " + records[i].score + " (Attempt " + records[i].attempt + ")\n"; } if (records.length === 0) { recordsTextStr += "No records yet."; } recordsTextStr += "\nAttempts: " + records.length; recordsTextStr += "\nLast Score: " + lastScore; var recordsText = new Text2(recordsTextStr, { fontFamily: "Arial", fontSize: 5000 * 1.103, 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); game.addChild(recordsContainer); var closeButton = createCommonCloseElements(modalWidth, modalHeight); closeButton.x = bg.x + modalWidth / 2 - closeButton.width / 2 - 185; closeButton.y = bg.y - modalHeight / 2 + closeButton.height / 2 + 230; recordsContainer.addChild(closeButton); closeButton.on('down', function () { game.removeChild(recordsContainer); menuOpen = true; menuContainer.visible = true; }); } /**** * End Game & Reset Functions ****/ function playNextMusic() { musicCycle++; if (musicCycle === 1) { LK.stopMusic(); LK.playMusic(musicSequence[1]); } else if (musicCycle === 2) { LK.stopMusic(); LK.playMusic(musicSequence[2]); } else if (musicCycle === 3) { LK.stopMusic(); } else { musicCycle = 0; LK.stopMusic(); LK.playMusic(musicSequence[0]); } } var musicSequence = ['m_1', 'M_2', 'M_3']; var musicCycle = 0; LK.playMusic(musicSequence[0]); function endGame() { LK.effects.flashScreen(0xFF0000, 500); LK.getSound('deatheffect').play(); character.velocityY = character.jumpStrength; character.update = function () { if (gameOver) { character.velocityY += character.gravity; character.y += character.velocityY; if (character.y > groundY + character.height) { character.y = groundY + character.height; character.velocityY = 0; } } }; game.children.forEach(function (child) { if (child.velocityX) { child.velocityX = 0; } }); game.touchDisabled = true; lastScore = passCounter; records.push({ score: passCounter, attempt: records.length + 1 }); records.sort(function (a, b) { return b.score - a.score; }); if (records.length > 5) { records = records.slice(0, 5); } LK.setTimeout(function () { game.touchDisabled = false; menuOpen = true; menuContainer.visible = true; var startY = groundY + 100; var endY = centerY() - 1270; var animationDuration = 16.5 * 5 / 1.5; var startTime = Date.now(); function animateMenu() { var currentTime = Date.now(); var elapsedTime = currentTime - startTime; var progress = Math.min(elapsedTime / animationDuration, 1); menuContainer.y = startY + (endY - startY) * progress; if (progress < 1) { LK.setTimeout(animateMenu, 16); } } animateMenu(); }, 1700); LK.setTimeout(function () { resetGame(); }, 1750); } function resetGame() { if (gameOverText) { game.removeChild(gameOverText); gameOverText = null; } 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 = centerY(); background.x = centerX(); bg2.x = centerX() + 2807.2; background.velocityX = -3.6; bg2.velocityX = -3.6; bg2.scale.x = 1; gameStarted = false; gameOver = false; character.preventDeath = false; underscoreAsset.preventDeath = false; lastSpawner = null; passCounter = 0; underscoreTouchCount = 0; counterText.setText(passCounter); // Reset container'ların konumunu ve velocity değerlerini background3DContainer.y = 1040; bgEffect3DContainer.y = 1040; background3DContainer.velocityY = 0; bgEffect3DContainer.velocityY = 0; } /**** * Eliptik hit testi için yardımcı fonksiyon ****/ function checkEllipseHover(button, lx, ly) { var scaleFactorX = 1; var scaleFactorY = 0.53; var offsetY = 40; var dx = lx - button.x; var dy = ly - (button.y + offsetY); var rx = button.width / 2 * scaleFactorX; var ry = button.height / 2 * scaleFactorY; return dx * dx / (rx * rx) + dy * dy / (ry * ry) <= 1; } /**** * Fare hareketinde hover kontrolü ****/ game.move = function (x, y, obj) { if (!menuOpen) { return; } var localX = x - menuContainer.x; var localY = y - menuContainer.y; playButton.visible = checkEllipseHover(playButton, localX, localY); volumeButton.visible = checkEllipseHover(volumeButton, localX, localY); creditsButton.visible = checkEllipseHover(creditsButton, localX, localY); recordsButton.visible = checkEllipseHover(recordsButton, localX, localY); }; /**** * Touch Event ****/ game.down = function (x, y, obj) { if (menuOpen) { var localX = x - menuContainer.x; var localY = y - menuContainer.y; if (checkEllipseHover(playButton, localX, localY)) { var _animateMenu = function animateMenu() { var currentTime = Date.now(); var elapsedTime = currentTime - startTime; var progress = Math.min(elapsedTime / animationDuration, 1); menuContainer.y = startY + (endY - startY) * progress; if (progress < 1) { LK.setTimeout(_animateMenu, 1); } else { menuOpen = false; menuContainer.visible = false; gameWait = true; } }; var animationDuration = 16.5 * 5 * 2 / 1.5; var startTime = Date.now(); var startY = menuContainer.y; var endY = centerY() + 100; _animateMenu(); return; } else if (checkEllipseHover(volumeButton, localX, localY)) { showVolume(); } else if (checkEllipseHover(creditsButton, localX, localY)) { showCredits(); } else if (checkEllipseHover(recordsButton, localX, localY)) { showRecords(); } return; } else if (gameOver) { if (!game.touchDisabled) { menuOpen = true; menuContainer.visible = true; resetGame(); } } else { if (gameWait) { gameWait = false; gameStarted = true; var initialTube = new Tube(); game.addChild(initialTube); lastSpawner = initialTube; character.jump(); } else { character.jump(); character.rotation = 0.1; LK.setTimeout(function () { character.rotation = 0; }, 200); } } }; /**** * Game Loop ****/ game.update = function () { // Önce, diğer asset'lerin update'lerini çalıştırıyoruz: game.children.forEach(function (child) { if (child.update) { child.update(); } // Statik arka planlar (background, bg2) if (child === background || child === bg2) { if (!gameOver && !menuOpen && gameStarted) { child.x -= 7.2; } if (child.x < -2807.2 / 2) { child.x += 2807.2 * 2; } } // Karakter bağlı 3D arka plan ve efekt (horizontal scroll) if (child === background3DContainer || child === bgEffect3DContainer) { if (!gameOver && !menuOpen && gameStarted) { child.x -= containerScrollSpeed; } if (child.x < -2807.2 / 2) { child.x += 2807.2 * 2; } } }); // (Container'ların y konumları kendi update fonksiyonları tarafından gravity etkisiyle güncelleniyor) game.children.sort(function (a, b) { return (a.zIndex || 0) - (b.zIndex || 0); }); }; function unflipWorld() { if (!flipped) { return; } flipped = false; character.gravity = 0; character.jumpStrength = 0; zoomEffect(); LK.setTimeout(function () { character.gravity = 0.3; character.jumpStrength = -12; }, 300); background.scale.y *= -1; bg2.scale.y *= -1; sky.scale.y *= -1; groundAsset.scale.y *= -1; ground2Asset.scale.y *= -1; } function zoomEffect() { var originalScale = character.scale.x; character.scale.set(originalScale * 1.2); LK.setTimeout(function () { character.scale.set(originalScale); }, 300); } function flipWorld() { if (flipped) { return; } flipped = true; character.gravity = 0; character.jumpStrength = 0; zoomEffect(); LK.setTimeout(function () { character.gravity = 0.3; character.jumpStrength = -12; }, 300); background.scale.y *= -1; bg2.scale.y *= -1; sky.scale.y *= -1; groundAsset.scale.y *= -1; ground2Asset.scale.y *= -1; }
===================================================================
--- original.js
+++ change.js
@@ -233,8 +233,9 @@
var passCounter = 0;
var lastScore = 0;
var backgroundScrollSpeed = 7.2;
var underscoreTouchCount = 0;
+var containerScrollSpeed = 7.2; // Define containerScrollSpeed with a default value
var flipped = false;
function centerX() {
return 2048 / 2;
}