User prompt
Diseña la interfaz y hazla funcional pls ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Crea una interfaz al iniciar el juego que aparezca la opción de jugar cambiar el idioma de juego y tu máxima puntuación en cada idioma ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Haz un sitio donde aparezcan las vidas
User prompt
Please fix the bug: 'storage.get is not a function. (In 'storage.get('selectedLanguage')', 'storage.get' is undefined)' in or related to this line: 'var currentLanguage = storage.get('selectedLanguage') || 'es';' Line Number: 153 ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Sip puedes poner una interfaz y que puedas cambiar el idioma de las palabras
User prompt
Add músic
User prompt
Finx de bugs pls
Code edit (1 edits merged)
Please save this source code
User prompt
Puedes poner el fondo más colorido y que vaya cambiando dependiendo de la velocidad ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Le añades musica
Code edit (1 edits merged)
Please save this source code
User prompt
Palabras Volantes
Initial prompt
Hablas español
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ var Heart = Container.expand(function () { var self = Container.call(this); var heartGraphic = self.attachAsset('heart', { anchorX: 0.5, anchorY: 0.5 }); return self; }); var LanguageButton = Container.expand(function () { var self = Container.call(this); // Create button background var buttonBg = self.attachAsset('wordBubble', { anchorX: 0.5, anchorY: 0.5 }); buttonBg.width = 300; buttonBg.height = 90; // Create text for the button self.buttonText = new Text2('Español', { size: 48, fill: 0xFFFFFF }); self.buttonText.anchor.set(0.5, 0.5); self.addChild(self.buttonText); self.setLanguage = function (lang) { if (lang === 'es') { self.buttonText.setText('Español'); } else if (lang === 'en') { self.buttonText.setText('English'); } else if (lang === 'fr') { self.buttonText.setText('Français'); } }; // Touch handler for language cycling self.down = function (x, y, obj) { // Cycle through languages if (currentLanguage === 'es') { currentLanguage = 'en'; } else if (currentLanguage === 'en') { currentLanguage = 'fr'; } else { currentLanguage = 'es'; } // Save language preference storage.selectedLanguage = currentLanguage; // Update button text self.setLanguage(currentLanguage); // Update word categories updateWordCategories(); // Visual feedback LK.effects.flashObject(self, 0xFFEB3B, 300); }; return self; }); var MisspelledWord = Container.expand(function () { var self = Container.call(this); // Create word bubble background var bubble = self.attachAsset('wordBubble', { anchorX: 0.5, anchorY: 0.5 }); // Create text for the word self.wordText = new Text2('', { size: 72, fill: 0xFFFFFF }); self.wordText.anchor.set(0.5, 0.5); self.addChild(self.wordText); // Word properties self.fallSpeed = 2; self.word = ''; self.missed = false; // Set the word text self.setWord = function (word) { self.word = word; self.wordText.setText(word); }; // Update method called every frame self.update = function () { self.y += self.fallSpeed; }; // Touch handler - touching misspelled word reduces life self.down = function (x, y, obj) { if (!self.missed) { // Misspelled word was touched - lose a life loseLife(); // Visual effect LK.effects.flashObject(self, 0xFF1744, 300); tween(self, { scaleX: 1.5, scaleY: 1.5, alpha: 0 }, { duration: 300, onFinish: function onFinish() { self.destroy(); } }); // Remove from words array for (var i = words.length - 1; i >= 0; i--) { if (words[i] === self) { words.splice(i, 1); break; } } } }; return self; }); var MusicToggleButton = Container.expand(function () { var self = Container.call(this); // Create button background var buttonBg = self.attachAsset('wordBubble', { anchorX: 0.5, anchorY: 0.5 }); buttonBg.width = 300; buttonBg.height = 90; // Create text for the button self.buttonText = new Text2('Música ON', { size: 48, fill: 0xFFFFFF }); self.buttonText.anchor.set(0.5, 0.5); self.addChild(self.buttonText); // Update button text based on music state self.updateText = function () { if (musicEnabled) { self.buttonText.setText('Música ON'); } else { self.buttonText.setText('Música OFF'); } }; // Touch handler for music toggle self.down = function (x, y, obj) { // Toggle music state musicEnabled = !musicEnabled; // Save music preference storage.musicEnabled = musicEnabled; // Update button text self.updateText(); // Control music playback if (musicEnabled) { LK.playMusic('backgroundMusic'); } else { LK.stopMusic(); } // Visual feedback LK.effects.flashObject(self, 0xFFEB3B, 300); }; return self; }); var Word = Container.expand(function () { var self = Container.call(this); // Create word bubble background var bubble = self.attachAsset('wordBubble', { anchorX: 0.5, anchorY: 0.5 }); // Create text for the word self.wordText = new Text2('', { size: 72, fill: 0xFFFFFF }); self.wordText.anchor.set(0.5, 0.5); self.addChild(self.wordText); // Word properties self.fallSpeed = 2; self.word = ''; self.missed = false; // Set the word text self.setWord = function (word) { self.word = word; self.wordText.setText(word); }; // Update method called every frame self.update = function () { self.y += self.fallSpeed; }; // Touch handler self.down = function (x, y, obj) { if (!self.missed) { // Word was touched correctly LK.setScore(LK.getScore() + 10); scoreText.setText(LK.getScore()); // Visual effect LK.effects.flashObject(self, 0xFFEB3B, 300); tween(self, { scaleX: 1.5, scaleY: 1.5, alpha: 0 }, { duration: 300, onFinish: function onFinish() { self.destroy(); } }); // Play sound if music is enabled if (musicEnabled) { LK.getSound('correctWord').play(); } // Remove from words array for (var i = words.length - 1; i >= 0; i--) { if (words[i] === self) { words.splice(i, 1); break; } } } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x1976D2 }); /**** * Game Code ****/ // Game state management var gameState = 'playing'; // 'menu' or 'playing' // Game variables var words = []; var lives = 3; var hearts = []; var currentSpeed = 2; var wordSpawnTimer = 0; var spawnInterval = 120; // Spawn every 2 seconds at 60 FPS var backgroundColors = [0x1976D2, 0x7B1FA2, 0xD32F2F, 0xF57C00, 0x388E3C, 0x1976D2]; var currentColorIndex = 0; var lastSpeedLevel = 0; // Language system var currentLanguage = storage.selectedLanguage || 'es'; var languageButton; var musicToggleButton; var scoreText; var livesContainer; // Music system var musicEnabled = storage.musicEnabled !== undefined ? storage.musicEnabled : true; // Multi-language words by category var allLanguageWords = { es: { animales: ['gato', 'perro', 'pájaro', 'pez', 'león', 'tigre', 'oso', 'ratón'], colores: ['rojo', 'azul', 'verde', 'amarillo', 'naranja', 'morado', 'rosa', 'negro'], comida: ['manzana', 'pan', 'agua', 'leche', 'queso', 'pollo', 'arroz', 'pasta'], objetos: ['mesa', 'silla', 'libro', 'lápiz', 'coche', 'casa', 'puerta', 'ventana'] }, en: { animals: ['cat', 'dog', 'bird', 'fish', 'lion', 'tiger', 'bear', 'mouse'], colors: ['red', 'blue', 'green', 'yellow', 'orange', 'purple', 'pink', 'black'], food: ['apple', 'bread', 'water', 'milk', 'cheese', 'chicken', 'rice', 'pasta'], objects: ['table', 'chair', 'book', 'pencil', 'car', 'house', 'door', 'window'] }, fr: { animaux: ['chat', 'chien', 'oiseau', 'poisson', 'lion', 'tigre', 'ours', 'souris'], couleurs: ['rouge', 'bleu', 'vert', 'jaune', 'orange', 'violet', 'rose', 'noir'], nourriture: ['pomme', 'pain', 'eau', 'lait', 'fromage', 'poulet', 'riz', 'pâtes'], objets: ['table', 'chaise', 'livre', 'crayon', 'voiture', 'maison', 'porte', 'fenêtre'] } }; // Misspelled words for each language var misspelledWords = { es: ['gto', 'prero', 'pájro', 'pz', 'leó', 'tigr', 'os', 'rató', 'rjo', 'azl', 'verd', 'amarilo'], en: ['ct', 'dg', 'brd', 'fsh', 'lin', 'tigr', 'ber', 'mous', 'rd', 'blu', 'gren', 'yelow'], fr: ['cht', 'chin', 'oisa', 'poisso', 'lin', 'tigr', 'ous', 'souri', 'roug', 'ble', 'vrt', 'jaun'] }; var wordCategories = {}; var allWords = []; var misspelledWordsArray = []; // Function to update word categories based on current language function updateWordCategories() { wordCategories = allLanguageWords[currentLanguage]; allWords = []; for (var category in wordCategories) { allWords = allWords.concat(wordCategories[category]); } misspelledWordsArray = misspelledWords[currentLanguage] || []; } // Initialize with current language updateWordCategories(); // Function to start the game function startGame() { gameState = 'playing'; // Reset game variables words = []; lives = 3; currentSpeed = 2; wordSpawnTimer = 0; currentColorIndex = 0; lastSpeedLevel = 0; LK.setScore(0); // Show game UI showGameUI(); // Reset hearts for (var i = 0; i < hearts.length; i++) { hearts[i].alpha = 1; } // Update score display if (scoreText) { scoreText.setText(LK.getScore()); } // Start spawning words immediately spawnWord(); // Play background music if enabled if (musicEnabled) { LK.playMusic('backgroundMusic'); } console.log("Game started, state:", gameState); } // Function to cycle language function cycleLanguage() { if (currentLanguage === 'es') { currentLanguage = 'en'; } else if (currentLanguage === 'en') { currentLanguage = 'fr'; } else { currentLanguage = 'es'; } // Save language preference storage.selectedLanguage = currentLanguage; // Update word categories updateWordCategories(); // Update language button if visible if (languageButton) { languageButton.setLanguage(currentLanguage); } } // Function to show game UI function showGameUI() { if (scoreText) { scoreText.visible = true; } if (livesContainer) { livesContainer.visible = true; } if (languageButton) { languageButton.visible = true; } if (musicToggleButton) { musicToggleButton.visible = true; } } // Function to hide game UI function hideGameUI() { if (scoreText) { scoreText.visible = false; } if (livesContainer) { livesContainer.visible = false; } if (languageButton) { languageButton.visible = false; } if (musicToggleButton) { musicToggleButton.visible = false; } } // Score display scoreText = new Text2('0', { size: 60, fill: 0xFFFFFF }); scoreText.anchor.set(0.5, 0); LK.gui.top.addChild(scoreText); scoreText.y = 50; // Lives display - Create a container for hearts with better positioning livesContainer = new Container(); livesContainer.x = -200; // Offset to position hearts better in top right livesContainer.y = 50; LK.gui.topRight.addChild(livesContainer); // Add hearts to the lives container for (var i = 0; i < 3; i++) { var heart = new Heart(); heart.x = i * 80; heart.y = 0; hearts.push(heart); livesContainer.addChild(heart); } // Add "Lives:" label next to hearts var livesLabel = new Text2('Lives:', { size: 60, fill: 0xFFFFFF }); livesLabel.anchor.set(1, 0.5); livesLabel.x = -20; livesLabel.y = 0; livesContainer.addChild(livesLabel); // Language selection button languageButton = new LanguageButton(); languageButton.x = -150; languageButton.y = 150; languageButton.setLanguage(currentLanguage); LK.gui.topRight.addChild(languageButton); // Music toggle button musicToggleButton = new MusicToggleButton(); musicToggleButton.x = -150; musicToggleButton.y = 220; musicToggleButton.updateText(); LK.gui.topRight.addChild(musicToggleButton); // Start game immediately startGame(); // Function to spawn a new word function spawnWord() { var word; // 20% chance to spawn a misspelled word if (Math.random() < 0.2 && misspelledWordsArray.length > 0) { word = new MisspelledWord(); var randomMisspelledWord = misspelledWordsArray[Math.floor(Math.random() * misspelledWordsArray.length)]; word.setWord(randomMisspelledWord); } else { word = new Word(); var randomWord = allWords[Math.floor(Math.random() * allWords.length)]; word.setWord(randomWord); } // Random horizontal position word.x = Math.random() * (2048 - 300) + 150; word.y = -100; word.fallSpeed = currentSpeed; words.push(word); game.addChild(word); } // Function to lose a life function loseLife() { lives--; if (lives >= 0 && lives < hearts.length) { hearts[lives].alpha = 0.3; } if (lives <= 0) { // Save high score before game over var currentScore = LK.getScore(); var highScoreKey = 'highScore' + currentLanguage.charAt(0).toUpperCase() + currentLanguage.slice(1); var currentHighScore = storage[highScoreKey] || 0; if (currentScore > currentHighScore) { storage[highScoreKey] = currentScore; } // Show game over LK.showGameOver(); } // Play wrong sound if music is enabled if (musicEnabled) { LK.getSound('wrongWord').play(); } // Flash screen red LK.effects.flashScreen(0xFF1744, 500); } // Function to show high scores when game is paused function showHighScores() { // Get high scores for all languages var highScoreEs = storage.highScoreEs || 0; var highScoreEn = storage.highScoreEn || 0; var highScoreFr = storage.highScoreFr || 0; // Create high score display container var highScoreContainer = new Container(); highScoreContainer.x = -400; highScoreContainer.y = 300; LK.gui.topRight.addChild(highScoreContainer); // Title var titleText = new Text2('High Scores:', { size: 40, fill: 0xFFFFFF }); titleText.anchor.set(1, 0); titleText.x = -20; titleText.y = 0; highScoreContainer.addChild(titleText); // Spanish high score var esText = new Text2('Español: ' + highScoreEs, { size: 32, fill: 0xFFFFFF }); esText.anchor.set(1, 0); esText.x = -20; esText.y = 50; highScoreContainer.addChild(esText); // English high score var enText = new Text2('English: ' + highScoreEn, { size: 32, fill: 0xFFFFFF }); enText.anchor.set(1, 0); enText.x = -20; enText.y = 90; highScoreContainer.addChild(enText); // French high score var frText = new Text2('Français: ' + highScoreFr, { size: 32, fill: 0xFFFFFF }); frText.anchor.set(1, 0); frText.x = -20; frText.y = 130; highScoreContainer.addChild(frText); return highScoreContainer; } // Store reference to high score display var highScoreDisplay = null; // Game pause handler LK.on('pause', function () { if (!highScoreDisplay) { highScoreDisplay = showHighScores(); } }); // Game resume handler LK.on('resume', function () { if (highScoreDisplay) { highScoreDisplay.destroy(); highScoreDisplay = null; } }); // Game update loop game.update = function () { // Only update game logic when playing if (gameState !== 'playing') { return; } // Spawn new words wordSpawnTimer++; if (wordSpawnTimer >= spawnInterval) { spawnWord(); wordSpawnTimer = 0; } // Update and check words for (var i = words.length - 1; i >= 0; i--) { var word = words[i]; // Check if word reached bottom if (word.y > 2732 + 50) { if (!word.missed) { word.missed = true; // Only lose life if it's not a misspelled word if (!(word instanceof MisspelledWord)) { loseLife(); } } word.destroy(); words.splice(i, 1); } } // Increase speed every 20 points var speedLevel = Math.floor(LK.getScore() / 20); currentSpeed = 2 + speedLevel * 0.5; // Decrease spawn interval slightly as speed increases spawnInterval = Math.max(60, 120 - speedLevel * 5); // Change background color when speed level increases if (speedLevel !== lastSpeedLevel) { currentColorIndex = speedLevel % backgroundColors.length; var targetColor = backgroundColors[currentColorIndex]; // Simple immediate color change - tween doesn't work well with color interpolation in this context game.setBackgroundColor(targetColor); lastSpeedLevel = speedLevel; } };
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var Heart = Container.expand(function () {
var self = Container.call(this);
var heartGraphic = self.attachAsset('heart', {
anchorX: 0.5,
anchorY: 0.5
});
return self;
});
var LanguageButton = Container.expand(function () {
var self = Container.call(this);
// Create button background
var buttonBg = self.attachAsset('wordBubble', {
anchorX: 0.5,
anchorY: 0.5
});
buttonBg.width = 300;
buttonBg.height = 90;
// Create text for the button
self.buttonText = new Text2('Español', {
size: 48,
fill: 0xFFFFFF
});
self.buttonText.anchor.set(0.5, 0.5);
self.addChild(self.buttonText);
self.setLanguage = function (lang) {
if (lang === 'es') {
self.buttonText.setText('Español');
} else if (lang === 'en') {
self.buttonText.setText('English');
} else if (lang === 'fr') {
self.buttonText.setText('Français');
}
};
// Touch handler for language cycling
self.down = function (x, y, obj) {
// Cycle through languages
if (currentLanguage === 'es') {
currentLanguage = 'en';
} else if (currentLanguage === 'en') {
currentLanguage = 'fr';
} else {
currentLanguage = 'es';
}
// Save language preference
storage.selectedLanguage = currentLanguage;
// Update button text
self.setLanguage(currentLanguage);
// Update word categories
updateWordCategories();
// Visual feedback
LK.effects.flashObject(self, 0xFFEB3B, 300);
};
return self;
});
var MisspelledWord = Container.expand(function () {
var self = Container.call(this);
// Create word bubble background
var bubble = self.attachAsset('wordBubble', {
anchorX: 0.5,
anchorY: 0.5
});
// Create text for the word
self.wordText = new Text2('', {
size: 72,
fill: 0xFFFFFF
});
self.wordText.anchor.set(0.5, 0.5);
self.addChild(self.wordText);
// Word properties
self.fallSpeed = 2;
self.word = '';
self.missed = false;
// Set the word text
self.setWord = function (word) {
self.word = word;
self.wordText.setText(word);
};
// Update method called every frame
self.update = function () {
self.y += self.fallSpeed;
};
// Touch handler - touching misspelled word reduces life
self.down = function (x, y, obj) {
if (!self.missed) {
// Misspelled word was touched - lose a life
loseLife();
// Visual effect
LK.effects.flashObject(self, 0xFF1744, 300);
tween(self, {
scaleX: 1.5,
scaleY: 1.5,
alpha: 0
}, {
duration: 300,
onFinish: function onFinish() {
self.destroy();
}
});
// Remove from words array
for (var i = words.length - 1; i >= 0; i--) {
if (words[i] === self) {
words.splice(i, 1);
break;
}
}
}
};
return self;
});
var MusicToggleButton = Container.expand(function () {
var self = Container.call(this);
// Create button background
var buttonBg = self.attachAsset('wordBubble', {
anchorX: 0.5,
anchorY: 0.5
});
buttonBg.width = 300;
buttonBg.height = 90;
// Create text for the button
self.buttonText = new Text2('Música ON', {
size: 48,
fill: 0xFFFFFF
});
self.buttonText.anchor.set(0.5, 0.5);
self.addChild(self.buttonText);
// Update button text based on music state
self.updateText = function () {
if (musicEnabled) {
self.buttonText.setText('Música ON');
} else {
self.buttonText.setText('Música OFF');
}
};
// Touch handler for music toggle
self.down = function (x, y, obj) {
// Toggle music state
musicEnabled = !musicEnabled;
// Save music preference
storage.musicEnabled = musicEnabled;
// Update button text
self.updateText();
// Control music playback
if (musicEnabled) {
LK.playMusic('backgroundMusic');
} else {
LK.stopMusic();
}
// Visual feedback
LK.effects.flashObject(self, 0xFFEB3B, 300);
};
return self;
});
var Word = Container.expand(function () {
var self = Container.call(this);
// Create word bubble background
var bubble = self.attachAsset('wordBubble', {
anchorX: 0.5,
anchorY: 0.5
});
// Create text for the word
self.wordText = new Text2('', {
size: 72,
fill: 0xFFFFFF
});
self.wordText.anchor.set(0.5, 0.5);
self.addChild(self.wordText);
// Word properties
self.fallSpeed = 2;
self.word = '';
self.missed = false;
// Set the word text
self.setWord = function (word) {
self.word = word;
self.wordText.setText(word);
};
// Update method called every frame
self.update = function () {
self.y += self.fallSpeed;
};
// Touch handler
self.down = function (x, y, obj) {
if (!self.missed) {
// Word was touched correctly
LK.setScore(LK.getScore() + 10);
scoreText.setText(LK.getScore());
// Visual effect
LK.effects.flashObject(self, 0xFFEB3B, 300);
tween(self, {
scaleX: 1.5,
scaleY: 1.5,
alpha: 0
}, {
duration: 300,
onFinish: function onFinish() {
self.destroy();
}
});
// Play sound if music is enabled
if (musicEnabled) {
LK.getSound('correctWord').play();
}
// Remove from words array
for (var i = words.length - 1; i >= 0; i--) {
if (words[i] === self) {
words.splice(i, 1);
break;
}
}
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x1976D2
});
/****
* Game Code
****/
// Game state management
var gameState = 'playing'; // 'menu' or 'playing'
// Game variables
var words = [];
var lives = 3;
var hearts = [];
var currentSpeed = 2;
var wordSpawnTimer = 0;
var spawnInterval = 120; // Spawn every 2 seconds at 60 FPS
var backgroundColors = [0x1976D2, 0x7B1FA2, 0xD32F2F, 0xF57C00, 0x388E3C, 0x1976D2];
var currentColorIndex = 0;
var lastSpeedLevel = 0;
// Language system
var currentLanguage = storage.selectedLanguage || 'es';
var languageButton;
var musicToggleButton;
var scoreText;
var livesContainer;
// Music system
var musicEnabled = storage.musicEnabled !== undefined ? storage.musicEnabled : true;
// Multi-language words by category
var allLanguageWords = {
es: {
animales: ['gato', 'perro', 'pájaro', 'pez', 'león', 'tigre', 'oso', 'ratón'],
colores: ['rojo', 'azul', 'verde', 'amarillo', 'naranja', 'morado', 'rosa', 'negro'],
comida: ['manzana', 'pan', 'agua', 'leche', 'queso', 'pollo', 'arroz', 'pasta'],
objetos: ['mesa', 'silla', 'libro', 'lápiz', 'coche', 'casa', 'puerta', 'ventana']
},
en: {
animals: ['cat', 'dog', 'bird', 'fish', 'lion', 'tiger', 'bear', 'mouse'],
colors: ['red', 'blue', 'green', 'yellow', 'orange', 'purple', 'pink', 'black'],
food: ['apple', 'bread', 'water', 'milk', 'cheese', 'chicken', 'rice', 'pasta'],
objects: ['table', 'chair', 'book', 'pencil', 'car', 'house', 'door', 'window']
},
fr: {
animaux: ['chat', 'chien', 'oiseau', 'poisson', 'lion', 'tigre', 'ours', 'souris'],
couleurs: ['rouge', 'bleu', 'vert', 'jaune', 'orange', 'violet', 'rose', 'noir'],
nourriture: ['pomme', 'pain', 'eau', 'lait', 'fromage', 'poulet', 'riz', 'pâtes'],
objets: ['table', 'chaise', 'livre', 'crayon', 'voiture', 'maison', 'porte', 'fenêtre']
}
};
// Misspelled words for each language
var misspelledWords = {
es: ['gto', 'prero', 'pájro', 'pz', 'leó', 'tigr', 'os', 'rató', 'rjo', 'azl', 'verd', 'amarilo'],
en: ['ct', 'dg', 'brd', 'fsh', 'lin', 'tigr', 'ber', 'mous', 'rd', 'blu', 'gren', 'yelow'],
fr: ['cht', 'chin', 'oisa', 'poisso', 'lin', 'tigr', 'ous', 'souri', 'roug', 'ble', 'vrt', 'jaun']
};
var wordCategories = {};
var allWords = [];
var misspelledWordsArray = [];
// Function to update word categories based on current language
function updateWordCategories() {
wordCategories = allLanguageWords[currentLanguage];
allWords = [];
for (var category in wordCategories) {
allWords = allWords.concat(wordCategories[category]);
}
misspelledWordsArray = misspelledWords[currentLanguage] || [];
}
// Initialize with current language
updateWordCategories();
// Function to start the game
function startGame() {
gameState = 'playing';
// Reset game variables
words = [];
lives = 3;
currentSpeed = 2;
wordSpawnTimer = 0;
currentColorIndex = 0;
lastSpeedLevel = 0;
LK.setScore(0);
// Show game UI
showGameUI();
// Reset hearts
for (var i = 0; i < hearts.length; i++) {
hearts[i].alpha = 1;
}
// Update score display
if (scoreText) {
scoreText.setText(LK.getScore());
}
// Start spawning words immediately
spawnWord();
// Play background music if enabled
if (musicEnabled) {
LK.playMusic('backgroundMusic');
}
console.log("Game started, state:", gameState);
}
// Function to cycle language
function cycleLanguage() {
if (currentLanguage === 'es') {
currentLanguage = 'en';
} else if (currentLanguage === 'en') {
currentLanguage = 'fr';
} else {
currentLanguage = 'es';
}
// Save language preference
storage.selectedLanguage = currentLanguage;
// Update word categories
updateWordCategories();
// Update language button if visible
if (languageButton) {
languageButton.setLanguage(currentLanguage);
}
}
// Function to show game UI
function showGameUI() {
if (scoreText) {
scoreText.visible = true;
}
if (livesContainer) {
livesContainer.visible = true;
}
if (languageButton) {
languageButton.visible = true;
}
if (musicToggleButton) {
musicToggleButton.visible = true;
}
}
// Function to hide game UI
function hideGameUI() {
if (scoreText) {
scoreText.visible = false;
}
if (livesContainer) {
livesContainer.visible = false;
}
if (languageButton) {
languageButton.visible = false;
}
if (musicToggleButton) {
musicToggleButton.visible = false;
}
}
// Score display
scoreText = new Text2('0', {
size: 60,
fill: 0xFFFFFF
});
scoreText.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreText);
scoreText.y = 50;
// Lives display - Create a container for hearts with better positioning
livesContainer = new Container();
livesContainer.x = -200; // Offset to position hearts better in top right
livesContainer.y = 50;
LK.gui.topRight.addChild(livesContainer);
// Add hearts to the lives container
for (var i = 0; i < 3; i++) {
var heart = new Heart();
heart.x = i * 80;
heart.y = 0;
hearts.push(heart);
livesContainer.addChild(heart);
}
// Add "Lives:" label next to hearts
var livesLabel = new Text2('Lives:', {
size: 60,
fill: 0xFFFFFF
});
livesLabel.anchor.set(1, 0.5);
livesLabel.x = -20;
livesLabel.y = 0;
livesContainer.addChild(livesLabel);
// Language selection button
languageButton = new LanguageButton();
languageButton.x = -150;
languageButton.y = 150;
languageButton.setLanguage(currentLanguage);
LK.gui.topRight.addChild(languageButton);
// Music toggle button
musicToggleButton = new MusicToggleButton();
musicToggleButton.x = -150;
musicToggleButton.y = 220;
musicToggleButton.updateText();
LK.gui.topRight.addChild(musicToggleButton);
// Start game immediately
startGame();
// Function to spawn a new word
function spawnWord() {
var word;
// 20% chance to spawn a misspelled word
if (Math.random() < 0.2 && misspelledWordsArray.length > 0) {
word = new MisspelledWord();
var randomMisspelledWord = misspelledWordsArray[Math.floor(Math.random() * misspelledWordsArray.length)];
word.setWord(randomMisspelledWord);
} else {
word = new Word();
var randomWord = allWords[Math.floor(Math.random() * allWords.length)];
word.setWord(randomWord);
}
// Random horizontal position
word.x = Math.random() * (2048 - 300) + 150;
word.y = -100;
word.fallSpeed = currentSpeed;
words.push(word);
game.addChild(word);
}
// Function to lose a life
function loseLife() {
lives--;
if (lives >= 0 && lives < hearts.length) {
hearts[lives].alpha = 0.3;
}
if (lives <= 0) {
// Save high score before game over
var currentScore = LK.getScore();
var highScoreKey = 'highScore' + currentLanguage.charAt(0).toUpperCase() + currentLanguage.slice(1);
var currentHighScore = storage[highScoreKey] || 0;
if (currentScore > currentHighScore) {
storage[highScoreKey] = currentScore;
}
// Show game over
LK.showGameOver();
}
// Play wrong sound if music is enabled
if (musicEnabled) {
LK.getSound('wrongWord').play();
}
// Flash screen red
LK.effects.flashScreen(0xFF1744, 500);
}
// Function to show high scores when game is paused
function showHighScores() {
// Get high scores for all languages
var highScoreEs = storage.highScoreEs || 0;
var highScoreEn = storage.highScoreEn || 0;
var highScoreFr = storage.highScoreFr || 0;
// Create high score display container
var highScoreContainer = new Container();
highScoreContainer.x = -400;
highScoreContainer.y = 300;
LK.gui.topRight.addChild(highScoreContainer);
// Title
var titleText = new Text2('High Scores:', {
size: 40,
fill: 0xFFFFFF
});
titleText.anchor.set(1, 0);
titleText.x = -20;
titleText.y = 0;
highScoreContainer.addChild(titleText);
// Spanish high score
var esText = new Text2('Español: ' + highScoreEs, {
size: 32,
fill: 0xFFFFFF
});
esText.anchor.set(1, 0);
esText.x = -20;
esText.y = 50;
highScoreContainer.addChild(esText);
// English high score
var enText = new Text2('English: ' + highScoreEn, {
size: 32,
fill: 0xFFFFFF
});
enText.anchor.set(1, 0);
enText.x = -20;
enText.y = 90;
highScoreContainer.addChild(enText);
// French high score
var frText = new Text2('Français: ' + highScoreFr, {
size: 32,
fill: 0xFFFFFF
});
frText.anchor.set(1, 0);
frText.x = -20;
frText.y = 130;
highScoreContainer.addChild(frText);
return highScoreContainer;
}
// Store reference to high score display
var highScoreDisplay = null;
// Game pause handler
LK.on('pause', function () {
if (!highScoreDisplay) {
highScoreDisplay = showHighScores();
}
});
// Game resume handler
LK.on('resume', function () {
if (highScoreDisplay) {
highScoreDisplay.destroy();
highScoreDisplay = null;
}
});
// Game update loop
game.update = function () {
// Only update game logic when playing
if (gameState !== 'playing') {
return;
}
// Spawn new words
wordSpawnTimer++;
if (wordSpawnTimer >= spawnInterval) {
spawnWord();
wordSpawnTimer = 0;
}
// Update and check words
for (var i = words.length - 1; i >= 0; i--) {
var word = words[i];
// Check if word reached bottom
if (word.y > 2732 + 50) {
if (!word.missed) {
word.missed = true;
// Only lose life if it's not a misspelled word
if (!(word instanceof MisspelledWord)) {
loseLife();
}
}
word.destroy();
words.splice(i, 1);
}
}
// Increase speed every 20 points
var speedLevel = Math.floor(LK.getScore() / 20);
currentSpeed = 2 + speedLevel * 0.5;
// Decrease spawn interval slightly as speed increases
spawnInterval = Math.max(60, 120 - speedLevel * 5);
// Change background color when speed level increases
if (speedLevel !== lastSpeedLevel) {
currentColorIndex = speedLevel % backgroundColors.length;
var targetColor = backgroundColors[currentColorIndex];
// Simple immediate color change - tween doesn't work well with color interpolation in this context
game.setBackgroundColor(targetColor);
lastSpeedLevel = speedLevel;
}
};