User prompt
add a looping background music
User prompt
if the player taps the screen while the frog is in the jumping state, the background slide animation is reset, which is a bug. disable the background slide animation while the player is in the air
User prompt
if the player taps the screen while the frog is in the jumping state, the background slide animation is reset, which is a bug. disable the background slide animation while the player is in the air
User prompt
also disable the jump sound if the player taps while the player is i nthe jumping state. only play that sound when the tap is released after a charging is complete
User prompt
disable the taping while the player is in the jumping state, since that only consumes life, since the player can't jump durign that stage. also disable the backgrounds movement during that phase, so if the player taps whilethe player is in mid air, the background should not move either
User prompt
The Life sound doesn't play when the life is collected, ensure it works
User prompt
when the moving life is collected play the Life song
User prompt
when the player lands back on the ground after a jump, play the Land sound
User prompt
if the player successfully managed to collect the moving life from the first jump, add a temporary 6th life to the 5 already existing ones, and remove it as soon as the players hits back the ground. so that means that instead of removing the 5th life as intended, you would remove this 6th temporary one
User prompt
when collecting the Moving life that restores a life, instead of instantly adding it to the UI, wait for the player to first land on the ground to do the check. first check if a life is deducted since the player jumped, and after do the check if the player also collected the moving life. if so, these 2 should neutralize each other, effectively not deducting the life intended for doing a jump. this means that the life refills happens at the same exact moment a life would be deducted, which is when the player lands back on the ground. so never instantly refill the life UI after collecting the moving life, instead wait for the player to land back on the ground
User prompt
when collecting the Moving life that restores a life, instead of instantly adding it to the UI, wait for the player to first land on the ground to do the check. first check if a life is deducted since the player jumped, and after do the check if the player also collected the moving life. if so, these 2 should neutralize each other, effectively not deducting the life intended for doing a jump
User prompt
when collecting the Moving life that restores a life, instead of instantly adding it to the UI, wait for the player to first land on the ground to do the check
Code edit (10 edits merged)
Please save this source code
User prompt
move the score 50 pixels lower
User prompt
when a coin is collected play the Eat sound
Code edit (1 edits merged)
Please save this source code
/**** * Classes ****/ // Define the BackgroundContainer class var BackgroundContainer = Container.expand(function () { var self = Container.call(this); return self; }); // Define the Left Coin class var Coin = Container.expand(function () { var self = Container.call(this); var coinGraphics = self.attachAsset('coin', { anchorX: 0.5, anchorY: 0.5, scaleX: -1 // Flip the X axis }); self.speed = 10; self.update = function () { self.x += self.speed; self.y += Math.sin(LK.ticks / 4) * 8; // Add shake effect if (self.intersects(player)) { LK.setScore(LK.getScore() + 1); scoreText.setText(LK.getScore()); LK.getSound('Eat').play(); // Play the Eat sound self.destroy(); } else if (self.x > 2048 + self.width) { self.destroy(); } }; return self; }); // Define the Right Coins class var CoinLeft = Container.expand(function () { var self = Container.call(this); var coinGraphics = self.attachAsset('coin', { anchorX: 0.5, anchorY: 0.5, scaleX: +1 // Flip the X axis }); self.speed = -10; self.update = function () { self.x += self.speed; self.y += Math.sin(LK.ticks / 4) * 8; // Add shake effect if (self.intersects(player)) { LK.setScore(LK.getScore() + 1); scoreText.setText(LK.getScore()); LK.getSound('Eat').play(); // Play the Eat sound self.destroy(); } else if (self.x < -self.width) { self.destroy(); } }; return self; }); // Define the ForegroundContainer class var ForegroundContainer = Container.expand(function () { var self = Container.call(this); return self; }); // Define the Life class var Life = Container.expand(function () { var self = Container.call(this); var lifeGraphics = self.attachAsset('Life', { anchorX: 0.5, anchorY: 0.5 }); self.direction = 1; // 1 for right, -1 for left self.speed = 4; self.x = lifeGraphics.width / 2 + 500; // Position at left edge of the screen self.y = 260; // Lower y position self.update = function () { self.x += self.speed * self.direction; // Check if life's edge has reached the edge of the screen if (self.x + lifeGraphics.width / 2 >= 2048 - 500 || self.x - lifeGraphics.width / 2 <= 500) { self.direction *= -1; // Change direction } }; return self; }); // Define the Lives class var Lives = Container.expand(function () { var self = Container.call(this); self.lives = 5; // Start with 5 lives self.livesGraphics = []; // Array to hold the life graphics // Create 5 life graphics and add them to the livesGraphics array for (var i = 0; i < self.lives; i++) { var lifeGraphic = LK.getAsset('Life', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.8, scaleY: 0.8, x: i * 120 // Position each life graphic 130 pixels apart }); self.addChild(lifeGraphic); self.livesGraphics.push(lifeGraphic); } // Method to deduct a life self.deductLife = function () { if (self.lives > 0) { self.lives--; // Turn the deducted life graphic black self.livesGraphics[self.lives].tint = 0x000000; if (self.lives === 0) { LK.showGameOver(); } } }; // Method to refill a life self.refillLife = function () { if (self.lives < 5) { // Turn the refilled life graphic back to its original color self.livesGraphics[self.lives].tint = 0xFFFFFF; self.lives++; } else if (self.lives === 5) { // Add a temporary 6th life var tempLifeGraphic = LK.getAsset('Life', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.8, scaleY: 0.8, x: self.lives * 120 // Position the temporary life graphic }); self.addChild(tempLifeGraphic); self.livesGraphics.push(tempLifeGraphic); self.lives++; } }; return self; }); // Define the MidgroundContainer class var MidgroundContainer = Container.expand(function () { var self = Container.call(this); return self; }); //<Assets used in the game will automatically appear here> // Define the Player class var Player = Container.expand(function () { var self = Container.call(this); var playerGraphics = self.attachAsset('player', { anchorX: 0.5, anchorY: 1.0 }); self.velocityY = 0; self.isJumping = false; self.isInAir = false; self.jumpStartTime = 0; self.jumpCharge = 0; self.update = function () { if (self.isJumping) { self.jumpCharge = Math.min(60, LK.ticks - self.jumpStartTime); } else { self.velocityY += 1; // Gravity if (self.jumpCharge > 0) { self.velocityY = -Math.max(25, self.jumpCharge * 1.3); // Multiply the jump charge by 2 to increase the jump height, with a minimum jump height of 10 self.jumpCharge = 0; } } self.y += self.velocityY; // Slide the background down when the player jumps if (self.velocityY < 0) { backgroundContainer.y = Math.max(initialBackgroundY - self.jumpCharge * 0.3, backgroundContainer.y - self.velocityY * 0.3); } else if (self.velocityY > 0) { backgroundContainer.y = Math.max(initialBackgroundY, backgroundContainer.y - self.velocityY); } // Check if player's top edge has reached the top of the screen if (self.y - playerGraphics.height <= 0) { LK.showGameOver(); } // Prevent player from falling below the ground if (self.y > 2940 - playerGraphics.height) { self.y = 2940 - playerGraphics.height; self.velocityY = 0; self.isOnGround = true; if (self.isInAir) { self.isInAir = false; self.removeChildren(); // Remove all children (including player_jump asset) self.attachAsset('player', { anchorX: 0.5, anchorY: 1.0 }); LK.getSound('Land').play(); // Play the Land sound if (lives.lives === 6) { // Remove the temporary 6th life lives.livesGraphics[5].destroy(); lives.livesGraphics.pop(); lives.lives--; } else { lives.deductLife(); // Deduct a life when the player returns to the ground } } } else { self.isOnGround = false; } // Add a shake effect to the player when the jump is being charged if (self.shake) { self.x += Math.sin(LK.ticks / 1) * 3; } }; self.startJump = function () { if (self.isOnGround) { self.isJumping = true; self.jumpStartTime = LK.ticks; } }; self.endJump = function () { self.isJumping = false; self.isInAir = true; // Smoothly slide the background back up to its original position var slideUpInterval = LK.setInterval(function () { if (backgroundContainer.y < initialBackgroundY) { backgroundContainer.y += 10; // Adjust the speed as needed } else { LK.clearInterval(slideUpInterval); backgroundContainer.y = initialBackgroundY; // Ensure it snaps to the exact position } }, 16); // Approximately 60 FPS self.removeChildren(); // Remove all children (including player asset) self.attachAsset('player_jump', { anchorX: 0.5, anchorY: 1.0 }); }; return self; }); // Define the Spawner class var Spawner = Container.expand(function (spawnRate, y) { var self = Container.call(this); self.spawnRate = spawnRate; self.y = y; self.spawnTimer = 0; self.update = function () { self.spawnTimer++; if (self.spawnTimer >= self.spawnRate) { var coin = game.addChild(new Coin()); coin.x = -50; coin.y = self.y; self.spawnTimer = 0; } }; return self; }); // Define the SpawnerLeft class var SpawnerLeft = Container.expand(function (spawnRate, y) { var self = Container.call(this); self.spawnRate = spawnRate; self.y = y; self.spawnTimer = 0; self.update = function () { self.spawnTimer++; if (self.spawnTimer >= self.spawnRate) { var coin = game.addChild(new CoinLeft()); coin.x = 2098; coin.y = self.y; self.spawnTimer = 0; } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x77c3fa // Sky blue background }); /**** * Game Code ****/ LK.playMusic('backgroundMusic', { loop: true }); var backgroundContainer = game.addChild(new BackgroundContainer()); var initialBackgroundY = backgroundContainer.y; // Store initial background position var backgroundImage = LK.getAsset('background', { anchorX: 0.0, anchorY: 0.0, scaleX: 1, scaleY: 1, x: 0, y: 0 }); backgroundContainer.addChild(backgroundImage); var midgroundContainer = game.addChild(new MidgroundContainer()); var foregroundContainer = game.addChild(new ForegroundContainer()); var player = foregroundContainer.addChild(new Player()); player.collectedLifeOnFirstJump = false; var lives = midgroundContainer.addChild(new Lives()); lives.x = game.width / 2 - 235; lives.y = 70; // Position the lives system in the center of the screen game.update = function () { player.update(); life.update(); // Update the spawners on the right side of the screen for (var i = 0; i < spawnersLeft.length; i++) { spawnersLeft[i].update(); } // Update the spawners for (var i = 0; i < spawners.length; i++) { spawners[i].update(); } if (player.intersects(life)) { life.destroy(); life = game.addChild(new Life()); lives.refillLife(); // Refill a life when the player collects the moving Life LK.getSound('Life').play(); // Play the Life sound if (player.isOnGround) { player.collectedLifeOnFirstJump = true; } } life.update(); }; // Create and add score text to the midground container var scoreText = new Text2('0', { size: 200, fill: "#ffffff", stroke: "#000000", strokeThickness: 15, anchorX: 0.5, anchorY: 0.5 }); scoreText.x = game.width / 2; scoreText.y = game.height / 2 - 1110; scoreText.anchor.set(0.5, 0.5); midgroundContainer.addChild(scoreText); var life = foregroundContainer.addChild(new Life()); player.x = 2048 / 2; player.y = 2732 - player.height; // Create the spawners var spawners = []; for (var i = 0; i < 5; i++) { var spawner = foregroundContainer.addChild(new Spawner(40 * (i + 1), 2732 / 7 * i + 500)); spawners.push(spawner); } // Create the spawners on the right side of the screen var spawnersLeft = []; for (var i = 0; i < 5; i++) { var spawner = foregroundContainer.addChild(new SpawnerLeft(60 * (i + 1), 2732 / 7 * i + 700)); spawnersLeft.push(spawner); } game.down = function (x, y, obj) { if (!player.isInAir) { player.startJump(); LK.getSound('Charge').play(); player.shake = true; } }; game.up = function (x, y, obj) { player.endJump(); LK.getSound('Charge').stop(); LK.getSound('Jump').play(); player.shake = false; }; game.update = function () { player.update(); life.update(); // Update the spawners on the right side of the screen for (var i = 0; i < spawnersLeft.length; i++) { spawnersLeft[i].update(); } // Update the spawners for (var i = 0; i < spawners.length; i++) { spawners[i].update(); } if (player.intersects(life)) { life.destroy(); life = game.addChild(new Life()); lives.refillLife(); // Refill a life when the player collects the moving Life LK.getSound('Life').play(); // Play the Life sound } life.update(); };
===================================================================
--- original.js
+++ change.js
@@ -156,11 +156,11 @@
}
}
self.y += self.velocityY;
// Slide the background down when the player jumps
- if (self.velocityY < 0 && !self.isInAir) {
+ if (self.velocityY < 0) {
backgroundContainer.y = Math.max(initialBackgroundY - self.jumpCharge * 0.3, backgroundContainer.y - self.velocityY * 0.3);
- } else if (self.velocityY > 0 && !self.isInAir) {
+ } else if (self.velocityY > 0) {
backgroundContainer.y = Math.max(initialBackgroundY, backgroundContainer.y - self.velocityY);
}
// Check if player's top edge has reached the top of the screen
if (self.y - playerGraphics.height <= 0) {
@@ -198,16 +198,14 @@
};
self.startJump = function () {
if (self.isOnGround) {
self.isJumping = true;
- self.isInAir = true;
- self.isInAir = true;
self.jumpStartTime = LK.ticks;
}
};
self.endJump = function () {
self.isJumping = false;
- self.isInAir = false;
+ self.isInAir = true;
// Smoothly slide the background back up to its original position
var slideUpInterval = LK.setInterval(function () {
if (backgroundContainer.y < initialBackgroundY) {
backgroundContainer.y += 10; // Adjust the speed as needed
@@ -268,8 +266,11 @@
/****
* Game Code
****/
+LK.playMusic('backgroundMusic', {
+ loop: true
+});
var backgroundContainer = game.addChild(new BackgroundContainer());
var initialBackgroundY = backgroundContainer.y; // Store initial background position
var backgroundImage = LK.getAsset('background', {
anchorX: 0.0,
pixelated 8-bit cute sitting frog seen from the front. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
pixelated 8-bit cute jumping frog seen from the front. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
background of a pond in the middle of the nature. pixelated 8-bit. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.