Code edit (3 edits merged)
Please save this source code
User prompt
when isReturningToBase ,platformNext.x should not go below 2048-platformNext.width
User prompt
prevent stick to grow mare than 2048-stick.x-100
Code edit (1 edits merged)
Please save this source code
User prompt
revert platformMinWidth calculation : wider on first levelrs, thiner on high levels
User prompt
now add a ratio to make minimum width depend on the level (larger for first levels, then more and more thin)
User prompt
now add a ratio to make width depend on the level (larger for first levels, then more and more thin)
User prompt
use them handleNinjaReachPlatform
User prompt
create global variables for platformMinWidth and platformMaxWidth
Code edit (2 edits merged)
Please save this source code
User prompt
in game.update when isReturningToBase, ensure platformNext.x don't go below platformTarget.x+200
User prompt
make the ninjaappear behind the platforms
Code edit (4 edits merged)
Please save this source code
User prompt
make the stick appear behind the platforms
User prompt
make the stick appear behind the platforms
User prompt
when the stick fall end play stickTapSound
Code edit (1 edits merged)
Please save this source code
Code edit (9 edits merged)
Please save this source code
User prompt
no, declare the variables in globale scope, and init the objects in gameinitialize
User prompt
move background and startbutton init in gameinitialize, kee the variables global
User prompt
call gameinitalize
User prompt
add a function named'gameInitialize()'
User prompt
Please fix the bug: 'InternalError: too much recursion' in or related to this line: 'gameInitialize();' Line Number: 105
User prompt
move all initialization code in a function named'gameInitialize()'
Code edit (1 edits merged)
Please save this source code
/**** * Classes ****/ //<Assets used in the game will automatically appear here> // Ninja class var Ninja = Container.expand(function () { var self = Container.call(this); self.ninjaStand = self.attachAsset('ninja', { anchorX: 0.5, anchorY: 1.0 }); self.ninjaRun = self.attachAsset('ninjaRun', { anchorX: 0.5, anchorY: 1.0 }); self.ninjaRun.visible = false; // Initially hide the running ninja graphic self.runSoundPlaying = false; // Flag to track if run sound is playing self.update = function () { if (isNinjaMoving && !isStickFalling && ninja.x + ninja.width / 2 < stick.x + stick.length) { self.ninjaStand.visible = false; self.ninjaRun.visible = true; if (!self.runSoundPlaying) { LK.getSound('runSound').play(); self.runSoundPlaying = true; } } else { if (self.runSoundPlaying) { LK.getSound('runSound').stop(); self.runSoundPlaying = false; } self.ninjaStand.visible = true; self.ninjaRun.visible = false; self.runSoundPlaying = false; } }; }); // Platform class var Platform = Container.expand(function () { var self = Container.call(this); var platformGraphics = self.attachAsset('platform', { anchorX: 0.5, anchorY: 1.0 }); platformGraphics.width = platformGraphics.width / 2; // Reduce the width of the platform self.tint = Math.random() * 0xFFFFFF; // Apply a random tint for debugging self.update = function () { // Platform update logic }; }); var StartButton = Container.expand(function () { var self = Container.call(this); var buttonGraphics2 = self.attachAsset('startButton', { anchorX: 0.5, anchorY: 0.5, x: 20, y: 20, tint: 0x333333, alpha: 0.75 }); var buttonGraphics = self.attachAsset('startButton', { anchorX: 0.5, anchorY: 0.5 }); }); // Stick class var Stick = Container.expand(function () { var self = Container.call(this); var stickGraphics = self.attachAsset('stick', { anchorX: 0.5, anchorY: 1.0 }); self.length = 0; self.update = function () { // Stick update logic }; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x87CEEB // Init game with sky blue background }); /**** * Game Code ****/ // Initialize game variables var groundOffset = 2732 + 25; var ninja; var stick; var platformCurrent; var platformTarget; var platformNext; var isStickGrowing = false; var isReturningToBase = false; var isStickFalling = false; var isNinjaMoving = false; var isGameStarted = false; // Flag to indicate the start of the game var legsOffset = 50; var score = 0; var foreground1; var foreground2; var midground1; var midground2; var fallSoundPlayed = false; // Flag to ensure fall sound is played only once var background; var startButton; var scoreTxt; var basePlatformX = 300; var NINJA_MOVEMENT_SPEED = -5; function gameInitialize() { // Initialize game variables groundOffset = 2732 + 25; ninja = null; stick = null; platformCurrent = null; platformTarget = null; platformNext = null; isStickGrowing = false; isReturningToBase = false; isStickFalling = false; isNinjaMoving = false; isGameStarted = false; // Flag to indicate the start of the game legsOffset = 50; score = 0; foreground1 = null; foreground2 = null; midground1 = null; midground2 = null; fallSoundPlayed = false; // Flag to ensure fall sound is played only once // Add background image background = LK.getAsset('background', { anchorX: 0.5, anchorY: 0.5, x: 2048 / 2, y: 2732 / 2 }); game.addChild(background); startButton = new StartButton(); startButton.x = 2048 / 2; startButton.y = 2732 / 2; game.addChild(startButton); // Create and display the score text at the top of the screen with drop shadow scoreTxt = new Text2(LK.getScore(), { size: 300, fill: "#ffffff", stroke: "#000000", strokeThickness: 10, dropShadow: true, dropShadowColor: "#000000", dropShadowBlur: 4, dropShadowDistance: 6, weight: 1000 }); scoreTxt.anchor.set(0.5, 0); // Center the score text horizontally, anchor point set at the middle of its top edge. scoreTxt.x = 2048 / 2; // Center horizontally scoreTxt.y = 50; // Position near the top scoreTxt.visible = false; game.addChild(scoreTxt); } // Start the game function startGame() { // Background is already added in the initial game setup fallSoundPlayed = false; // Reset the flag when the game starts ninja = new Ninja(); // Initialize the ninja object ninja.runSoundPlaying = false; // Reset the run sound flag when the game starts // Add midground images to create an infinite horizontal midground midground1 = LK.getAsset('midground', { anchorX: 0.5, anchorY: 1.0, x: 2048 / 2, y: 2732 }); game.addChild(midground1); midground2 = LK.getAsset('midground', { anchorX: 0.5, anchorY: 1.0, x: 2048 + 2048 / 2, y: 2732, scaleX: -1 }); game.addChild(midground2); createInitialPlatforms(); if (platformCurrent) { ninja.x = platformCurrent.x; ninja.y = platformCurrent.y - platformCurrent.height + 20; // Adjusted y-coordinate to ensure ninja is visible on the first hill with an offset of 20 } else { console.error("platformCurrent is not defined"); } game.addChild(ninja); stick = new Stick(); stick.length = 0; // Set initial stick length to zero stick.height = stick.length; stick.x = platformCurrent.x + platformCurrent.width / 2 - 30; // Set stick to the right edge of the platform with an offset of -30 stick.y = platformCurrent.y - platformCurrent.height + 20; // Adjusted y-coordinate to ensure stick is on the platform with an offset of 20 game.addChildAt(stick, game.children.indexOf(platformCurrent)); // Add foreground images to create an infinite horizontal foreground foreground1 = LK.getAsset('foreground', { anchorX: 0.5, anchorY: 1.0, x: 2048 / 2, y: 2732 }); game.addChild(foreground1); foreground2 = LK.getAsset('foreground', { anchorX: 0.5, anchorY: 1.0, x: 2048 + 2048 / 2, y: 2732, scaleX: -1 }); game.addChild(foreground2); // Play background music every 10 seconds LK.getSound('bgMusic').play(); LK.setInterval(function () { LK.getSound('bgMusic').play(); }, 10000); } function handleNinjaReachPlatform() { console.log("Start of handleNinjaReachPlatform"); console.log("platformCurrent.x:", platformCurrent.x); console.log("platformTarget.x:", platformTarget.x); console.log("platformNext.x:", platformNext.x); isNinjaMoving = false; isReturningToBase = true; // Remove the first platform from the game and the platforms array platformCurrent.visible = false; var tempPlatform = platformCurrent; platformCurrent = platformTarget; platformTarget = platformNext; platformNext = tempPlatform; LK.setScore(LK.getScore() + 1); scoreTxt.setText(LK.getScore()); // Update score text stick.length = 0; stick.height = 0; stick.rotation = 0; stick.x = platformCurrent.x + platformCurrent.width / 2 - 30; // Set stick to the right edge of the current platform with an offset of -30 stick.y = platformCurrent.y - platformCurrent.height + 20; // Adjusted y-coordinate to ensure stick is on the platform with an offset of 20 var minDistance = 200; var maxDistance = 400; var distance = Math.floor(Math.random() * (maxDistance - minDistance + 1)) + minDistance; platformNext.x = 2048 + distance; //platformTarget.x + platformTarget.width / 2 + distance; platformNext.y = 2732; // Adjusted y-coordinate to touch the ground platformNext.width = Math.floor(Math.random() * (400 - 100 + 1)) + 100; // Randomize width between 100 and 400 platformNext.visible = true; platformNext.speedRatio = 1 + Math.random(); console.log("End of handleNinjaReachPlatform"); console.log("platformCurrent.x:", platformCurrent.x); console.log("platformTarget.x:", platformTarget.x); console.log("platformNext.x:", platformNext.x); } function handleNinjaFall() { // If the stick does not reach the next platform or exceeds it, make the ninja fall ninja.y += 20; if (ninja.runSoundPlaying) { LK.getSound('runSound').stop(); ninja.runSoundPlaying = false; } ninja.ninjaStand.rotation = Math.PI; // Rotate the ninja by 180 degrees if (!fallSoundPlayed) { LK.getSound('fallSound').play(); fallSoundPlayed = true; // Set the flag to true after playing the sound if (ninja.runSoundPlaying) { LK.getSound('runSound').stop(); ninja.runSoundPlaying = false; } } if (ninja.y > 2732 && isNinjaMoving) { // If ninja falls off the screen if (ninja.runSoundPlaying) { LK.getSound('runSound').stop(); ninja.runSoundPlaying = false; } LK.showGameOver(); } } function handleNinjaAfterStick() { console.log("Passed the stick", "Run= " + ninja.ninjaRun.visible, "Stand= " + ninja.ninjaStand.visible); // If the ninja has walked to the end of the stick if (platformTarget && isNinjaMoving) { var ninjaMinX = ninja.x - ninja.width / 2 + legsOffset; var ninjaMaxX = ninja.x + ninja.width / 2 - legsOffset; var platformMinX = platformTarget.x - platformTarget.width / 2; var platformMaxX = platformTarget.x + platformTarget.width / 2; if (ninjaMaxX < platformMinX || ninjaMinX > platformMaxX) { handleNinjaFall(); } else { handleNinjaReachPlatform(); // If the stick reaches the next platform, stop the ninja and reset the stick /*if (platformTarget.x - platformTarget.width / 2 <= 300 ) { handleNinjaReachPlatform(); }*/ } } } function moveNinja() { console.log("Moving...", "ninja.x= " + ninja.x, "stick.x= " + (stick.x + stick.length)); handleBackgroundMovement(); // Shift platforms, ninja, and stick to the left if (isNinjaMoving) { platformCurrent.x += NINJA_MOVEMENT_SPEED; platformTarget.x += NINJA_MOVEMENT_SPEED; platformNext.x += NINJA_MOVEMENT_SPEED; ninja.x += NINJA_MOVEMENT_SPEED; stick.x += NINJA_MOVEMENT_SPEED; } // Make the ninja walk on the stick if (ninja.x < stick.x + stick.length) { ninja.x += 10; } else { handleNinjaAfterStick(); } } function fallStick() { stick.rotation += 0.1; if (stick.rotation >= Math.PI / 2) { LK.getSound('stickTapSound').play(); stick.rotation = Math.PI / 2; isStickFalling = false; isNinjaMoving = true; } } function growStick() { stick.length += 10; stick.height = stick.length; } function handleBackgroundMovement() { // Move midground images to the left midground1.x -= 7; midground2.x -= 7; // Move foreground images to the left foreground1.x -= 10; foreground2.x -= 10; // Reset midground position to create an infinite scrolling effect if (midground1.x + 2048 / 2 < 0) { midground1.x = midground2.x + 2048; } if (midground2.x + 2048 / 2 < 0) { midground2.x = midground1.x + 2048; } // Reset foreground position to create an infinite scrolling effect if (foreground1.x + 2048 / 2 < 0) { foreground1.x = foreground2.x + 2048; } if (foreground2.x + 2048 / 2 < 0) { foreground2.x = foreground1.x + 2048; } } // Create initial platforms function createInitialPlatforms() { var platform1 = new Platform(); platform1.x = basePlatformX; platform1.y = groundOffset; // Adjusted y-coordinate to touch the ground platform1.width = Math.floor(Math.random() * (400 - 100 + 1)) + 100; // Randomize width between 100 and 400 game.addChild(platform1); platformCurrent = platform1; var platform2 = new Platform(); var minDistance = 200; var maxDistance = 400; var distance = Math.floor(Math.random() * (maxDistance - minDistance + 1)) + minDistance; platform2.x = platform1.x + platform1.width + distance; platform2.y = groundOffset; // Adjusted y-coordinate to touch the ground platform2.width = Math.floor(Math.random() * (400 - 100 + 1)) + 100; // Randomize width between 100 and 400 game.addChild(platform2); platformTarget = platform2; var platform3 = new Platform(); platform3.x = platform2.x + platform2.width + distance; // Position the third platform outside the screen platform3.y = groundOffset; // Adjusted y-coordinate to touch the ground platform3.width = Math.floor(Math.random() * (400 - 100 + 1)) + 100; // Randomize width between 100 and 400 game.addChild(platform3); platformNext = platform3; } // Handle touch down event game.down = function (x, y, obj) { if (!isGameStarted) { startButton.visible = false; scoreTxt.visible = true; isGameStarted = true; startGame(); } else if (!isStickGrowing && !isStickFalling && !isNinjaMoving) { isStickGrowing = true; } }; // Handle touch up event game.up = function (x, y, obj) { if (isStickGrowing && !isNinjaMoving) { isStickGrowing = false; isStickFalling = true; } }; // Update game logic game.update = function () { if (isStickGrowing) { growStick(); } if (ninja) { ninja.update(); } if (isStickFalling && !isNinjaMoving) { fallStick(); } if (isNinjaMoving) { moveNinja(); } if (isReturningToBase) { var distanceToMove = basePlatformX - platformCurrent.x; var moveSpeed = 10; // Adjust the speed as needed if (Math.abs(distanceToMove) <= moveSpeed) { // If the distance to move is less than or equal to the move speed, snap to position platformCurrent.x = basePlatformX; platformTarget.x += distanceToMove; platformNext.x += distanceToMove; ninja.x += distanceToMove; stick.x += distanceToMove; isReturningToBase = false; // Stop moving objects } else { // Move objects towards the base position platformCurrent.x += moveSpeed * Math.sign(distanceToMove); platformTarget.x += moveSpeed * Math.sign(distanceToMove); platformNext.x += moveSpeed * Math.sign(distanceToMove) * (platformNext.speedRatio || 1); ninja.x += moveSpeed * Math.sign(distanceToMove); stick.x += moveSpeed * Math.sign(distanceToMove); } } }; // Call gameInitialize function gameInitialize();
===================================================================
--- original.js
+++ change.js
@@ -193,9 +193,9 @@
stick.length = 0; // Set initial stick length to zero
stick.height = stick.length;
stick.x = platformCurrent.x + platformCurrent.width / 2 - 30; // Set stick to the right edge of the platform with an offset of -30
stick.y = platformCurrent.y - platformCurrent.height + 20; // Adjusted y-coordinate to ensure stick is on the platform with an offset of 20
- game.addChild(stick);
+ game.addChildAt(stick, game.children.indexOf(platformCurrent));
// Add foreground images to create an infinite horizontal foreground
foreground1 = LK.getAsset('foreground', {
anchorX: 0.5,
anchorY: 1.0,