/**** * 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.1; 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 background ve bg2'ye de jump etkisi uyguluyoruz: background.velocityY = background.jumpStrength; bg2.velocityY = bg2.jumpStrength; background3DContainer.velocityY = background3DContainer.jumpStrength; 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 > objectSpawnThreshold && self.x <= objectSpawnThreshold) { self.spawned = true; var newTube = new Tube(); newTube.x = 2048 + 640; 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: 285, //{1C} // 5% thinner height: bottomHeight, flipY: false }); self.topTube = self.attachAsset('tube', { anchorX: 0.5, anchorY: 0.5, width: 285, //{1I} // 5% thinner 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 > objectSpawnThreshold && self.x <= objectSpawnThreshold) { self.spawned = true; var newTree = new Tree(); newTree.x = 2048 + 640; 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 containerScrollSpeed = 5; // Tanımlandı var underscoreTouchCount = 0; var flipped = false; function centerX() { return 2048 / 2; } function centerY() { return groundY / 2; } var objectSpawnThreshold = centerX() + (screenRight - centerX()) / 2; // Örnek container oluşturuluyor var myContainer = new Container(); myContainer.x = centerX(); // Ekranın yatay ortasında myContainer.y = 1900; // Başlangıçta y = 2000 (örneğin en üst sınır) // Sabit yukarı doğru hareket hızı (update fonksiyonunda uygulanacak) var containerUpwardSpeed = -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 yukarı doğru hareket et if (gameStarted) { this.y += containerUpwardSpeed; // Minimum y sınırını 100 olarak ayarlıyoruz if (this.y < 100) { this.y = 100; } } }; // 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 > 2600) { this.y = 2600; } }); // Oluşturulan container'ı oyuna ekleyelim game.addChild(myContainer); 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; background.velocityY = 0; background.gravity = 0.033; // 0'a çok yakın bir değer background.jumpStrength = 0.66; // 0'dan daha uzak ama azıcık 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.033; bg2.jumpStrength = 0.66; 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); if (passCounter > 9) { counterText.x = 1315 - 25; // Move 25 pixels to the left } else { counterText.x = 1315; // Reset to original position } } // Karakter bağlı 3D arka plan ve efekt – başlangıçta container y = 2400 (en alt sınır) 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 * 0.178; //0.6 Ay atmosferi benzeri yer çekimi background3DContainer.jumpStrength = 2.15; // Daha hafif yer çekimi için zıplama kuvveti background3DContainer.isInverted = false; background3DContainer.addChild(background3D); background3DContainer.x = centerX(); // Başlangıçta container'lar en altta (2400) background3DContainer.y = 2350; // Container update: oyun başladığında gravity uygulanır, ve y değeri 2000 ile 2400 arasında clamp edilir. background3DContainer.update = function () { if (!gameStarted) { return; } this.velocityY -= this.gravity; this.y += this.velocityY; this.y = Math.max(1900, Math.min(this.y, 2900)); }; 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 * 0.178; //0.6 Ay atmosferi benzeri yer çekimi bgEffect3DContainer.jumpStrength = 2.15; // Daha hafif yer çekimi için zıplama kuvveti bgEffect3DContainer.isInverted = false; bgEffect3DContainer.addChild(bgEffect3D); bgEffect3DContainer.x = background3DContainer.x + 2807; bgEffect3DContainer.y = 2350; bgEffect3DContainer.update = function () { if (!gameStarted) { return; } this.velocityY -= this.gravity; this.y += this.velocityY; this.y = Math.max(1900, Math.min(this.y, 2900)); }; game.addChild(bgEffect3DContainer); var underscoreAsset = LK.getAsset('_', { anchorX: 0.5, anchorY: 0.5, x: centerX() + 1000, y: centerY() - 1500 // Moved 500 pixels up }); 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; } if (child === background || child === bg2) { LK.setTimeout(function () { child.velocityY = 0; }, 300); } }); 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(); 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 background3DContainer.y = 2350; bgEffect3DContainer.y = 2350; 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 () { game.children.forEach(function (child) { if (child.update) { child.update(); } if (child === background || child === bg2) { if (!gameOver && !menuOpen && gameStarted) { child.x -= 3.0; child.velocityY -= child.gravity; child.y += child.velocityY; } if (child.x < -2807.2 / 2) { child.x += 2807.2 * 2; } } if (child === background3DContainer || child === bgEffect3DContainer) { if (!gameOver && !menuOpen && gameStarted) { child.x -= containerScrollSpeed * 1.2; } if (child.x < -2807.2 / 2) { child.x += 2807.2 * 2; } } }); 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; }
/****
* 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.1;
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 background ve bg2'ye de jump etkisi uyguluyoruz:
background.velocityY = background.jumpStrength;
bg2.velocityY = bg2.jumpStrength;
background3DContainer.velocityY = background3DContainer.jumpStrength;
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 > objectSpawnThreshold && self.x <= objectSpawnThreshold) {
self.spawned = true;
var newTube = new Tube();
newTube.x = 2048 + 640;
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: 285,
//{1C} // 5% thinner
height: bottomHeight,
flipY: false
});
self.topTube = self.attachAsset('tube', {
anchorX: 0.5,
anchorY: 0.5,
width: 285,
//{1I} // 5% thinner
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 > objectSpawnThreshold && self.x <= objectSpawnThreshold) {
self.spawned = true;
var newTree = new Tree();
newTree.x = 2048 + 640;
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 containerScrollSpeed = 5; // Tanımlandı
var underscoreTouchCount = 0;
var flipped = false;
function centerX() {
return 2048 / 2;
}
function centerY() {
return groundY / 2;
}
var objectSpawnThreshold = centerX() + (screenRight - centerX()) / 2;
// Örnek container oluşturuluyor
var myContainer = new Container();
myContainer.x = centerX(); // Ekranın yatay ortasında
myContainer.y = 1900; // Başlangıçta y = 2000 (örneğin en üst sınır)
// Sabit yukarı doğru hareket hızı (update fonksiyonunda uygulanacak)
var containerUpwardSpeed = -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 yukarı doğru hareket et
if (gameStarted) {
this.y += containerUpwardSpeed;
// Minimum y sınırını 100 olarak ayarlıyoruz
if (this.y < 100) {
this.y = 100;
}
}
};
// 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 > 2600) {
this.y = 2600;
}
});
// Oluşturulan container'ı oyuna ekleyelim
game.addChild(myContainer);
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;
background.velocityY = 0;
background.gravity = 0.033; // 0'a çok yakın bir değer
background.jumpStrength = 0.66; // 0'dan daha uzak ama azıcık
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.033;
bg2.jumpStrength = 0.66;
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);
if (passCounter > 9) {
counterText.x = 1315 - 25; // Move 25 pixels to the left
} else {
counterText.x = 1315; // Reset to original position
}
}
// Karakter bağlı 3D arka plan ve efekt – başlangıçta container y = 2400 (en alt sınır)
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 * 0.178; //0.6 Ay atmosferi benzeri yer çekimi
background3DContainer.jumpStrength = 2.15; // Daha hafif yer çekimi için zıplama kuvveti
background3DContainer.isInverted = false;
background3DContainer.addChild(background3D);
background3DContainer.x = centerX();
// Başlangıçta container'lar en altta (2400)
background3DContainer.y = 2350;
// Container update: oyun başladığında gravity uygulanır, ve y değeri 2000 ile 2400 arasında clamp edilir.
background3DContainer.update = function () {
if (!gameStarted) {
return;
}
this.velocityY -= this.gravity;
this.y += this.velocityY;
this.y = Math.max(1900, Math.min(this.y, 2900));
};
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 * 0.178; //0.6 Ay atmosferi benzeri yer çekimi
bgEffect3DContainer.jumpStrength = 2.15; // Daha hafif yer çekimi için zıplama kuvveti
bgEffect3DContainer.isInverted = false;
bgEffect3DContainer.addChild(bgEffect3D);
bgEffect3DContainer.x = background3DContainer.x + 2807;
bgEffect3DContainer.y = 2350;
bgEffect3DContainer.update = function () {
if (!gameStarted) {
return;
}
this.velocityY -= this.gravity;
this.y += this.velocityY;
this.y = Math.max(1900, Math.min(this.y, 2900));
};
game.addChild(bgEffect3DContainer);
var underscoreAsset = LK.getAsset('_', {
anchorX: 0.5,
anchorY: 0.5,
x: centerX() + 1000,
y: centerY() - 1500 // Moved 500 pixels up
});
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;
}
if (child === background || child === bg2) {
LK.setTimeout(function () {
child.velocityY = 0;
}, 300);
}
});
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();
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
background3DContainer.y = 2350;
bgEffect3DContainer.y = 2350;
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 () {
game.children.forEach(function (child) {
if (child.update) {
child.update();
}
if (child === background || child === bg2) {
if (!gameOver && !menuOpen && gameStarted) {
child.x -= 3.0;
child.velocityY -= child.gravity;
child.y += child.velocityY;
}
if (child.x < -2807.2 / 2) {
child.x += 2807.2 * 2;
}
}
if (child === background3DContainer || child === bgEffect3DContainer) {
if (!gameOver && !menuOpen && gameStarted) {
child.x -= containerScrollSpeed * 1.2;
}
if (child.x < -2807.2 / 2) {
child.x += 2807.2 * 2;
}
}
});
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;
}