User prompt
the button to adjust volume has disappeared and the slider is too sensitive
User prompt
the volume slider is really glitchy fix that
User prompt
move the position of the volume slider to the bottom of the settings menu and shorten the length of the slider and round the edges of the slider
User prompt
add a volume slider to the settings menu and by default it is half way ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
lower the volume of the sounds
User prompt
add a warning message that pops up when you click the reset high score button, and the pop up menu is a confirm action to reset the high score
User prompt
make it so when ever the mouse is clicked little white particles come out of the mouse
User prompt
move the reset high score button below the settings button and center them both
User prompt
Please fix the bug: 'Cannot read properties of undefined (reading 'addChild')' in or related to this line: 'self.addChild(settingsButton);' Line Number: 673
User prompt
Please fix the bug: 'Cannot read properties of undefined (reading 'addChild')' in or related to this line: 'self.addChild(settingsButton);' Line Number: 673
User prompt
make a settings page where you can customize your paddle color and ball color ↪💡 Consider importing and using the following plugins: @upit/tween.v1, @upit/storage.v1
User prompt
name the title of the game Lava Bounce
User prompt
the title is moving down fix that
User prompt
make the lava rise a little bit
User prompt
make the title of the game move up and down a bit
User prompt
undo the lava riseing
User prompt
make the lava only rise just up until the paddles height but not touching the paddle
User prompt
make the lava rise and fall ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
i can still see the edges of the lava on the sides
User prompt
make sure that i can only see the lava on the bottom of the screen and that i never see the end of the lava
User prompt
make the lava animated
User prompt
undo that
User prompt
thats not what i ment make the top of the lava wavy
User prompt
make the lava have waves
User prompt
when each level starts have the text start in the middle and have it move to the top center
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1", { highScore: 0 }); /**** * Classes ****/ var Ball = Container.expand(function () { var self = Container.call(this); var ballGraphics = self.attachAsset('ball', { anchorX: 0.5, anchorY: 0.5 }); self.width = ballGraphics.width; self.height = ballGraphics.height; self.speedY = 3; self.speedX = 0; self.gravity = 0.1; self.maxSpeed = 10; self.reset = function () { self.x = 2048 / 2; self.y = 500; self.speedY = 3; self.speedX = Math.random() * 4 - 2; }; self.update = function () { // Apply gravity self.speedY += self.gravity; // Cap max speed if (self.speedY > self.maxSpeed) { self.speedY = self.maxSpeed; } // Update position self.x += self.speedX; self.y += self.speedY; // Bounce off walls if (self.x < self.width / 2) { self.x = self.width / 2; self.speedX = -self.speedX; } else if (self.x > 2048 - self.width / 2) { self.x = 2048 - self.width / 2; self.speedX = -self.speedX; } }; return self; }); var Confetti = Container.expand(function () { var self = Container.call(this); self.particles = []; self.colors = [0xFF0000, 0x00FF00, 0x0000FF, 0xFFFF00, 0xFF00FF, 0x00FFFF, 0xFFFFFF]; self.emit = function (x, y, count) { for (var i = 0; i < count; i++) { var particle = new Container(); var size = Math.random() * 20 + 10; var color = self.colors[Math.floor(Math.random() * self.colors.length)]; var particleGraphic = particle.attachAsset('ball', { anchorX: 0.5, anchorY: 0.5, scaleX: size / 40, scaleY: size / 40 }); particleGraphic.tint = color; particle.x = x; particle.y = y; particle.speedX = Math.random() * 20 - 10; particle.speedY = -Math.random() * 15 - 5; particle.rotationSpeed = (Math.random() - 0.5) * 0.2; particle.life = 60 + Math.random() * 60; particle.maxLife = particle.life; self.addChild(particle); self.particles.push(particle); } }; self.update = function () { for (var i = self.particles.length - 1; i >= 0; i--) { var particle = self.particles[i]; particle.x += particle.speedX; particle.y += particle.speedY; particle.speedY += 0.2; // Gravity particle.rotation += particle.rotationSpeed; particle.life--; particle.alpha = particle.life / particle.maxLife; if (particle.life <= 0) { self.removeChild(particle); self.particles.splice(i, 1); } } }; return self; }); var Lava = Container.expand(function () { var self = Container.call(this); var lavaGraphics = self.attachAsset('lava', { anchorX: 0.5, anchorY: 0.5 }); // Create a pulsing effect for the lava self.pulse = function () { tween(lavaGraphics, { alpha: 0.7 }, { duration: 800, easing: tween.easeInOut, onFinish: function onFinish() { tween(lavaGraphics, { alpha: 1 }, { duration: 800, easing: tween.easeInOut, onFinish: self.pulse }); } }); }; self.pulse(); return self; }); var Paddle = Container.expand(function () { var self = Container.call(this); // Create left rounded edge var paddleLeftGraphics = self.attachAsset('paddleLeft', { anchorX: 1.0, anchorY: 0.5, x: -170 }); // Create middle section var paddleMiddleGraphics = self.attachAsset('paddleMiddle', { anchorX: 0.5, anchorY: 0.5 }); // Create right rounded edge var paddleRightGraphics = self.attachAsset('paddleRight', { anchorX: 0.0, anchorY: 0.5, x: 170 }); // Adjust positions to eliminate gaps // The middle section's width is 340, and each end cap is 30 // We need to ensure they connect perfectly paddleLeftGraphics.x = -170 + 15; // Move right by half of end cap width paddleRightGraphics.x = 170 - 15; // Move left by half of end cap width // Set the overall width based on the combined elements self.width = 400; // total width (30 + 340 + 30) self.height = 30; return self; }); var ParticleSystem = Container.expand(function () { var self = Container.call(this); self.particles = []; self.maxParticles = 20; self.createParticle = function (x, y, color) { var particle = new Container(); var particleGraphic = particle.attachAsset('ball', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.3, scaleY: 0.3 }); particleGraphic.tint = color; particle.x = x; particle.y = y; particle.alpha = 1; particle.speedX = Math.random() * 10 - 5; particle.speedY = -Math.random() * 5 - 2; particle.life = 30; self.addChild(particle); self.particles.push(particle); return particle; }; self.update = function () { for (var i = self.particles.length - 1; i >= 0; i--) { var particle = self.particles[i]; particle.x += particle.speedX; particle.y += particle.speedY; particle.speedY += 0.1; particle.life--; particle.alpha = particle.life / 30; if (particle.life <= 0) { self.removeChild(particle); self.particles.splice(i, 1); } } }; self.emitAt = function (x, y, color, count) { for (var i = 0; i < count; i++) { self.createParticle(x, y, color); } }; return self; }); var StartMenu = Container.expand(function () { var self = Container.call(this); // Create title text var titleText = new Text2('Lava Drop!', { size: 200, fill: 0xFFBD00 }); titleText.anchor.set(0.5, 0.5); titleText.y = -300; self.addChild(titleText); // Create start button var startButton = new Container(); // Remove background asset but keep the text var buttonText = new Text2('PLAY', { size: 100, fill: 0xFFFFFF }); buttonText.anchor.set(0.5, 0.5); startButton.addChild(buttonText); startButton.interactive = true; startButton.y = 0; self.addChild(startButton); // High score display var highScoreText = new Text2('HIGH SCORE: 0', { size: 60, fill: 0xFFFFFF }); highScoreText.anchor.set(0.5, 0.5); highScoreText.y = 200; self.addChild(highScoreText); // Update high score display self.updateHighScore = function (score) { highScoreText.setText('HIGH SCORE: ' + score); }; // Handle button press startButton.down = function () { // Scale effect tween(startButton, { scaleX: 0.95, scaleY: 0.95 }, { duration: 100 }); }; // Handle button release startButton.up = function () { // Return to original scale with bounce tween(startButton, { scaleX: 1, scaleY: 1 }, { duration: 200, easing: tween.elasticOut, onFinish: function onFinish() { // Notify game that start was pressed if (self.onStart) { self.onStart(); } } }); }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x220000 }); /**** * Game Code ****/ // Sounds removed // Game state var gameActive = false; // Game variables var score = 0; var highScore = storage.highScore || 0; var level = 1; var hitsToNextLevel = 20; var difficulty = 1; var difficultyIncreaseTimer = null; var levelRequirement = 20; // Hits needed to complete each level // Create game objects var paddle = new Paddle(); var ball = new Ball(); var lava = new Lava(); var particles = new ParticleSystem(); var startMenu = new StartMenu(); // Initialize paddle position paddle.x = 2048 / 2; paddle.y = 2732 - 300; // Initialize ball position ball.reset(); // Initialize lava position (ensuring it stays within screen bounds) lava.x = 2048 / 2; lava.y = 2732 - 100; lava.minY = lava.height / 2; // Minimum Y position to prevent running off top edge lava.maxY = 2732 - lava.height / 2; // Maximum Y position to prevent running off bottom edge // Create confetti system for level celebrations var confetti = new Confetti(); // Position start menu in center of screen startMenu.x = 2048 / 2; startMenu.y = 2732 / 2; startMenu.updateHighScore(highScore); // Start menu callback startMenu.onStart = function () { startGame(); }; // Add a reset high score button to start menu var resetButton = new Container(); var resetText = new Text2('RESET HIGH SCORE', { size: 40, fill: 0xFFFFFF }); resetText.anchor.set(0.5, 0.5); resetButton.addChild(resetText); resetButton.interactive = true; resetButton.y = 300; startMenu.addChild(resetButton); // Handle reset button press resetButton.down = function () { tween(resetButton, { scaleX: 0.9, scaleY: 0.9 }, { duration: 100 }); }; // Handle reset button release resetButton.up = function () { tween(resetButton, { scaleX: 1, scaleY: 1 }, { duration: 200, easing: tween.elasticOut, onFinish: function onFinish() { // Reset high score to 0 highScore = 0; storage.highScore = 0; startMenu.updateHighScore(0); highScoreTxt.setText('High Score: 0'); } }); }; // Add start menu to game initially game.addChild(startMenu); // Function to start the game function startGame() { // Remove start menu game.removeChild(startMenu); // Add game objects game.addChild(paddle); game.addChild(ball); game.addChild(lava); game.addChild(particles); game.addChild(confetti); // Reset game state score = 0; level = 1; difficulty = 1; ball.reset(); // Music removed // Start difficulty timer if (difficultyIncreaseTimer) { LK.clearInterval(difficultyIncreaseTimer); } difficultyIncreaseTimer = LK.setInterval(increaseDifficulty, 10000); // Set game as active gameActive = true; // Make UI elements visible scoreTxt.visible = true; levelTxt.visible = true; progressTxt.visible = true; highScoreTxt.visible = true; // Show high score when game starts // Update UI updateScore(); levelTxt.setText('Level: ' + level); progressTxt.setText('0/' + levelRequirement); } // Function to return to menu function returnToMenu() { // Remove game objects game.removeChild(paddle); game.removeChild(ball); game.removeChild(lava); game.removeChild(particles); game.removeChild(confetti); // Update high score on menu startMenu.updateHighScore(highScore); // Add menu back game.addChild(startMenu); // Set game as inactive gameActive = false; // Hide UI elements scoreTxt.visible = false; levelTxt.visible = false; progressTxt.visible = false; } // Create score display var scoreTxt = new Text2('Score: 0', { size: 100, fill: 0xFFFFFF }); scoreTxt.anchor.set(0.5, 0.5); scoreTxt.y = 50; scoreTxt.visible = false; // Hide score initially // Create level display var levelTxt = new Text2('Level: 1', { size: 80, fill: 0x00FFFF }); levelTxt.anchor.set(0.5, 0); levelTxt.y = 150; levelTxt.visible = false; // Hide level initially // Create level progress display var progressTxt = new Text2('', { size: 50, fill: 0xFFFFFF }); progressTxt.anchor.set(0.5, 0); progressTxt.y = 30; progressTxt.visible = false; // Hide progress initially // Create high score display var highScoreTxt = new Text2('High Score: 0', { size: 80, fill: 0xFFBD00 }); highScoreTxt.anchor.set(1, 0); highScoreTxt.setText('High Score: ' + highScore); highScoreTxt.y = 70; highScoreTxt.visible = false; // Hide high score initially // Create game description at the bottom of the screen var descriptionTxt = new Text2('Keep the ball from falling into lava! Tap to move the paddle.', { size: 40, fill: 0xFFFFFF }); descriptionTxt.anchor.set(0.5, 1); descriptionTxt.y = -50; // Position from bottom LK.gui.bottom.addChild(descriptionTxt); // Fade out description after 5 seconds LK.setTimeout(function () { tween(descriptionTxt, { alpha: 0 }, { duration: 1000, easing: tween.easeOut }); }, 5000); LK.gui.topRight.addChild(highScoreTxt); LK.gui.center.addChild(scoreTxt); LK.gui.top.addChild(levelTxt); LK.gui.top.addChild(progressTxt); // Touch/drag handling for paddle movement var isDragging = false; game.down = function (x, y, obj) { isDragging = true; paddle.x = x; }; game.move = function (x, y, obj) { if (isDragging) { paddle.x = x; // Clamp paddle position to keep it within screen bounds if (paddle.x < paddle.width / 2) { paddle.x = paddle.width / 2; } else if (paddle.x > 2048 - paddle.width / 2) { paddle.x = 2048 - paddle.width / 2; } } }; game.up = function (x, y, obj) { isDragging = false; }; // Function to update score display function updateScore() { scoreTxt.setText(score.toString()); // Update progress to next level var progress = score % levelRequirement; var remaining = levelRequirement - progress; progressTxt.setText(progress + '/' + levelRequirement); // Check for level completion if (progress === 0 && score > 0) { // Level up! level = Math.floor(score / levelRequirement) + 1; levelTxt.setText('Level: ' + level); // Celebrate level completion celebrateNewLevel(); // Increase difficulty with each level difficulty = 1 + (level - 1) * 0.3; if (difficulty > 3) { difficulty = 3; } // Update game properties based on new difficulty ball.gravity = 0.2 * difficulty; ball.maxSpeed = 15 * difficulty; } // Update high score if current score is higher if (score > highScore) { highScore = score; storage.highScore = highScore; highScoreTxt.setText('High Score: ' + highScore); } } // Function to celebrate new level function celebrateNewLevel() { // Show celebratory text var celebrationText = new Text2('LEVEL ' + level + '!', { size: 150, fill: 0xFFFF00 }); celebrationText.anchor.set(0.5, 0.5); // Add to center first LK.gui.center.addChild(celebrationText); // Make text appear with scale animation celebrationText.scale.set(0.1); tween(celebrationText, { scaleX: 1.2, scaleY: 1.2 }, { duration: 500, easing: tween.elasticOut, onFinish: function onFinish() { tween(celebrationText, { scaleX: 1, scaleY: 1 }, { duration: 200, onFinish: function onFinish() { // Move text from center to top LK.setTimeout(function () { // Get the current position to animate from var startPos = celebrationText.y; // Animate moving to the top tween(celebrationText, { y: -celebrationText.height, // Move upward scaleX: 0.6, scaleY: 0.6 }, { duration: 800, easing: tween.easeInOut, onFinish: function onFinish() { // When animation completes, remove from center and add to top LK.gui.center.removeChild(celebrationText); LK.gui.top.addChild(celebrationText); // Reset position for top GUI celebrationText.y = 120; // Fade out after being at the top for a moment LK.setTimeout(function () { tween(celebrationText, { alpha: 0 }, { duration: 500, onFinish: function onFinish() { LK.gui.top.removeChild(celebrationText); } }); }, 1000); } }); }, 1000); } }); } }); // Create confetti bursts for (var i = 0; i < 5; i++) { LK.setTimeout(function () { // Create multiple confetti bursts across screen confetti.emit(Math.random() * 2048, 500, 30); }, i * 200); } // Flash screen for celebration LK.effects.flashScreen(0x00FFFF, 300); // Sounds and music removed } // Function to increase difficulty over time function increaseDifficulty() { difficulty += 0.1; // Cap maximum difficulty if (difficulty > 2) { difficulty = 2; LK.clearInterval(difficultyIncreaseTimer); } // Update ball properties based on difficulty ball.gravity = 0.1 * difficulty; ball.maxSpeed = 10 * difficulty; // Music adjustment removed } // Start difficulty increase timer difficultyIncreaseTimer = LK.setInterval(increaseDifficulty, 10000); // Music will be played when game starts // Not playing background music initially to allow menu to be silent // Game update loop game.update = function () { // If game is not active, only update menu elements if (!gameActive) { return; } // Update ball position ball.update(); // Check for collision with paddle if (ball.speedY > 0 && ball.y + ball.height / 2 >= paddle.y - paddle.height / 2 && ball.y - ball.height / 2 <= paddle.y + paddle.height / 2 && ball.x + ball.width / 2 >= paddle.x - paddle.width / 2 && ball.x - ball.width / 2 <= paddle.x + paddle.width / 2) { // Bounce the ball in a random direction when it hits the paddle var angle = Math.random() * Math.PI * 0.7 - Math.PI * 0.35; // Random angle between -35 and +35 degrees var speed = Math.sqrt(ball.speedX * ball.speedX + ball.speedY * ball.speedY) * 1.5; // Keep overall speed but increase by 1.5x ball.speedY = -Math.cos(angle) * speed; // Vertical component (mostly upward) ball.speedX = Math.sin(angle) * speed; // Horizontal component // Add additional horizontal velocity based on where the ball hit the paddle var hitPosition = (ball.x - paddle.x) / (paddle.width / 2); ball.speedX += hitPosition * 5; // Add some influence from hit position, but less than before // Flash paddle to indicate hit LK.effects.flashObject(paddle, 0xffffff, 200); // Emit particles at collision point particles.emitAt(ball.x, paddle.y - paddle.height / 2, 0xffbd00, 15); // Add scale animation to paddle for bounce feedback tween(paddle, { scaleY: 0.7, y: paddle.y + 10 }, { duration: 100, easing: tween.easeOut, onFinish: function onFinish() { tween(paddle, { scaleY: 1, y: 2732 - 300 }, { duration: 150, easing: tween.elasticOut }); } }); // Play bounce sound when ball hits paddle LK.getSound('bounce').play(); // Increment score score++; updateScore(); } // Check if ball touches lava if (ball.y + ball.height / 2 >= lava.y - lava.height / 2) { // Sounds removed // Flash screen red LK.effects.flashScreen(0xff0000, 500); // Create lava splash effect particles.emitAt(ball.x, lava.y - lava.height / 2, 0xff3300, 30); // Make lava "jump" but ensure it stays within screen boundaries tween(lava, { scaleY: 1.2, y: Math.max(lava.height / 2, lava.y - 20) // Prevent going above screen }, { duration: 200, easing: tween.easeOut, onFinish: function onFinish() { tween(lava, { scaleY: 1, y: 2732 - 100 // Reset to original position }, { duration: 300, easing: tween.elasticOut }); } }); // Return to menu after a delay LK.setTimeout(function () { returnToMenu(); }, 1500); // Set game as inactive gameActive = false; // Reset score and level score = 0; level = 1; levelTxt.setText('Level: ' + level); progressTxt.setText('0/' + levelRequirement); updateScore(); // Reset ball ball.reset(); // Reset difficulty difficulty = 1; ball.gravity = 0.2; ball.maxSpeed = 15; // Restart difficulty increase timer LK.clearInterval(difficultyIncreaseTimer); difficultyIncreaseTimer = LK.setInterval(increaseDifficulty, 10000); // Music removed } // If ball goes too high, change direction if (ball.y < 100) { ball.speedY = Math.abs(ball.speedY) * 0.5; } // Update particles particles.update(); // Update confetti confetti.update(); };
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1", {
highScore: 0
});
/****
* Classes
****/
var Ball = Container.expand(function () {
var self = Container.call(this);
var ballGraphics = self.attachAsset('ball', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = ballGraphics.width;
self.height = ballGraphics.height;
self.speedY = 3;
self.speedX = 0;
self.gravity = 0.1;
self.maxSpeed = 10;
self.reset = function () {
self.x = 2048 / 2;
self.y = 500;
self.speedY = 3;
self.speedX = Math.random() * 4 - 2;
};
self.update = function () {
// Apply gravity
self.speedY += self.gravity;
// Cap max speed
if (self.speedY > self.maxSpeed) {
self.speedY = self.maxSpeed;
}
// Update position
self.x += self.speedX;
self.y += self.speedY;
// Bounce off walls
if (self.x < self.width / 2) {
self.x = self.width / 2;
self.speedX = -self.speedX;
} else if (self.x > 2048 - self.width / 2) {
self.x = 2048 - self.width / 2;
self.speedX = -self.speedX;
}
};
return self;
});
var Confetti = Container.expand(function () {
var self = Container.call(this);
self.particles = [];
self.colors = [0xFF0000, 0x00FF00, 0x0000FF, 0xFFFF00, 0xFF00FF, 0x00FFFF, 0xFFFFFF];
self.emit = function (x, y, count) {
for (var i = 0; i < count; i++) {
var particle = new Container();
var size = Math.random() * 20 + 10;
var color = self.colors[Math.floor(Math.random() * self.colors.length)];
var particleGraphic = particle.attachAsset('ball', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: size / 40,
scaleY: size / 40
});
particleGraphic.tint = color;
particle.x = x;
particle.y = y;
particle.speedX = Math.random() * 20 - 10;
particle.speedY = -Math.random() * 15 - 5;
particle.rotationSpeed = (Math.random() - 0.5) * 0.2;
particle.life = 60 + Math.random() * 60;
particle.maxLife = particle.life;
self.addChild(particle);
self.particles.push(particle);
}
};
self.update = function () {
for (var i = self.particles.length - 1; i >= 0; i--) {
var particle = self.particles[i];
particle.x += particle.speedX;
particle.y += particle.speedY;
particle.speedY += 0.2; // Gravity
particle.rotation += particle.rotationSpeed;
particle.life--;
particle.alpha = particle.life / particle.maxLife;
if (particle.life <= 0) {
self.removeChild(particle);
self.particles.splice(i, 1);
}
}
};
return self;
});
var Lava = Container.expand(function () {
var self = Container.call(this);
var lavaGraphics = self.attachAsset('lava', {
anchorX: 0.5,
anchorY: 0.5
});
// Create a pulsing effect for the lava
self.pulse = function () {
tween(lavaGraphics, {
alpha: 0.7
}, {
duration: 800,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(lavaGraphics, {
alpha: 1
}, {
duration: 800,
easing: tween.easeInOut,
onFinish: self.pulse
});
}
});
};
self.pulse();
return self;
});
var Paddle = Container.expand(function () {
var self = Container.call(this);
// Create left rounded edge
var paddleLeftGraphics = self.attachAsset('paddleLeft', {
anchorX: 1.0,
anchorY: 0.5,
x: -170
});
// Create middle section
var paddleMiddleGraphics = self.attachAsset('paddleMiddle', {
anchorX: 0.5,
anchorY: 0.5
});
// Create right rounded edge
var paddleRightGraphics = self.attachAsset('paddleRight', {
anchorX: 0.0,
anchorY: 0.5,
x: 170
});
// Adjust positions to eliminate gaps
// The middle section's width is 340, and each end cap is 30
// We need to ensure they connect perfectly
paddleLeftGraphics.x = -170 + 15; // Move right by half of end cap width
paddleRightGraphics.x = 170 - 15; // Move left by half of end cap width
// Set the overall width based on the combined elements
self.width = 400; // total width (30 + 340 + 30)
self.height = 30;
return self;
});
var ParticleSystem = Container.expand(function () {
var self = Container.call(this);
self.particles = [];
self.maxParticles = 20;
self.createParticle = function (x, y, color) {
var particle = new Container();
var particleGraphic = particle.attachAsset('ball', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.3,
scaleY: 0.3
});
particleGraphic.tint = color;
particle.x = x;
particle.y = y;
particle.alpha = 1;
particle.speedX = Math.random() * 10 - 5;
particle.speedY = -Math.random() * 5 - 2;
particle.life = 30;
self.addChild(particle);
self.particles.push(particle);
return particle;
};
self.update = function () {
for (var i = self.particles.length - 1; i >= 0; i--) {
var particle = self.particles[i];
particle.x += particle.speedX;
particle.y += particle.speedY;
particle.speedY += 0.1;
particle.life--;
particle.alpha = particle.life / 30;
if (particle.life <= 0) {
self.removeChild(particle);
self.particles.splice(i, 1);
}
}
};
self.emitAt = function (x, y, color, count) {
for (var i = 0; i < count; i++) {
self.createParticle(x, y, color);
}
};
return self;
});
var StartMenu = Container.expand(function () {
var self = Container.call(this);
// Create title text
var titleText = new Text2('Lava Drop!', {
size: 200,
fill: 0xFFBD00
});
titleText.anchor.set(0.5, 0.5);
titleText.y = -300;
self.addChild(titleText);
// Create start button
var startButton = new Container();
// Remove background asset but keep the text
var buttonText = new Text2('PLAY', {
size: 100,
fill: 0xFFFFFF
});
buttonText.anchor.set(0.5, 0.5);
startButton.addChild(buttonText);
startButton.interactive = true;
startButton.y = 0;
self.addChild(startButton);
// High score display
var highScoreText = new Text2('HIGH SCORE: 0', {
size: 60,
fill: 0xFFFFFF
});
highScoreText.anchor.set(0.5, 0.5);
highScoreText.y = 200;
self.addChild(highScoreText);
// Update high score display
self.updateHighScore = function (score) {
highScoreText.setText('HIGH SCORE: ' + score);
};
// Handle button press
startButton.down = function () {
// Scale effect
tween(startButton, {
scaleX: 0.95,
scaleY: 0.95
}, {
duration: 100
});
};
// Handle button release
startButton.up = function () {
// Return to original scale with bounce
tween(startButton, {
scaleX: 1,
scaleY: 1
}, {
duration: 200,
easing: tween.elasticOut,
onFinish: function onFinish() {
// Notify game that start was pressed
if (self.onStart) {
self.onStart();
}
}
});
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x220000
});
/****
* Game Code
****/
// Sounds removed
// Game state
var gameActive = false;
// Game variables
var score = 0;
var highScore = storage.highScore || 0;
var level = 1;
var hitsToNextLevel = 20;
var difficulty = 1;
var difficultyIncreaseTimer = null;
var levelRequirement = 20; // Hits needed to complete each level
// Create game objects
var paddle = new Paddle();
var ball = new Ball();
var lava = new Lava();
var particles = new ParticleSystem();
var startMenu = new StartMenu();
// Initialize paddle position
paddle.x = 2048 / 2;
paddle.y = 2732 - 300;
// Initialize ball position
ball.reset();
// Initialize lava position (ensuring it stays within screen bounds)
lava.x = 2048 / 2;
lava.y = 2732 - 100;
lava.minY = lava.height / 2; // Minimum Y position to prevent running off top edge
lava.maxY = 2732 - lava.height / 2; // Maximum Y position to prevent running off bottom edge
// Create confetti system for level celebrations
var confetti = new Confetti();
// Position start menu in center of screen
startMenu.x = 2048 / 2;
startMenu.y = 2732 / 2;
startMenu.updateHighScore(highScore);
// Start menu callback
startMenu.onStart = function () {
startGame();
};
// Add a reset high score button to start menu
var resetButton = new Container();
var resetText = new Text2('RESET HIGH SCORE', {
size: 40,
fill: 0xFFFFFF
});
resetText.anchor.set(0.5, 0.5);
resetButton.addChild(resetText);
resetButton.interactive = true;
resetButton.y = 300;
startMenu.addChild(resetButton);
// Handle reset button press
resetButton.down = function () {
tween(resetButton, {
scaleX: 0.9,
scaleY: 0.9
}, {
duration: 100
});
};
// Handle reset button release
resetButton.up = function () {
tween(resetButton, {
scaleX: 1,
scaleY: 1
}, {
duration: 200,
easing: tween.elasticOut,
onFinish: function onFinish() {
// Reset high score to 0
highScore = 0;
storage.highScore = 0;
startMenu.updateHighScore(0);
highScoreTxt.setText('High Score: 0');
}
});
};
// Add start menu to game initially
game.addChild(startMenu);
// Function to start the game
function startGame() {
// Remove start menu
game.removeChild(startMenu);
// Add game objects
game.addChild(paddle);
game.addChild(ball);
game.addChild(lava);
game.addChild(particles);
game.addChild(confetti);
// Reset game state
score = 0;
level = 1;
difficulty = 1;
ball.reset();
// Music removed
// Start difficulty timer
if (difficultyIncreaseTimer) {
LK.clearInterval(difficultyIncreaseTimer);
}
difficultyIncreaseTimer = LK.setInterval(increaseDifficulty, 10000);
// Set game as active
gameActive = true;
// Make UI elements visible
scoreTxt.visible = true;
levelTxt.visible = true;
progressTxt.visible = true;
highScoreTxt.visible = true; // Show high score when game starts
// Update UI
updateScore();
levelTxt.setText('Level: ' + level);
progressTxt.setText('0/' + levelRequirement);
}
// Function to return to menu
function returnToMenu() {
// Remove game objects
game.removeChild(paddle);
game.removeChild(ball);
game.removeChild(lava);
game.removeChild(particles);
game.removeChild(confetti);
// Update high score on menu
startMenu.updateHighScore(highScore);
// Add menu back
game.addChild(startMenu);
// Set game as inactive
gameActive = false;
// Hide UI elements
scoreTxt.visible = false;
levelTxt.visible = false;
progressTxt.visible = false;
}
// Create score display
var scoreTxt = new Text2('Score: 0', {
size: 100,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0.5);
scoreTxt.y = 50;
scoreTxt.visible = false; // Hide score initially
// Create level display
var levelTxt = new Text2('Level: 1', {
size: 80,
fill: 0x00FFFF
});
levelTxt.anchor.set(0.5, 0);
levelTxt.y = 150;
levelTxt.visible = false; // Hide level initially
// Create level progress display
var progressTxt = new Text2('', {
size: 50,
fill: 0xFFFFFF
});
progressTxt.anchor.set(0.5, 0);
progressTxt.y = 30;
progressTxt.visible = false; // Hide progress initially
// Create high score display
var highScoreTxt = new Text2('High Score: 0', {
size: 80,
fill: 0xFFBD00
});
highScoreTxt.anchor.set(1, 0);
highScoreTxt.setText('High Score: ' + highScore);
highScoreTxt.y = 70;
highScoreTxt.visible = false; // Hide high score initially
// Create game description at the bottom of the screen
var descriptionTxt = new Text2('Keep the ball from falling into lava! Tap to move the paddle.', {
size: 40,
fill: 0xFFFFFF
});
descriptionTxt.anchor.set(0.5, 1);
descriptionTxt.y = -50; // Position from bottom
LK.gui.bottom.addChild(descriptionTxt);
// Fade out description after 5 seconds
LK.setTimeout(function () {
tween(descriptionTxt, {
alpha: 0
}, {
duration: 1000,
easing: tween.easeOut
});
}, 5000);
LK.gui.topRight.addChild(highScoreTxt);
LK.gui.center.addChild(scoreTxt);
LK.gui.top.addChild(levelTxt);
LK.gui.top.addChild(progressTxt);
// Touch/drag handling for paddle movement
var isDragging = false;
game.down = function (x, y, obj) {
isDragging = true;
paddle.x = x;
};
game.move = function (x, y, obj) {
if (isDragging) {
paddle.x = x;
// Clamp paddle position to keep it within screen bounds
if (paddle.x < paddle.width / 2) {
paddle.x = paddle.width / 2;
} else if (paddle.x > 2048 - paddle.width / 2) {
paddle.x = 2048 - paddle.width / 2;
}
}
};
game.up = function (x, y, obj) {
isDragging = false;
};
// Function to update score display
function updateScore() {
scoreTxt.setText(score.toString());
// Update progress to next level
var progress = score % levelRequirement;
var remaining = levelRequirement - progress;
progressTxt.setText(progress + '/' + levelRequirement);
// Check for level completion
if (progress === 0 && score > 0) {
// Level up!
level = Math.floor(score / levelRequirement) + 1;
levelTxt.setText('Level: ' + level);
// Celebrate level completion
celebrateNewLevel();
// Increase difficulty with each level
difficulty = 1 + (level - 1) * 0.3;
if (difficulty > 3) {
difficulty = 3;
}
// Update game properties based on new difficulty
ball.gravity = 0.2 * difficulty;
ball.maxSpeed = 15 * difficulty;
}
// Update high score if current score is higher
if (score > highScore) {
highScore = score;
storage.highScore = highScore;
highScoreTxt.setText('High Score: ' + highScore);
}
}
// Function to celebrate new level
function celebrateNewLevel() {
// Show celebratory text
var celebrationText = new Text2('LEVEL ' + level + '!', {
size: 150,
fill: 0xFFFF00
});
celebrationText.anchor.set(0.5, 0.5);
// Add to center first
LK.gui.center.addChild(celebrationText);
// Make text appear with scale animation
celebrationText.scale.set(0.1);
tween(celebrationText, {
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 500,
easing: tween.elasticOut,
onFinish: function onFinish() {
tween(celebrationText, {
scaleX: 1,
scaleY: 1
}, {
duration: 200,
onFinish: function onFinish() {
// Move text from center to top
LK.setTimeout(function () {
// Get the current position to animate from
var startPos = celebrationText.y;
// Animate moving to the top
tween(celebrationText, {
y: -celebrationText.height,
// Move upward
scaleX: 0.6,
scaleY: 0.6
}, {
duration: 800,
easing: tween.easeInOut,
onFinish: function onFinish() {
// When animation completes, remove from center and add to top
LK.gui.center.removeChild(celebrationText);
LK.gui.top.addChild(celebrationText);
// Reset position for top GUI
celebrationText.y = 120;
// Fade out after being at the top for a moment
LK.setTimeout(function () {
tween(celebrationText, {
alpha: 0
}, {
duration: 500,
onFinish: function onFinish() {
LK.gui.top.removeChild(celebrationText);
}
});
}, 1000);
}
});
}, 1000);
}
});
}
});
// Create confetti bursts
for (var i = 0; i < 5; i++) {
LK.setTimeout(function () {
// Create multiple confetti bursts across screen
confetti.emit(Math.random() * 2048, 500, 30);
}, i * 200);
}
// Flash screen for celebration
LK.effects.flashScreen(0x00FFFF, 300);
// Sounds and music removed
}
// Function to increase difficulty over time
function increaseDifficulty() {
difficulty += 0.1;
// Cap maximum difficulty
if (difficulty > 2) {
difficulty = 2;
LK.clearInterval(difficultyIncreaseTimer);
}
// Update ball properties based on difficulty
ball.gravity = 0.1 * difficulty;
ball.maxSpeed = 10 * difficulty;
// Music adjustment removed
}
// Start difficulty increase timer
difficultyIncreaseTimer = LK.setInterval(increaseDifficulty, 10000);
// Music will be played when game starts
// Not playing background music initially to allow menu to be silent
// Game update loop
game.update = function () {
// If game is not active, only update menu elements
if (!gameActive) {
return;
}
// Update ball position
ball.update();
// Check for collision with paddle
if (ball.speedY > 0 && ball.y + ball.height / 2 >= paddle.y - paddle.height / 2 && ball.y - ball.height / 2 <= paddle.y + paddle.height / 2 && ball.x + ball.width / 2 >= paddle.x - paddle.width / 2 && ball.x - ball.width / 2 <= paddle.x + paddle.width / 2) {
// Bounce the ball in a random direction when it hits the paddle
var angle = Math.random() * Math.PI * 0.7 - Math.PI * 0.35; // Random angle between -35 and +35 degrees
var speed = Math.sqrt(ball.speedX * ball.speedX + ball.speedY * ball.speedY) * 1.5; // Keep overall speed but increase by 1.5x
ball.speedY = -Math.cos(angle) * speed; // Vertical component (mostly upward)
ball.speedX = Math.sin(angle) * speed; // Horizontal component
// Add additional horizontal velocity based on where the ball hit the paddle
var hitPosition = (ball.x - paddle.x) / (paddle.width / 2);
ball.speedX += hitPosition * 5; // Add some influence from hit position, but less than before
// Flash paddle to indicate hit
LK.effects.flashObject(paddle, 0xffffff, 200);
// Emit particles at collision point
particles.emitAt(ball.x, paddle.y - paddle.height / 2, 0xffbd00, 15);
// Add scale animation to paddle for bounce feedback
tween(paddle, {
scaleY: 0.7,
y: paddle.y + 10
}, {
duration: 100,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(paddle, {
scaleY: 1,
y: 2732 - 300
}, {
duration: 150,
easing: tween.elasticOut
});
}
});
// Play bounce sound when ball hits paddle
LK.getSound('bounce').play();
// Increment score
score++;
updateScore();
}
// Check if ball touches lava
if (ball.y + ball.height / 2 >= lava.y - lava.height / 2) {
// Sounds removed
// Flash screen red
LK.effects.flashScreen(0xff0000, 500);
// Create lava splash effect
particles.emitAt(ball.x, lava.y - lava.height / 2, 0xff3300, 30);
// Make lava "jump" but ensure it stays within screen boundaries
tween(lava, {
scaleY: 1.2,
y: Math.max(lava.height / 2, lava.y - 20) // Prevent going above screen
}, {
duration: 200,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(lava, {
scaleY: 1,
y: 2732 - 100 // Reset to original position
}, {
duration: 300,
easing: tween.elasticOut
});
}
});
// Return to menu after a delay
LK.setTimeout(function () {
returnToMenu();
}, 1500);
// Set game as inactive
gameActive = false;
// Reset score and level
score = 0;
level = 1;
levelTxt.setText('Level: ' + level);
progressTxt.setText('0/' + levelRequirement);
updateScore();
// Reset ball
ball.reset();
// Reset difficulty
difficulty = 1;
ball.gravity = 0.2;
ball.maxSpeed = 15;
// Restart difficulty increase timer
LK.clearInterval(difficultyIncreaseTimer);
difficultyIncreaseTimer = LK.setInterval(increaseDifficulty, 10000);
// Music removed
}
// If ball goes too high, change direction
if (ball.y < 100) {
ball.speedY = Math.abs(ball.speedY) * 0.5;
}
// Update particles
particles.update();
// Update confetti
confetti.update();
};