User prompt
Add background music
User prompt
Display correct best score to the main screen
User prompt
Fix the scoreboard
User prompt
Fix the best score board it showing 1000
User prompt
Add final score to tha best scoreboard
User prompt
Show highest score
User prompt
Add highest score in best score
User prompt
Fix the high score display
User prompt
Fix bestScoreText display to safely access highScores array
User prompt
Please fix the bug: 'Cannot read properties of undefined (reading '0')' in or related to this line: 'bestScoreText.setText('BEST: ' + highScores[0]);' Line Number: 528 โช๐ก Consider importing and using the following plugins: @upit/storage.v1
User prompt
Please fix the bug: 'closeButton.attachAsset is not a function' in or related to this line: 'var buttonBg = closeButton.attachAsset('soundOff', {' Line Number: 390
User prompt
Enhance the Scoreboard class with better high score display
User prompt
Add highest score display on game over โช๐ก Consider importing and using the following plugins: @upit/storage.v1
User prompt
Please fix the bug: 'TypeError: Cannot read properties of undefined (reading 'stringify')' in or related to this line: 'if (oldHighScores && highScores) {' Line Number: 565
User prompt
Please fix the bug: 'TypeError: Cannot read properties of undefined (reading 'stringify')' in or related to this line: 'if (oldHighScores && highScores && JSON.stringify(oldHighScores) !== JSON.stringify(highScores)) {' Line Number: 565
User prompt
Please fix the bug: 'TypeError: Cannot read properties of undefined (reading 'stringify')' in or related to this line: 'if (JSON.stringify(oldHighScores) !== JSON.stringify(highScores)) {' Line Number: 565
User prompt
Import storage plugin to save and retrieve high scoresInitialize highScores from storage with fallback values โ Save high scores to storage when game is over โ Add highest score display on game over โ Show notification if player achieved high score on game over โช๐ก Consider importing and using the following plugins: @upit/storage.v1
User prompt
Add diferent type of mob
User prompt
When game was over show the highest score โช๐ก Consider importing and using the following plugins: @upit/storage.v1
User prompt
Increase the speed of enemy
User prompt
Increase speed of player so player can jump Easily over enemy
User prompt
Little bit more increase speed of player
User prompt
Little bit increase speed of player
User prompt
Little bit increase jump height
User prompt
Decrease the spawn rate of enemy
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ // Define a class for scrolling background var Background = Container.expand(function () { var self = Container.call(this); // Create two background images for continuous scrolling var bg1 = self.attachAsset('background', { anchorX: 0, anchorY: 0 }); var bg2 = self.attachAsset('background', { anchorX: 0, anchorY: 0 }); // Position the second background right after the first one bg2.x = bg1.width; self.speed = 2; // Scrolling speed // Track positions for animation self.update = function () { // Move both backgrounds to the left bg1.x -= self.speed; bg2.x -= self.speed; // When the first background moves completely off-screen to the left if (bg1.x <= -bg1.width) { bg1.x = bg2.x + bg2.width; } // When the second background moves completely off-screen to the left if (bg2.x <= -bg2.width) { bg2.x = bg1.x + bg1.width; } }; return self; }); // Define a class for enemies var Enemy = Container.expand(function () { var self = Container.call(this); var enemyGraphics = self.attachAsset('enemy', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 5; self.type = Math.floor(Math.random() * 3); // Different enemy types for variety self.passed = false; // Apply visual variations based on enemy type if (self.type === 1) { // Slightly larger enemy enemyGraphics.scale.set(1.2, 1.2); } else if (self.type === 2) { // Rotated enemy enemyGraphics.rotation = Math.PI / 6; // 30 degrees rotation } self.update = function () { self.x -= self.speed; if (self.x < -50) { self.destroy(); } }; }); // Level class to manage level configuration var Level = Container.expand(function () { var self = Container.call(this); // Level data properties self.levelNumber = 1; self.enemySpeed = 5; self.enemySpawnRate = 100; self.backgroundColor = 0x87CEEB; // Level text display var levelText = new Text2('LEVEL 1', { size: 80, fill: 0xFFFFFF }); levelText.anchor.set(0.5, 0.5); self.addChild(levelText); // Show level indicator briefly self.showLevelIndicator = function (level) { self.levelNumber = level; levelText.setText('LEVEL ' + level); self.visible = true; // Fade in level text levelText.alpha = 0; tween(levelText, { alpha: 1 }, { duration: 500 }); // Hide after delay LK.setTimeout(function () { // Fade out tween(levelText, { alpha: 0 }, { duration: 500, onFinish: function onFinish() { self.visible = false; } }); }, 2000); }; // Configure level properties based on level number self.configure = function (level) { self.levelNumber = level; // Increasing difficulty with each level (reduced scaling) self.enemySpeed = 3 + level * 0.1; // Slower enemy speed self.enemySpawnRate = Math.max(60, 120 - level * 0.8); // Less frequent spawns // Change background color every 10 levels var colorIndex = Math.floor((level - 1) / 10); var backgroundColors = [0x87CEEB, // Sky blue 0xFFA500, // Orange 0x9370DB, // Purple 0x228B22, // Forest green 0xB22222 // Fire brick red ]; self.backgroundColor = backgroundColors[colorIndex % backgroundColors.length]; // Show level text self.showLevelIndicator(level); return self; }; // Initially hide the level indicator self.visible = false; return self; }); //<Assets used in the game will automatically appear here> // Define a class for the player character var Player = Container.expand(function () { var self = Container.call(this); var playerGraphics = self.attachAsset('player', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 5; self.jumpHeight = 30; // Slightly increased jump height self.isJumping = false; self.velocityY = 0; self.isInvincible = false; self.invincibilityTime = 0; self.update = function () { if (self.isJumping) { self.y += self.velocityY; self.velocityY += 0.5; // Decreased gravity effect for slower fall if (self.y >= 2732 / 2) { self.y = 2732 / 2; self.isJumping = false; self.velocityY = 0; } } // Handle invincibility if (self.isInvincible) { self.invincibilityTime--; playerGraphics.alpha = Math.sin(LK.ticks * 0.2) * 0.5 + 0.5; // Flashing effect if (self.invincibilityTime <= 0) { self.isInvincible = false; playerGraphics.alpha = 1; } } }; self.jump = function () { if (!self.isJumping) { self.isJumping = true; self.velocityY = -self.jumpHeight; LK.getSound('jump').play(); } }; }); // Import tween plugin for animations // PowerUp class to provide player with special abilities var PowerUp = Container.expand(function () { var self = Container.call(this); // Create a simple colorful circle for the power-up var powerUpGraphics = self.attachAsset('centerCircle', { anchorX: 0.5, anchorY: 0.5 }); // Set a bright color to make it stand out powerUpGraphics.tint = 0xFFFF00; // Yellow color powerUpGraphics.scale.set(0.5, 0.5); self.speed = 4; // Move slightly slower than enemies self.type = 'invincibility'; // Default type // Add a pulsing animation effect self.update = function () { self.x -= self.speed; // Pulse animation var scale = 0.5 + Math.sin(LK.ticks * 0.1) * 0.1; powerUpGraphics.scale.set(scale, scale); // Remove if off-screen if (self.x < -50) { self.destroy(); } }; return self; }); // Scoreboard class to display high scores var Scoreboard = Container.expand(function () { var self = Container.call(this); // Create a background for the scoreboard var background = self.attachAsset('soundOff', { anchorX: 0.5, anchorY: 0.5 }); // Scale the background to make it larger background.width = 800; background.height = 1200; background.alpha = 0.8; // Create title text var titleText = new Text2('HIGH SCORES', { size: 80, fill: 0xFFFFFF }); titleText.anchor.set(0.5, 0); titleText.y = -background.height / 2 + 50; self.addChild(titleText); // Array to store score text objects self.scoreItems = []; // Method to update the scoreboard with new scores self.updateScores = function (scores) { // Clear previous score texts for (var i = 0; i < self.scoreItems.length; i++) { self.scoreItems[i].destroy(); } self.scoreItems = []; // Add new score items for (var i = 0; i < scores.length && i < 5; i++) { var scoreText = new Text2(i + 1 + '. ' + scores[i], { size: 60, fill: 0xFFFFFF }); scoreText.anchor.set(0.5, 0); scoreText.y = -background.height / 2 + 150 + i * 80; self.addChild(scoreText); self.scoreItems.push(scoreText); } }; // Add close button var closeButton = new Text2('CLOSE', { size: 60, fill: 0xFFFFFF }); closeButton.anchor.set(0.5, 0); closeButton.y = background.height / 2 - 100; closeButton.interactive = true; closeButton.down = function () { self.visible = false; }; self.addChild(closeButton); // Initially hide scoreboard self.visible = false; return self; }); // Sound toggle button class var SoundButton = Container.expand(function () { var self = Container.call(this); // Track sound state self.soundOn = true; // Create both button states var soundOnGraphics = self.attachAsset('soundOn', { anchorX: 0.5, anchorY: 0.5 }); var soundOffGraphics = self.attachAsset('soundOff', { anchorX: 0.5, anchorY: 0.5 }); // Initially hide the sound off icon soundOffGraphics.visible = false; // Handle button press self.down = function () { self.soundOn = !self.soundOn; soundOnGraphics.visible = self.soundOn; soundOffGraphics.visible = !self.soundOn; // Set global sound volume based on state LK.setVolume(self.soundOn ? 1 : 0); }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x87CEEB // Sky blue background }); /**** * Game Code ****/ // Initialize current level var currentLevel = 1; var levelsCompleted = 0; var scoreToNextLevel = 5; // Reduced initial points for level progression var lastLevel = 50; var powerUps = []; // Array to store power-ups var powerUpSpawnCounter = 0; var powerUpSpawnInterval = 600; // Spawn power-up every 10 seconds (60fps * 10) // Create level indicator var levelManager = new Level(); LK.gui.center.addChild(levelManager); levelManager.configure(currentLevel); // Create scrolling background var background = game.addChild(new Background()); background.x = 0; background.y = 0; // Initialize player var player = game.addChild(new Player()); player.x = 2048 / 2; player.y = 2732 / 2; player.isInvincible = true; // Start player with invincibility player.invincibilityTime = 180; // 3 seconds at 60fps // Add sound toggle button to top right corner var soundButton = new SoundButton(); soundButton.x = 2048 - 80; soundButton.y = 80; LK.gui.topRight.addChild(soundButton); // Initialize enemies var enemies = []; var enemySpawnInterval = 100; var enemySpawnCounter = 0; // Add level display text var levelDisplayText = new Text2('Level: 1', { size: 60, fill: 0xFFFFFF }); levelDisplayText.anchor.set(0, 0); levelDisplayText.x = 150; levelDisplayText.y = 150; LK.gui.topLeft.addChild(levelDisplayText); // Create a new Text2 object to display the score var scoreText = new Text2('Score: 0', { size: 100, fill: 0xFFFFFF }); // Position the score text correctly scoreText.anchor.set(0.5, 0); // Add the score text to the game GUI at the top center of the screen LK.gui.top.addChild(scoreText); // Create scoreboard button var scoreboardButton = new Text2('SCORES', { size: 60, fill: 0xFFFFFF }); scoreboardButton.anchor.set(0.5, 0); LK.gui.topLeft.addChild(scoreboardButton); scoreboardButton.x = 150; scoreboardButton.y = 80; // Create and initialize the scoreboard var scoreboard = new Scoreboard(); scoreboard.x = 2048 / 2; scoreboard.y = 2732 / 2; LK.gui.center.addChild(scoreboard); // Define highscores array - would typically come from storage var highScores = ["1000", "750", "500", "250", "100"]; scoreboard.updateScores(highScores); // Make scoreboard button interactive scoreboardButton.interactive = true; scoreboardButton.down = function () { scoreboard.visible = true; }; // Handle game updates game.update = function () { // Update background scrolling background.update(); player.update(); // Check if player has advanced to the next level var currentScore = LK.getScore(); if (currentScore >= scoreToNextLevel && currentLevel < lastLevel) { // Advance to next level currentLevel++; scoreToNextLevel += currentLevel * 3; // Reduced points needed for next level // Configure the new level levelManager.configure(currentLevel); levelDisplayText.setText('Level: ' + currentLevel); // Update game difficulty based on level settings enemySpawnInterval = levelManager.enemySpawnRate; // Update background color game.setBackgroundColor(levelManager.backgroundColor); // Special effect for level completion LK.effects.flashScreen(0x00FF00, 500); // Green flash for level up // Give player invincibility after level up player.isInvincible = true; player.invincibilityTime = 180; // 3 seconds at 60fps } // Win condition - completing all 50 levels if (currentLevel >= lastLevel && currentScore >= scoreToNextLevel) { // Player has completed all levels LK.showYouWin(); } // Spawn enemies with level-adjusted difficulty enemySpawnCounter++; if (enemySpawnCounter >= enemySpawnInterval) { var enemy = new Enemy(); enemy.x = 2048 + 500; // Increased spawn distance by 500 pixels enemy.y = 2732 / 2 + (Math.random() * 200 - 100); // Add some vertical variance // Adjust enemy speed based on current level enemy.speed = levelManager.enemySpeed; enemies.push(enemy); game.addChild(enemy); // Randomize the spawn interval for the next enemy // Make spawn interval longer for easier gameplay var randomVariance = Math.floor(Math.random() * 80) + 40; // Significantly increase the spawn interval by multiplying it by 2 enemySpawnInterval = Math.max(120, levelManager.enemySpawnRate * 2 - randomVariance); enemySpawnCounter = 0; } // Handle power-up spawning powerUpSpawnCounter++; if (powerUpSpawnCounter >= powerUpSpawnInterval) { var powerUp = new PowerUp(); powerUp.x = 2048 + 200; powerUp.y = 2732 / 2 + (Math.random() * 400 - 200); // Random vertical position powerUps.push(powerUp); game.addChild(powerUp); powerUpSpawnCounter = 0; // Adjust spawn rate based on level powerUpSpawnInterval = Math.max(300, 600 - currentLevel * 5); } // Update power-ups for (var i = powerUps.length - 1; i >= 0; i--) { powerUps[i].update(); // Check for collision with player if (player.intersects(powerUps[i])) { // Apply power-up effect player.isInvincible = true; player.invincibilityTime = 300; // 5 seconds of invincibility // Visual feedback LK.effects.flashScreen(0xFFFF00, 500); // Yellow flash // Remove power-up powerUps[i].destroy(); powerUps.splice(i, 1); } // Remove power-ups that are off-screen else if (powerUps[i].x < -50) { powerUps[i].destroy(); powerUps.splice(i, 1); } } // Update enemies for (var j = enemies.length - 1; j >= 0; j--) { enemies[j].update(); if (player.intersects(enemies[j]) && !player.isInvincible) { LK.effects.flashScreen(0xff0000, 1000); LK.getSound('gameover').play(); // Update high scores with current score var currentScore = LK.getScore(); for (var k = 0; k < highScores.length; k++) { if (currentScore > parseInt(highScores[k])) { // Insert new high score and shift others down highScores.splice(k, 0, currentScore.toString()); highScores.pop(); // Remove lowest score break; } } // Update scoreboard with new high scores scoreboard.updateScores(highScores); LK.showGameOver(); } else if (player.x > enemies[j].x && !enemies[j].passed) { enemies[j].passed = true; LK.setScore(LK.getScore() + 2); // Double points for passing enemies scoreText.setText('Score: ' + LK.getScore()); } } }; // Handle player jump game.down = function (x, y, obj) { player.jump(); };
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// Define a class for scrolling background
var Background = Container.expand(function () {
var self = Container.call(this);
// Create two background images for continuous scrolling
var bg1 = self.attachAsset('background', {
anchorX: 0,
anchorY: 0
});
var bg2 = self.attachAsset('background', {
anchorX: 0,
anchorY: 0
});
// Position the second background right after the first one
bg2.x = bg1.width;
self.speed = 2; // Scrolling speed
// Track positions for animation
self.update = function () {
// Move both backgrounds to the left
bg1.x -= self.speed;
bg2.x -= self.speed;
// When the first background moves completely off-screen to the left
if (bg1.x <= -bg1.width) {
bg1.x = bg2.x + bg2.width;
}
// When the second background moves completely off-screen to the left
if (bg2.x <= -bg2.width) {
bg2.x = bg1.x + bg1.width;
}
};
return self;
});
// Define a class for enemies
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 5;
self.type = Math.floor(Math.random() * 3); // Different enemy types for variety
self.passed = false;
// Apply visual variations based on enemy type
if (self.type === 1) {
// Slightly larger enemy
enemyGraphics.scale.set(1.2, 1.2);
} else if (self.type === 2) {
// Rotated enemy
enemyGraphics.rotation = Math.PI / 6; // 30 degrees rotation
}
self.update = function () {
self.x -= self.speed;
if (self.x < -50) {
self.destroy();
}
};
});
// Level class to manage level configuration
var Level = Container.expand(function () {
var self = Container.call(this);
// Level data properties
self.levelNumber = 1;
self.enemySpeed = 5;
self.enemySpawnRate = 100;
self.backgroundColor = 0x87CEEB;
// Level text display
var levelText = new Text2('LEVEL 1', {
size: 80,
fill: 0xFFFFFF
});
levelText.anchor.set(0.5, 0.5);
self.addChild(levelText);
// Show level indicator briefly
self.showLevelIndicator = function (level) {
self.levelNumber = level;
levelText.setText('LEVEL ' + level);
self.visible = true;
// Fade in level text
levelText.alpha = 0;
tween(levelText, {
alpha: 1
}, {
duration: 500
});
// Hide after delay
LK.setTimeout(function () {
// Fade out
tween(levelText, {
alpha: 0
}, {
duration: 500,
onFinish: function onFinish() {
self.visible = false;
}
});
}, 2000);
};
// Configure level properties based on level number
self.configure = function (level) {
self.levelNumber = level;
// Increasing difficulty with each level (reduced scaling)
self.enemySpeed = 3 + level * 0.1; // Slower enemy speed
self.enemySpawnRate = Math.max(60, 120 - level * 0.8); // Less frequent spawns
// Change background color every 10 levels
var colorIndex = Math.floor((level - 1) / 10);
var backgroundColors = [0x87CEEB,
// Sky blue
0xFFA500,
// Orange
0x9370DB,
// Purple
0x228B22,
// Forest green
0xB22222 // Fire brick red
];
self.backgroundColor = backgroundColors[colorIndex % backgroundColors.length];
// Show level text
self.showLevelIndicator(level);
return self;
};
// Initially hide the level indicator
self.visible = false;
return self;
});
//<Assets used in the game will automatically appear here>
// Define a class for the player character
var Player = Container.expand(function () {
var self = Container.call(this);
var playerGraphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 5;
self.jumpHeight = 30; // Slightly increased jump height
self.isJumping = false;
self.velocityY = 0;
self.isInvincible = false;
self.invincibilityTime = 0;
self.update = function () {
if (self.isJumping) {
self.y += self.velocityY;
self.velocityY += 0.5; // Decreased gravity effect for slower fall
if (self.y >= 2732 / 2) {
self.y = 2732 / 2;
self.isJumping = false;
self.velocityY = 0;
}
}
// Handle invincibility
if (self.isInvincible) {
self.invincibilityTime--;
playerGraphics.alpha = Math.sin(LK.ticks * 0.2) * 0.5 + 0.5; // Flashing effect
if (self.invincibilityTime <= 0) {
self.isInvincible = false;
playerGraphics.alpha = 1;
}
}
};
self.jump = function () {
if (!self.isJumping) {
self.isJumping = true;
self.velocityY = -self.jumpHeight;
LK.getSound('jump').play();
}
};
});
// Import tween plugin for animations
// PowerUp class to provide player with special abilities
var PowerUp = Container.expand(function () {
var self = Container.call(this);
// Create a simple colorful circle for the power-up
var powerUpGraphics = self.attachAsset('centerCircle', {
anchorX: 0.5,
anchorY: 0.5
});
// Set a bright color to make it stand out
powerUpGraphics.tint = 0xFFFF00; // Yellow color
powerUpGraphics.scale.set(0.5, 0.5);
self.speed = 4; // Move slightly slower than enemies
self.type = 'invincibility'; // Default type
// Add a pulsing animation effect
self.update = function () {
self.x -= self.speed;
// Pulse animation
var scale = 0.5 + Math.sin(LK.ticks * 0.1) * 0.1;
powerUpGraphics.scale.set(scale, scale);
// Remove if off-screen
if (self.x < -50) {
self.destroy();
}
};
return self;
});
// Scoreboard class to display high scores
var Scoreboard = Container.expand(function () {
var self = Container.call(this);
// Create a background for the scoreboard
var background = self.attachAsset('soundOff', {
anchorX: 0.5,
anchorY: 0.5
});
// Scale the background to make it larger
background.width = 800;
background.height = 1200;
background.alpha = 0.8;
// Create title text
var titleText = new Text2('HIGH SCORES', {
size: 80,
fill: 0xFFFFFF
});
titleText.anchor.set(0.5, 0);
titleText.y = -background.height / 2 + 50;
self.addChild(titleText);
// Array to store score text objects
self.scoreItems = [];
// Method to update the scoreboard with new scores
self.updateScores = function (scores) {
// Clear previous score texts
for (var i = 0; i < self.scoreItems.length; i++) {
self.scoreItems[i].destroy();
}
self.scoreItems = [];
// Add new score items
for (var i = 0; i < scores.length && i < 5; i++) {
var scoreText = new Text2(i + 1 + '. ' + scores[i], {
size: 60,
fill: 0xFFFFFF
});
scoreText.anchor.set(0.5, 0);
scoreText.y = -background.height / 2 + 150 + i * 80;
self.addChild(scoreText);
self.scoreItems.push(scoreText);
}
};
// Add close button
var closeButton = new Text2('CLOSE', {
size: 60,
fill: 0xFFFFFF
});
closeButton.anchor.set(0.5, 0);
closeButton.y = background.height / 2 - 100;
closeButton.interactive = true;
closeButton.down = function () {
self.visible = false;
};
self.addChild(closeButton);
// Initially hide scoreboard
self.visible = false;
return self;
});
// Sound toggle button class
var SoundButton = Container.expand(function () {
var self = Container.call(this);
// Track sound state
self.soundOn = true;
// Create both button states
var soundOnGraphics = self.attachAsset('soundOn', {
anchorX: 0.5,
anchorY: 0.5
});
var soundOffGraphics = self.attachAsset('soundOff', {
anchorX: 0.5,
anchorY: 0.5
});
// Initially hide the sound off icon
soundOffGraphics.visible = false;
// Handle button press
self.down = function () {
self.soundOn = !self.soundOn;
soundOnGraphics.visible = self.soundOn;
soundOffGraphics.visible = !self.soundOn;
// Set global sound volume based on state
LK.setVolume(self.soundOn ? 1 : 0);
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87CEEB // Sky blue background
});
/****
* Game Code
****/
// Initialize current level
var currentLevel = 1;
var levelsCompleted = 0;
var scoreToNextLevel = 5; // Reduced initial points for level progression
var lastLevel = 50;
var powerUps = []; // Array to store power-ups
var powerUpSpawnCounter = 0;
var powerUpSpawnInterval = 600; // Spawn power-up every 10 seconds (60fps * 10)
// Create level indicator
var levelManager = new Level();
LK.gui.center.addChild(levelManager);
levelManager.configure(currentLevel);
// Create scrolling background
var background = game.addChild(new Background());
background.x = 0;
background.y = 0;
// Initialize player
var player = game.addChild(new Player());
player.x = 2048 / 2;
player.y = 2732 / 2;
player.isInvincible = true; // Start player with invincibility
player.invincibilityTime = 180; // 3 seconds at 60fps
// Add sound toggle button to top right corner
var soundButton = new SoundButton();
soundButton.x = 2048 - 80;
soundButton.y = 80;
LK.gui.topRight.addChild(soundButton);
// Initialize enemies
var enemies = [];
var enemySpawnInterval = 100;
var enemySpawnCounter = 0;
// Add level display text
var levelDisplayText = new Text2('Level: 1', {
size: 60,
fill: 0xFFFFFF
});
levelDisplayText.anchor.set(0, 0);
levelDisplayText.x = 150;
levelDisplayText.y = 150;
LK.gui.topLeft.addChild(levelDisplayText);
// Create a new Text2 object to display the score
var scoreText = new Text2('Score: 0', {
size: 100,
fill: 0xFFFFFF
});
// Position the score text correctly
scoreText.anchor.set(0.5, 0);
// Add the score text to the game GUI at the top center of the screen
LK.gui.top.addChild(scoreText);
// Create scoreboard button
var scoreboardButton = new Text2('SCORES', {
size: 60,
fill: 0xFFFFFF
});
scoreboardButton.anchor.set(0.5, 0);
LK.gui.topLeft.addChild(scoreboardButton);
scoreboardButton.x = 150;
scoreboardButton.y = 80;
// Create and initialize the scoreboard
var scoreboard = new Scoreboard();
scoreboard.x = 2048 / 2;
scoreboard.y = 2732 / 2;
LK.gui.center.addChild(scoreboard);
// Define highscores array - would typically come from storage
var highScores = ["1000", "750", "500", "250", "100"];
scoreboard.updateScores(highScores);
// Make scoreboard button interactive
scoreboardButton.interactive = true;
scoreboardButton.down = function () {
scoreboard.visible = true;
};
// Handle game updates
game.update = function () {
// Update background scrolling
background.update();
player.update();
// Check if player has advanced to the next level
var currentScore = LK.getScore();
if (currentScore >= scoreToNextLevel && currentLevel < lastLevel) {
// Advance to next level
currentLevel++;
scoreToNextLevel += currentLevel * 3; // Reduced points needed for next level
// Configure the new level
levelManager.configure(currentLevel);
levelDisplayText.setText('Level: ' + currentLevel);
// Update game difficulty based on level settings
enemySpawnInterval = levelManager.enemySpawnRate;
// Update background color
game.setBackgroundColor(levelManager.backgroundColor);
// Special effect for level completion
LK.effects.flashScreen(0x00FF00, 500); // Green flash for level up
// Give player invincibility after level up
player.isInvincible = true;
player.invincibilityTime = 180; // 3 seconds at 60fps
}
// Win condition - completing all 50 levels
if (currentLevel >= lastLevel && currentScore >= scoreToNextLevel) {
// Player has completed all levels
LK.showYouWin();
}
// Spawn enemies with level-adjusted difficulty
enemySpawnCounter++;
if (enemySpawnCounter >= enemySpawnInterval) {
var enemy = new Enemy();
enemy.x = 2048 + 500; // Increased spawn distance by 500 pixels
enemy.y = 2732 / 2 + (Math.random() * 200 - 100); // Add some vertical variance
// Adjust enemy speed based on current level
enemy.speed = levelManager.enemySpeed;
enemies.push(enemy);
game.addChild(enemy);
// Randomize the spawn interval for the next enemy
// Make spawn interval longer for easier gameplay
var randomVariance = Math.floor(Math.random() * 80) + 40;
// Significantly increase the spawn interval by multiplying it by 2
enemySpawnInterval = Math.max(120, levelManager.enemySpawnRate * 2 - randomVariance);
enemySpawnCounter = 0;
}
// Handle power-up spawning
powerUpSpawnCounter++;
if (powerUpSpawnCounter >= powerUpSpawnInterval) {
var powerUp = new PowerUp();
powerUp.x = 2048 + 200;
powerUp.y = 2732 / 2 + (Math.random() * 400 - 200); // Random vertical position
powerUps.push(powerUp);
game.addChild(powerUp);
powerUpSpawnCounter = 0;
// Adjust spawn rate based on level
powerUpSpawnInterval = Math.max(300, 600 - currentLevel * 5);
}
// Update power-ups
for (var i = powerUps.length - 1; i >= 0; i--) {
powerUps[i].update();
// Check for collision with player
if (player.intersects(powerUps[i])) {
// Apply power-up effect
player.isInvincible = true;
player.invincibilityTime = 300; // 5 seconds of invincibility
// Visual feedback
LK.effects.flashScreen(0xFFFF00, 500); // Yellow flash
// Remove power-up
powerUps[i].destroy();
powerUps.splice(i, 1);
}
// Remove power-ups that are off-screen
else if (powerUps[i].x < -50) {
powerUps[i].destroy();
powerUps.splice(i, 1);
}
}
// Update enemies
for (var j = enemies.length - 1; j >= 0; j--) {
enemies[j].update();
if (player.intersects(enemies[j]) && !player.isInvincible) {
LK.effects.flashScreen(0xff0000, 1000);
LK.getSound('gameover').play();
// Update high scores with current score
var currentScore = LK.getScore();
for (var k = 0; k < highScores.length; k++) {
if (currentScore > parseInt(highScores[k])) {
// Insert new high score and shift others down
highScores.splice(k, 0, currentScore.toString());
highScores.pop(); // Remove lowest score
break;
}
}
// Update scoreboard with new high scores
scoreboard.updateScores(highScores);
LK.showGameOver();
} else if (player.x > enemies[j].x && !enemies[j].passed) {
enemies[j].passed = true;
LK.setScore(LK.getScore() + 2); // Double points for passing enemies
scoreText.setText('Score: ' + LK.getScore());
}
}
};
// Handle player jump
game.down = function (x, y, obj) {
player.jump();
};