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());
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());
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 = 210; // 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++;
}
};
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
});
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
****/
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());
var lives = midgroundContainer.addChild(new Lives());
lives.x = game.width / 2 - 250;
lives.y = 2400; // 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
}
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 - 1160;
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
}
life.update();
};
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.