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"); var storage = LK.import("@upit/storage.v1", { highScores: ["1000", "750", "500", "250", "100"] }); /**** * 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(); } }; }); // Define a class for fast enemies var EnemyFast = Container.expand(function () { var self = Container.call(this); var enemyGraphics = self.attachAsset('enemy', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 8; // Faster than regular enemies self.type = 'fast'; self.passed = false; // Apply visual variations - make it smaller and red tinted enemyGraphics.scale.set(0.8, 0.8); enemyGraphics.tint = 0xFF0000; // Red tint 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 = 5 + level * 0.2; // Increased 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 = 15; // Increased speed for easier jumps self.jumpHeight = 35; // Moderately 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 with improved styling var titleText = new Text2('HIGH SCORES', { size: 90, fill: 0xFFD700 }); titleText.anchor.set(0.5, 0); titleText.y = -background.height / 2 + 50; self.addChild(titleText); // Create current score display with improved styling var currentScoreLabel = new Text2('YOUR SCORE:', { size: 65, fill: 0xFFFFFF }); currentScoreLabel.anchor.set(0.5, 0); currentScoreLabel.y = -background.height / 2 + 140; self.addChild(currentScoreLabel); var currentScoreText = new Text2('0', { size: 80, fill: 0xFFD700 // Gold color }); currentScoreText.anchor.set(0.5, 0); currentScoreText.y = -background.height / 2 + 200; currentScoreText.scale = { x: 1, y: 1 }; // Initialize scale for tweening self.addChild(currentScoreText); // Array to store score text objects self.scoreItems = []; // Add decorative divider var divider = self.attachAsset('soundOff', { anchorX: 0.5, anchorY: 0.5 }); divider.width = 700; divider.height = 4; divider.y = -background.height / 2 + 240; divider.alpha = 0.5; divider.tint = 0xFFD700; // Method to update the scoreboard with new scores self.updateScores = function (scores) { // Update current score with highlight effects var finalScore = LK.getScore(); currentScoreText.setText(finalScore.toString()); // Add animation for score display tween(currentScoreText, { scale: 1.2 }, { duration: 300, yoyo: true, repeat: 1 }); // Clear previous score texts for (var i = 0; i < self.scoreItems.length; i++) { self.scoreItems[i].destroy(); } self.scoreItems = []; // Add new score items with improved visual hierarchy for (var i = 0; i < scores.length && i < 5; i++) { // Determine if this is the current score that was just achieved var isCurrentScore = LK.getScore() === parseInt(scores[i]); // Add rank indicator var rankText = new Text2(i + 1 + '.', { size: 60, fill: isCurrentScore ? 0xFFD700 : 0xFFFFFF }); rankText.anchor.set(1, 0); rankText.x = -100; rankText.y = -background.height / 2 + 280 + i * 90; self.addChild(rankText); self.scoreItems.push(rankText); // Add score value with separated styling var scoreText = new Text2(scores[i], { size: 65, fill: isCurrentScore ? 0xFFD700 : 0xFFFFFF // Gold color for current score }); scoreText.anchor.set(0, 0); scoreText.x = -70; scoreText.y = -background.height / 2 + 280 + i * 90; // Add highlight effect for current score if (isCurrentScore) { // Create a background highlight var highlight = self.attachAsset('soundOff', { anchorX: 0.5, anchorY: 0.5, width: 600, height: 70 }); highlight.x = 0; highlight.y = scoreText.y + scoreText.height / 2; highlight.alpha = 0.2; highlight.tint = 0xFFD700; // Gold tint self.scoreItems.push(highlight); // Add pulsing animation to highlight tween(highlight, { alpha: 0.05 }, { duration: 800, repeat: -1, yoyo: true }); // Add "NEW!" indicator for new high score if (i === 0 && isCurrentScore) { var newIndicator = new Text2('NEW!', { size: 50, fill: 0xFF0000 }); newIndicator.anchor.set(0, 0.5); newIndicator.x = 150; newIndicator.y = highlight.y; self.addChild(newIndicator); self.scoreItems.push(newIndicator); // Add blinking animation tween(newIndicator, { alpha: 0.5 }, { duration: 500, repeat: -1, yoyo: true }); } } self.addChild(scoreText); self.scoreItems.push(scoreText); } // Update title with achievements if (LK.getScore() > 0) { var achievementText = ""; if (LK.getScore() >= parseInt(scores[0])) { achievementText = "NEW HIGH SCORE!"; } else if (LK.getScore() >= parseInt(scores[4])) { achievementText = "TOP 5 SCORE!"; } if (achievementText) { var achievement = new Text2(achievementText, { size: 50, fill: 0xFF9900 }); achievement.anchor.set(0.5, 0); achievement.y = -background.height / 2 + 100; self.addChild(achievement); self.scoreItems.push(achievement); } } }; // Add improved close button var closeButton = new Container(); closeButton.x = 0; closeButton.y = background.height / 2 - 100; closeButton.interactive = true; // Create button background directly with attachAsset var buttonBg = self.attachAsset('soundOff', { anchorX: 0.5, anchorY: 0.5, width: 200, height: 80 }); buttonBg.x = closeButton.x; buttonBg.y = closeButton.y; buttonBg.alpha = 0.4; buttonBg.tint = 0x444444; // Add button text var buttonText = new Text2('CLOSE', { size: 60, fill: 0xFFFFFF }); buttonText.anchor.set(0.5, 0.5); closeButton.addChild(buttonText); 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); // Create high score notification text var highScoreNotification = new Text2('', { size: 120, fill: 0xFFD700 // Gold color }); highScoreNotification.anchor.set(0.5, 0); highScoreNotification.y = 350; highScoreNotification.visible = false; LK.gui.top.addChild(highScoreNotification); // Add persistent high score display in the corner var bestScoreText = new Text2('BEST: 0', { size: 50, fill: 0xFFD700 }); bestScoreText.anchor.set(1, 0); bestScoreText.x = -100; bestScoreText.y = 150; LK.gui.topRight.addChild(bestScoreText); // Get highScores from storage (plugin handles fallback values) var highScores = storage.highScores || ["1000", "750", "500", "250", "100"]; // Make sure highScores is an array with numeric strings if (!Array.isArray(highScores)) { highScores = ["1000", "750", "500", "250", "100"]; storage.highScores = highScores; } else { // Ensure all values are strings for (var i = 0; i < highScores.length; i++) { highScores[i] = String(highScores[i]); } } // Safely set best score text if (highScores && highScores.length > 0) { bestScoreText.setText('BEST: ' + highScores[0]); } else { bestScoreText.setText('BEST: 0'); } // Display current high scores on startup scoreboard.updateScores(highScores); // Initialize high score display elements highScoreNotification.alpha = 1; console.log("Loaded high scores:", highScores); // Add intro animation for scoreboard LK.setTimeout(function () { // Show scoreboard briefly at start of game scoreboard.visible = true; // Shrink from large scoreboard.scale.set(1.2, 1.2); scoreboard.alpha = 0; tween(scoreboard, { alpha: 1, scaleX: 1, scaleY: 1 }, { duration: 500, onFinish: function onFinish() { // Hide after showing briefly LK.setTimeout(function () { tween(scoreboard, { alpha: 0 }, { duration: 400, onFinish: function onFinish() { scoreboard.visible = false; scoreboard.alpha = 1; } }); }, 2000); } }); }, 500); // 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) { // Randomly select enemy type based on current level var enemyType = Math.random(); var enemy; // Increase chance of fast enemies as level increases var fastEnemyChance = Math.min(0.5, currentLevel * 0.05); if (enemyType < fastEnemyChance) { // Spawn a fast enemy enemy = new EnemyFast(); } else { // Spawn a regular enemy 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 if (enemy.type !== 'fast') { 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(); // Check if this is a new high score with improved notification var isNewHighScore = false; var currentScore = LK.getScore(); var highScoreRank = -1; // Check if player achieved any high score position for (var i = 0; i < highScores.length; i++) { if (currentScore > parseInt(highScores[i])) { highScoreRank = i + 1; break; } } if (highScoreRank > 0) { isNewHighScore = true; if (highScoreRank === 1) { highScoreNotification.setText("NEW TOP SCORE: " + currentScore + "!"); } else { highScoreNotification.setText("NEW #" + highScoreRank + " HIGH SCORE!"); } highScoreNotification.visible = true; // Improved animation effect highScoreNotification.scale.set(1.2, 1.2); // Create sequence of animations tween(highScoreNotification, { alpha: 0.7, scaleX: 1.0, scaleY: 1.0 }, { duration: 400, repeat: 4, yoyo: true, onFinish: function onFinish() { highScoreNotification.alpha = 1; highScoreNotification.scale.set(1, 1); } }); } // Update high scores with current score var currentScore = LK.getScore(); // Create a copy of the array to check if scores changed var oldHighScores = []; if (highScores && Array.isArray(highScores)) { for (var i = 0; i < highScores.length; i++) { oldHighScores.push(highScores[i]); } } var scoreInserted = false; 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 scoreInserted = true; break; } } // Only save if the scores actually changed if (oldHighScores.length > 0 && highScores.length > 0 && scoreInserted) { try { // Save updated high scores to storage storage.highScores = highScores; console.log("High scores updated and saved to storage"); } catch (e) { console.log("Error saving high scores:", e); } } // Update scoreboard with new high scores scoreboard.updateScores(highScores); // Show scoreboard when game is over scoreboard.visible = true; // Add special visual effect for final score display var finalScoreBanner = new Text2('FINAL SCORE: ' + LK.getScore(), { size: 70, fill: 0xFFFFFF }); finalScoreBanner.anchor.set(0.5, 0.5); finalScoreBanner.x = scoreboard.x; finalScoreBanner.y = scoreboard.y - 500; LK.gui.center.addChild(finalScoreBanner); // Animate the final score banner tween(finalScoreBanner, { alpha: 0, y: scoreboard.y - 400 }, { duration: 2000, delay: 1000, onFinish: function onFinish() { finalScoreBanner.destroy(); } }); 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(); };
===================================================================
--- original.js
+++ change.js
@@ -528,12 +528,17 @@
bestScoreText.y = 150;
LK.gui.topRight.addChild(bestScoreText);
// Get highScores from storage (plugin handles fallback values)
var highScores = storage.highScores || ["1000", "750", "500", "250", "100"];
-// Make sure highScores is an array
+// Make sure highScores is an array with numeric strings
if (!Array.isArray(highScores)) {
highScores = ["1000", "750", "500", "250", "100"];
storage.highScores = highScores;
+} else {
+ // Ensure all values are strings
+ for (var i = 0; i < highScores.length; i++) {
+ highScores[i] = String(highScores[i]);
+ }
}
// Safely set best score text
if (highScores && highScores.length > 0) {
bestScoreText.setText('BEST: ' + highScores[0]);