User prompt
add a 1
User prompt
add a 0
User prompt
add all the number 1 2 3 4 5 6 7 8 9
User prompt
make a keyboard with only numbers \ to right the answer
User prompt
try to make it only with numbers
User prompt
make a text bar appear when you right
User prompt
IF YOU PRESS THE READ BUTTON IT WILL TEACH YOU HOW TO READ
User prompt
MAKE THERE A BUTTON FOR HOW TO READ
User prompt
Please fix the bug: 'Script error.' in or related to this line: 'setTimeout(function () {' Line Number: 484
User prompt
I can not right on †he text bar
User prompt
make the text bar work
User prompt
make it written text
User prompt
make the text bar able to right one
User prompt
make the text bar usable
Code edit (1 edits merged)
Please save this source code
User prompt
Math & Write Adventure
Initial prompt
learn it is a kids game that teach you math and how to right
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ var CelebrationStar = Container.expand(function () { var self = Container.call(this); var starGraphic = self.attachAsset('star', { anchorX: 0.5, anchorY: 0.5 }); self.startAnimation = function () { self.alpha = 1; self.scaleX = 0.1; self.scaleY = 0.1; tween(self, { scaleX: 1.5, scaleY: 1.5 }, { duration: 500, easing: tween.easeOut, onFinish: function onFinish() { tween(self, { alpha: 0, scaleX: 0.5, scaleY: 0.5 }, { duration: 500, easing: tween.easeIn, onFinish: function onFinish() { self.destroy(); } }); } }); }; return self; }); var MathProblem = Container.expand(function () { var self = Container.call(this); self.num1 = 0; self.num2 = 0; self.operation = '+'; self.answer = 0; self.difficulty = 1; self.generateProblem = function () { var maxNum = Math.min(10, 5 + self.difficulty * 2); self.num1 = Math.floor(Math.random() * maxNum) + 1; self.num2 = Math.floor(Math.random() * maxNum) + 1; var operations = ['+', '-']; if (self.difficulty > 3) { operations.push('×'); operations.push('×'); // Add multiplication twice to make it more likely } self.operation = operations[Math.floor(Math.random() * operations.length)]; if (self.operation === '-' && self.num1 < self.num2) { var temp = self.num1; self.num1 = self.num2; self.num2 = temp; } switch (self.operation) { case '+': self.answer = self.num1 + self.num2; break; case '-': self.answer = self.num1 - self.num2; break; case '×': self.answer = self.num1 * self.num2; break; } }; self.getProblemText = function () { return self.num1 + ' ' + self.operation + ' ' + self.num2 + ' = ?'; }; return self; }); var WritingArea = Container.expand(function () { var self = Container.call(this); var areaBackground = self.attachAsset('writingArea', { anchorX: 0.5, anchorY: 0.5 }); self.drawingPath = []; self.isDrawing = false; self.writtenAnswer = ''; self.startDrawing = function (x, y) { self.isDrawing = true; self.drawingPath = []; var localPos = self.toLocal({ x: x, y: y }); self.drawingPath.push({ x: localPos.x, y: localPos.y }); self.addDrawingDot(localPos.x, localPos.y); // Show text bar when writing starts textBar.alpha = 1; }; self.continueDrawing = function (x, y) { if (self.isDrawing) { var localPos = self.toLocal({ x: x, y: y }); self.drawingPath.push({ x: localPos.x, y: localPos.y }); self.addDrawingDot(localPos.x, localPos.y); } }; self.stopDrawing = function () { self.isDrawing = false; self.recognizeNumber(); }; self.addDrawingDot = function (x, y) { var dot = self.addChild(LK.getAsset('drawingDot', { anchorX: 0.5, anchorY: 0.5 })); dot.x = x; dot.y = y; }; self.recognizeNumber = function () { if (self.drawingPath.length > 3) { var bounds = self.getDrawingBounds(); var recognizedChar = self.simpleNumberRecognition(bounds); if (recognizedChar !== null) { self.writtenAnswer += recognizedChar; // Append characters to build text answerText.setText(self.writtenAnswer); // Show text bar when text is recognized textBar.alpha = 1; // Clear the drawing path after recognition to prepare for next character self.clearCurrentDrawing(); } } }; self.getDrawingBounds = function () { if (self.drawingPath.length === 0) return null; var minX = self.drawingPath[0].x; var maxX = self.drawingPath[0].x; var minY = self.drawingPath[0].y; var maxY = self.drawingPath[0].y; for (var i = 1; i < self.drawingPath.length; i++) { var point = self.drawingPath[i]; minX = Math.min(minX, point.x); maxX = Math.max(maxX, point.x); minY = Math.min(minY, point.y); maxY = Math.max(maxY, point.y); } return { minX: minX, maxX: maxX, minY: minY, maxY: maxY, width: maxX - minX, height: maxY - minY }; }; self.simpleNumberRecognition = function (bounds) { if (!bounds || bounds.width < 10 || bounds.height < 10) { feedbackText.setText('Draw bigger'); feedbackText.tint = 0xFFA500; LK.setTimeout(function () { feedbackText.setText(''); }, 1000); return null; } var aspectRatio = bounds.width / bounds.height; var pathLength = self.drawingPath.length; var recognizedChar = null; // Numbers - more lenient recognition if (aspectRatio > 2.0 || aspectRatio < 0.8 && pathLength > 20) recognizedChar = '1';else if (aspectRatio > 0.7 && aspectRatio < 1.3 && pathLength > 25) recognizedChar = '0';else if (pathLength > 20 && pathLength < 55 && aspectRatio > 0.5) recognizedChar = '2';else if (pathLength > 15 && pathLength < 45 && aspectRatio > 0.6) recognizedChar = '3';else if (pathLength > 10 && pathLength < 40) recognizedChar = '4';else if (pathLength > 20 && pathLength < 60 && aspectRatio > 0.5) recognizedChar = '5';else if (pathLength > 25 && pathLength < 65 && aspectRatio > 0.6) recognizedChar = '6';else if (pathLength > 10 && pathLength < 35 && aspectRatio > 0.4) recognizedChar = '7';else if (pathLength > 30 && pathLength < 75) recognizedChar = '8';else if (pathLength > 25 && pathLength < 70 && aspectRatio > 0.5) recognizedChar = '9'; if (recognizedChar) { feedbackText.setText('Recognized: ' + recognizedChar); feedbackText.tint = 0x32CD32; LK.setTimeout(function () { feedbackText.setText(''); }, 500); return recognizedChar; } // Fallback - show a hint about drawing more clearly feedbackText.setText('Draw more clearly'); feedbackText.tint = 0xFFA500; LK.setTimeout(function () { feedbackText.setText(''); }, 1000); return null; }; self.clearCurrentDrawing = function () { for (var i = self.children.length - 1; i >= 0; i--) { var child = self.children[i]; if (child !== areaBackground) { child.destroy(); } } self.drawingPath = []; }; self.clearDrawing = function () { for (var i = self.children.length - 1; i >= 0; i--) { var child = self.children[i]; if (child !== areaBackground) { child.destroy(); } } self.drawingPath = []; self.writtenAnswer = ''; answerText.setText(''); // Hide text bar when clearing textBar.alpha = 0; }; self.backspace = function () { if (self.writtenAnswer.length > 0) { self.writtenAnswer = self.writtenAnswer.slice(0, -1); answerText.setText(self.writtenAnswer); // Hide text bar if no text remains if (self.writtenAnswer.length === 0) { textBar.alpha = 0; } } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x87CEEB }); /**** * Game Code ****/ var currentProblem = new MathProblem(); var writingArea = new WritingArea(); var gameState = 'playing'; var screenState = 'home'; // Track current screen: 'home', 'game', 'lesson_menu', 'lesson_content' var correctAnswers = 0; var level = storage.level || 1; var celebrationStars = []; currentProblem.difficulty = level; currentProblem.generateProblem(); var background = game.addChild(LK.getAsset('background', { anchorX: 0, anchorY: 0 })); var problemBox = game.addChild(LK.getAsset('problemBox', { anchorX: 0.5, anchorY: 0.5 })); problemBox.x = 1024; problemBox.y = 600; var problemText = new Text2(currentProblem.getProblemText(), { size: 120, fill: 0x333333 }); problemText.anchor.set(0.5, 0.5); problemText.x = 1024; problemText.y = 600; game.addChild(problemText); writingArea.x = 1024; writingArea.y = 1200; game.addChild(writingArea); var instructionText = new Text2('Write your answer below:', { size: 80, fill: 0x444444 }); instructionText.anchor.set(0.5, 0.5); instructionText.x = 1024; instructionText.y = 950; game.addChild(instructionText); var textBar = game.addChild(LK.getAsset('writingArea', { anchorX: 0.5, anchorY: 0.5 })); textBar.x = 1024; textBar.y = 1450; textBar.alpha = 0; textBar.tint = 0xE6F3FF; var answerText = new Text2('', { size: 150, fill: 0x000000 }); answerText.anchor.set(0.5, 0.5); answerText.x = 1024; answerText.y = 1450; game.addChild(answerText); var submitButton = game.addChild(LK.getAsset('submitButton', { anchorX: 0.5, anchorY: 0.5 })); submitButton.x = 800; submitButton.y = 1600; var submitButtonText = new Text2('Check', { size: 60, fill: 0xFFFFFF }); submitButtonText.anchor.set(0.5, 0.5); submitButtonText.x = 800; submitButtonText.y = 1600; game.addChild(submitButtonText); var clearButton = game.addChild(LK.getAsset('submitButton', { anchorX: 0.5, anchorY: 0.5 })); clearButton.x = 1150; clearButton.y = 1600; clearButton.tint = 0xFF6B6B; var clearButtonText = new Text2('Clear', { size: 60, fill: 0xFFFFFF }); clearButtonText.anchor.set(0.5, 0.5); clearButtonText.x = 1150; clearButtonText.y = 1600; game.addChild(clearButtonText); var nextButton = game.addChild(LK.getAsset('nextButton', { anchorX: 0.5, anchorY: 0.5 })); nextButton.x = 1024; nextButton.y = 1900; nextButton.alpha = 0; var nextButtonText = new Text2('Next Problem', { size: 60, fill: 0xFFFFFF }); nextButtonText.anchor.set(0.5, 0.5); nextButtonText.x = 1024; nextButtonText.y = 1900; nextButtonText.alpha = 0; game.addChild(nextButtonText); var feedbackText = new Text2('', { size: 80, fill: 0x32CD32 }); feedbackText.anchor.set(0.5, 0.5); feedbackText.x = 1024; feedbackText.y = 1750; game.addChild(feedbackText); var scoreText = new Text2('Score: 0', { size: 60, fill: 0xFFFFFF }); scoreText.anchor.set(0.5, 0); LK.gui.top.addChild(scoreText); var levelText = new Text2('Level: ' + level, { size: 60, fill: 0xFFFFFF }); levelText.anchor.set(1, 0); LK.gui.topRight.addChild(levelText); levelText.x = -120; var howToReadButton = game.addChild(LK.getAsset('howToReadButton', { anchorX: 0.5, anchorY: 0.5 })); howToReadButton.x = 1750; howToReadButton.y = 1600; var howToReadButtonText = new Text2('Right', { size: 50, fill: 0xFFFFFF }); howToReadButtonText.anchor.set(0.5, 0.5); howToReadButtonText.x = 1750; howToReadButtonText.y = 1600; game.addChild(howToReadButtonText); var mathHomeButton = game.addChild(LK.getAsset('homeButton', { anchorX: 0.5, anchorY: 0.5 })); mathHomeButton.x = 1750; mathHomeButton.y = 1700; mathHomeButton.alpha = 0; var mathHomeButtonText = new Text2('Home', { size: 40, fill: 0xFFFFFF }); mathHomeButtonText.anchor.set(0.5, 0.5); mathHomeButtonText.x = 1750; mathHomeButtonText.y = 1700; mathHomeButtonText.alpha = 0; game.addChild(mathHomeButtonText); var instructionPanel = game.addChild(LK.getAsset('instructionPanel', { anchorX: 0.5, anchorY: 0.5 })); instructionPanel.x = 1024; instructionPanel.y = 1366; instructionPanel.alpha = 0; var instructionTitle = new Text2('How to Read Math Problems', { size: 100, fill: 0x333333 }); instructionTitle.anchor.set(0.5, 0.5); instructionTitle.x = 1024; instructionTitle.y = 900; instructionTitle.alpha = 0; game.addChild(instructionTitle); var instructionContent = new Text2('• Look at the math problem carefully\n• Read each number and symbol from left to right\n• + means add the numbers together\n• - means subtract the second from the first\n• × means multiply the numbers\n• = means "equals" - find what number comes after\n• Practice reading math problems out loud', { size: 70, fill: 0x444444 }); instructionContent.anchor.set(0.5, 0.5); instructionContent.x = 1024; instructionContent.y = 1300; instructionContent.alpha = 0; game.addChild(instructionContent); var closeButton = game.addChild(LK.getAsset('closeButton', { anchorX: 0.5, anchorY: 0.5 })); closeButton.x = 1024; closeButton.y = 1700; closeButton.alpha = 0; var closeButtonText = new Text2('Close', { size: 50, fill: 0xFFFFFF }); closeButtonText.anchor.set(0.5, 0.5); closeButtonText.x = 1024; closeButtonText.y = 1700; closeButtonText.alpha = 0; game.addChild(closeButtonText); var showingInstructions = false; var showingLessonMenu = false; var currentLessonType = ''; var showingWritingLesson = false; var writingPrompt = ''; var writingAnswer = ''; function checkAnswer() { var userAnswer = writingArea.writtenAnswer.trim(); var correctAnswer = currentProblem.answer.toString(); if (userAnswer === correctAnswer) { feedbackText.setText('Correct! Great job!'); feedbackText.tint = 0x32CD32; LK.getSound('correct').play(); correctAnswers++; LK.setScore(LK.getScore() + 10 * level); scoreText.setText('Score: ' + LK.getScore()); createCelebrationStars(); nextButton.alpha = 1; nextButtonText.alpha = 1; gameState = 'correct'; if (correctAnswers >= 5) { level++; storage.level = level; levelText.setText('Level: ' + level); currentProblem.difficulty = level; correctAnswers = 0; LK.setTimeout(function () { feedbackText.setText('Level Up! Well done!'); LK.getSound('celebration').play(); }, 1000); } } else { feedbackText.setText('Try again! The answer is ' + correctAnswer); feedbackText.tint = 0xFF6B6B; LK.getSound('incorrect').play(); LK.setTimeout(function () { feedbackText.setText(''); writingArea.clearDrawing(); }, 2000); } } function createCelebrationStars() { for (var i = 0; i < 5; i++) { var star = new CelebrationStar(); star.x = 1024 + (Math.random() - 0.5) * 600; star.y = 1200 + (Math.random() - 0.5) * 400; celebrationStars.push(star); game.addChild(star); LK.setTimeout(function (starToAnimate) { return function () { starToAnimate.startAnimation(); }; }(star), i * 100); } } function nextProblem() { currentProblem.generateProblem(); problemText.setText(currentProblem.getProblemText()); writingArea.clearDrawing(); feedbackText.setText(''); nextButton.alpha = 0; nextButtonText.alpha = 0; gameState = 'playing'; } game.down = function (x, y, obj) { if (gameState === 'playing') { // Check if touch is within writing area bounds using proper coordinate system var areaX = writingArea.x - 800; // writingArea width is 1600, so half is 800 var areaY = writingArea.y - 200; // writingArea height is 400, so half is 200 var areaWidth = 1600; var areaHeight = 400; if (x >= areaX && x <= areaX + areaWidth && y >= areaY && y <= areaY + areaHeight) { writingArea.startDrawing(x, y); } } if (showingWritingLesson) { // Check if touch is within writing lesson area bounds var lessonAreaX = writingLessonArea.x - 800; var lessonAreaY = writingLessonArea.y - 200; var lessonAreaWidth = 1600; var lessonAreaHeight = 400; if (x >= lessonAreaX && x <= lessonAreaX + lessonAreaWidth && y >= lessonAreaY && y <= lessonAreaY + lessonAreaHeight) { writingLessonArea.startDrawing(x, y); } } }; game.move = function (x, y, obj) { if (gameState === 'playing') { writingArea.continueDrawing(x, y); } if (showingWritingLesson) { writingLessonArea.continueDrawing(x, y); } }; game.up = function (x, y, obj) { if (gameState === 'playing') { writingArea.stopDrawing(); } if (showingWritingLesson) { writingLessonArea.stopDrawing(); writingLessonAnswerText.setText(writingLessonArea.writtenAnswer); } }; submitButton.down = function (x, y, obj) { if (gameState === 'playing' && writingArea.writtenAnswer !== '') { checkAnswer(); } }; clearButton.down = function (x, y, obj) { if (gameState === 'playing') { writingArea.clearDrawing(); feedbackText.setText(''); } }; nextButton.down = function (x, y, obj) { if (gameState === 'correct') { nextProblem(); } }; howToReadButton.down = function (x, y, obj) { if (!showingInstructions && !showingLessonMenu && !showingWritingLesson && screenState === 'game') { showWritingLesson(); } }; closeButton.down = function (x, y, obj) { if (showingInstructions) { showingInstructions = false; instructionPanel.alpha = 0; instructionTitle.alpha = 0; instructionContent.alpha = 0; closeButton.alpha = 0; closeButtonText.alpha = 0; } }; // Create number keyboard var keyboardNumbers = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0']; var keyboardButtons = []; var keyboardTexts = []; // Create letter keyboard var keyboardLetters = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']; var letterKeyboardButtons = []; var letterKeyboardTexts = []; // Create keyboard background var keyboardBackground = game.addChild(LK.getAsset('instructionPanel', { anchorX: 0.5, anchorY: 0.5 })); keyboardBackground.x = 1024; keyboardBackground.y = 2200; keyboardBackground.width = 800; keyboardBackground.height = 400; keyboardBackground.tint = 0xE0E0E0; // Create number buttons in a 3x4 grid (3 columns, 4 rows) for (var i = 0; i < keyboardNumbers.length; i++) { var number = keyboardNumbers[i]; var col = i % 3; var row = Math.floor(i / 3); // Special case for 0 - center it in the bottom row if (number === '0') { col = 1; row = 3; } var button = game.addChild(LK.getAsset('submitButton', { anchorX: 0.5, anchorY: 0.5 })); button.x = 1024 + (col - 1) * 150; button.y = 2100 + row * 100; button.width = 120; button.height = 80; button.tint = 0x4169E1; var buttonText = new Text2(number, { size: 50, fill: 0xFFFFFF }); buttonText.anchor.set(0.5, 0.5); buttonText.x = button.x; buttonText.y = button.y; game.addChild(buttonText); keyboardButtons.push(button); keyboardTexts.push(buttonText); } // Add event handlers for number buttons for (var i = 0; i < keyboardButtons.length; i++) { (function (index) { keyboardButtons[index].down = function (x, y, obj) { if (gameState === 'playing') { var number = keyboardNumbers[index]; writingArea.writtenAnswer += number; answerText.setText(writingArea.writtenAnswer); textBar.alpha = 1; feedbackText.setText(''); } }; })(i); } // Create letter keyboard background var letterKeyboardBackground = game.addChild(LK.getAsset('instructionPanel', { anchorX: 0.5, anchorY: 0.5 })); letterKeyboardBackground.x = 1024; letterKeyboardBackground.y = 2450; letterKeyboardBackground.width = 1800; letterKeyboardBackground.height = 300; letterKeyboardBackground.tint = 0xE0E0E0; letterKeyboardBackground.alpha = 0; // Create letter buttons in rows (QWERTY-like layout but alphabetical) for (var i = 0; i < keyboardLetters.length; i++) { var letter = keyboardLetters[i]; var col = i % 9; // 9 letters per row var row = Math.floor(i / 9); var button = game.addChild(LK.getAsset('submitButton', { anchorX: 0.5, anchorY: 0.5 })); button.x = 1024 + (col - 4) * 180; // Center the row button.y = 2350 + row * 80; button.width = 160; button.height = 70; button.tint = 0x9370DB; button.alpha = 0; var buttonText = new Text2(letter, { size: 40, fill: 0xFFFFFF }); buttonText.anchor.set(0.5, 0.5); buttonText.x = button.x; buttonText.y = button.y; buttonText.alpha = 0; game.addChild(buttonText); letterKeyboardButtons.push(button); letterKeyboardTexts.push(buttonText); } // Add event handlers for letter buttons for (var i = 0; i < letterKeyboardButtons.length; i++) { (function (index) { letterKeyboardButtons[index].down = function (x, y, obj) { if (showingWritingLesson) { var letter = keyboardLetters[index].toLowerCase(); writingLessonArea.writtenAnswer += letter; writingLessonAnswerText.setText(writingLessonArea.writtenAnswer); writingLessonTextBar.alpha = 1; writingFeedbackText.setText(''); } }; })(i); } // Create lesson button in bottom right var lessonButton = game.addChild(LK.getAsset('howToReadButton', { anchorX: 0.5, anchorY: 0.5 })); lessonButton.x = 1700; lessonButton.y = 2500; var lessonButtonText = new Text2('Lesson', { size: 50, fill: 0xFFFFFF }); lessonButtonText.anchor.set(0.5, 0.5); lessonButtonText.x = 1700; lessonButtonText.y = 2500; game.addChild(lessonButtonText); // Create lesson menu UI elements var lessonMenuPanel = game.addChild(LK.getAsset('instructionPanel', { anchorX: 0.5, anchorY: 0.5 })); lessonMenuPanel.x = 1024; lessonMenuPanel.y = 1366; lessonMenuPanel.alpha = 0; var lessonMenuTitle = new Text2('Choose Your Lesson', { size: 100, fill: 0x333333 }); lessonMenuTitle.anchor.set(0.5, 0.5); lessonMenuTitle.x = 1024; lessonMenuTitle.y = 1000; lessonMenuTitle.alpha = 0; game.addChild(lessonMenuTitle); var additionButton = game.addChild(LK.getAsset('submitButton', { anchorX: 0.5, anchorY: 0.5 })); additionButton.x = 800; additionButton.y = 1300; additionButton.alpha = 0; additionButton.tint = 0x32CD32; var additionButtonText = new Text2('Addition (+)', { size: 60, fill: 0xFFFFFF }); additionButtonText.anchor.set(0.5, 0.5); additionButtonText.x = 800; additionButtonText.y = 1300; additionButtonText.alpha = 0; game.addChild(additionButtonText); var multiplicationButton = game.addChild(LK.getAsset('submitButton', { anchorX: 0.5, anchorY: 0.5 })); multiplicationButton.x = 1248; multiplicationButton.y = 1300; multiplicationButton.alpha = 0; multiplicationButton.tint = 0x4169E1; var multiplicationButtonText = new Text2('Multiplication (×)', { size: 60, fill: 0xFFFFFF }); multiplicationButtonText.anchor.set(0.5, 0.5); multiplicationButtonText.x = 1248; multiplicationButtonText.y = 1300; multiplicationButtonText.alpha = 0; game.addChild(multiplicationButtonText); var lessonCloseButton = game.addChild(LK.getAsset('closeButton', { anchorX: 0.5, anchorY: 0.5 })); lessonCloseButton.x = 1024; lessonCloseButton.y = 1700; lessonCloseButton.alpha = 0; var lessonCloseButtonText = new Text2('Close', { size: 50, fill: 0xFFFFFF }); lessonCloseButtonText.anchor.set(0.5, 0.5); lessonCloseButtonText.x = 1024; lessonCloseButtonText.y = 1700; lessonCloseButtonText.alpha = 0; game.addChild(lessonCloseButtonText); // Create lesson content UI elements var lessonContentPanel = game.addChild(LK.getAsset('instructionPanel', { anchorX: 0.5, anchorY: 0.5 })); lessonContentPanel.x = 1024; lessonContentPanel.y = 1366; lessonContentPanel.alpha = 0; var lessonContentTitle = new Text2('', { size: 100, fill: 0x333333 }); lessonContentTitle.anchor.set(0.5, 0.5); lessonContentTitle.x = 1024; lessonContentTitle.y = 900; lessonContentTitle.alpha = 0; game.addChild(lessonContentTitle); var lessonContentText = new Text2('', { size: 70, fill: 0x444444 }); lessonContentText.anchor.set(0.5, 0.5); lessonContentText.x = 1024; lessonContentText.y = 1300; lessonContentText.alpha = 0; game.addChild(lessonContentText); var lessonContentCloseButton = game.addChild(LK.getAsset('closeButton', { anchorX: 0.5, anchorY: 0.5 })); lessonContentCloseButton.x = 1024; lessonContentCloseButton.y = 1700; lessonContentCloseButton.alpha = 0; var lessonContentCloseButtonText = new Text2('Close', { size: 50, fill: 0xFFFFFF }); lessonContentCloseButtonText.anchor.set(0.5, 0.5); lessonContentCloseButtonText.x = 1024; lessonContentCloseButtonText.y = 1700; lessonContentCloseButtonText.alpha = 0; game.addChild(lessonContentCloseButtonText); // Create writing lesson UI elements var writingLessonPanel = game.addChild(LK.getAsset('instructionPanel', { anchorX: 0.5, anchorY: 0.5 })); writingLessonPanel.x = 1024; writingLessonPanel.y = 1366; writingLessonPanel.alpha = 0; var writingLessonTitle = new Text2('Writing Lesson', { size: 100, fill: 0x333333 }); writingLessonTitle.anchor.set(0.5, 0.5); writingLessonTitle.x = 1024; writingLessonTitle.y = 800; writingLessonTitle.alpha = 0; game.addChild(writingLessonTitle); var writingPromptText = new Text2('', { size: 70, fill: 0x444444 }); writingPromptText.anchor.set(0.5, 0.5); writingPromptText.x = 1024; writingPromptText.y = 1000; writingPromptText.alpha = 0; game.addChild(writingPromptText); var writingLessonArea = new WritingArea(); writingLessonArea.x = 1024; writingLessonArea.y = 1300; writingLessonArea.alpha = 0; game.addChild(writingLessonArea); var writingLessonTextBar = game.addChild(LK.getAsset('writingArea', { anchorX: 0.5, anchorY: 0.5 })); writingLessonTextBar.x = 1024; writingLessonTextBar.y = 1550; writingLessonTextBar.alpha = 0; writingLessonTextBar.tint = 0xE6F3FF; var writingLessonAnswerText = new Text2('', { size: 80, fill: 0x000000 }); writingLessonAnswerText.anchor.set(0.5, 0.5); writingLessonAnswerText.x = 1024; writingLessonAnswerText.y = 1550; writingLessonAnswerText.alpha = 0; game.addChild(writingLessonAnswerText); var writingCheckButton = game.addChild(LK.getAsset('submitButton', { anchorX: 0.5, anchorY: 0.5 })); writingCheckButton.x = 800; writingCheckButton.y = 1650; writingCheckButton.alpha = 0; var writingCheckButtonText = new Text2('Check', { size: 60, fill: 0xFFFFFF }); writingCheckButtonText.anchor.set(0.5, 0.5); writingCheckButtonText.x = 800; writingCheckButtonText.y = 1650; writingCheckButtonText.alpha = 0; game.addChild(writingCheckButtonText); var writingClearButton = game.addChild(LK.getAsset('submitButton', { anchorX: 0.5, anchorY: 0.5 })); writingClearButton.x = 1248; writingClearButton.y = 1650; writingClearButton.alpha = 0; writingClearButton.tint = 0xFF6B6B; var writingClearButtonText = new Text2('Clear', { size: 60, fill: 0xFFFFFF }); writingClearButtonText.anchor.set(0.5, 0.5); writingClearButtonText.x = 1248; writingClearButtonText.y = 1650; writingClearButtonText.alpha = 0; game.addChild(writingClearButtonText); var writingLessonCloseButton = game.addChild(LK.getAsset('closeButton', { anchorX: 0.5, anchorY: 0.5 })); writingLessonCloseButton.x = 1024; writingLessonCloseButton.y = 1800; writingLessonCloseButton.alpha = 0; var writingLessonCloseButtonText = new Text2('Close', { size: 50, fill: 0xFFFFFF }); writingLessonCloseButtonText.anchor.set(0.5, 0.5); writingLessonCloseButtonText.x = 1024; writingLessonCloseButtonText.y = 1800; writingLessonCloseButtonText.alpha = 0; game.addChild(writingLessonCloseButtonText); var writingFeedbackText = new Text2('', { size: 70, fill: 0x32CD32 }); writingFeedbackText.anchor.set(0.5, 0.5); writingFeedbackText.x = 1024; writingFeedbackText.y = 1750; writingFeedbackText.alpha = 0; game.addChild(writingFeedbackText); var writingHomeButton = game.addChild(LK.getAsset('homeButton', { anchorX: 0.5, anchorY: 0.5 })); writingHomeButton.x = 1700; writingHomeButton.y = 1800; writingHomeButton.alpha = 0; var writingHomeButtonText = new Text2('Home', { size: 40, fill: 0xFFFFFF }); writingHomeButtonText.anchor.set(0.5, 0.5); writingHomeButtonText.x = 1700; writingHomeButtonText.y = 1800; writingHomeButtonText.alpha = 0; game.addChild(writingHomeButtonText); // Create home screen background shapes var homeBackgroundShapes = []; var homeBackgroundColors = [0xFF6B6B, 0x4ECDC4, 0x45B7D1, 0x96CEB4, 0xFECA57, 0xFF9FF3, 0x54A0FF]; // Create floating background shapes for (var i = 0; i < 8; i++) { var shape = game.addChild(LK.getAsset('star', { anchorX: 0.5, anchorY: 0.5 })); shape.x = Math.random() * 2048; shape.y = Math.random() * 2732; shape.alpha = 0.3; shape.tint = homeBackgroundColors[i % homeBackgroundColors.length]; shape.scaleX = 0.5 + Math.random() * 1.5; shape.scaleY = shape.scaleX; shape.speedX = (Math.random() - 0.5) * 2; shape.speedY = (Math.random() - 0.5) * 2; shape.rotationSpeed = (Math.random() - 0.5) * 0.02; homeBackgroundShapes.push(shape); } // Create home screen UI elements var homeScreenPanel = game.addChild(LK.getAsset('instructionPanel', { anchorX: 0.5, anchorY: 0.5 })); homeScreenPanel.x = 1024; homeScreenPanel.y = 1366; homeScreenPanel.alpha = 1; var homeScreenTitle = new Text2('Learning Center', { size: 120, fill: 0x333333 }); homeScreenTitle.anchor.set(0.5, 0.5); homeScreenTitle.x = 1024; homeScreenTitle.y = 1000; homeScreenTitle.alpha = 1; game.addChild(homeScreenTitle); var homeRightButton = game.addChild(LK.getAsset('submitButton', { anchorX: 0.5, anchorY: 0.5 })); homeRightButton.x = 800; homeRightButton.y = 1300; homeRightButton.alpha = 1; homeRightButton.tint = 0x9370DB; var homeRightButtonText = new Text2('Write', { size: 70, fill: 0xFFFFFF }); homeRightButtonText.anchor.set(0.5, 0.5); homeRightButtonText.x = 800; homeRightButtonText.y = 1300; homeRightButtonText.alpha = 1; game.addChild(homeRightButtonText); var homeMathButton = game.addChild(LK.getAsset('submitButton', { anchorX: 0.5, anchorY: 0.5 })); homeMathButton.x = 1248; homeMathButton.y = 1300; homeMathButton.alpha = 1; homeMathButton.tint = 0x32CD32; var homeMathButtonText = new Text2('Math', { size: 70, fill: 0xFFFFFF }); homeMathButtonText.anchor.set(0.5, 0.5); homeMathButtonText.x = 1248; homeMathButtonText.y = 1300; homeMathButtonText.alpha = 1; game.addChild(homeMathButtonText); // Initialize with home screen visible hideAllGameElements(); // Functions to show/hide lesson menu function showLessonMenu() { showingLessonMenu = true; // Hide game elements problemBox.alpha = 0; problemText.alpha = 0; writingArea.alpha = 0; textBar.alpha = 0; answerText.alpha = 0; instructionText.alpha = 0; submitButton.alpha = 0; submitButtonText.alpha = 0; clearButton.alpha = 0; clearButtonText.alpha = 0; howToReadButton.alpha = 0; howToReadButtonText.alpha = 0; keyboardBackground.alpha = 0; for (var i = 0; i < keyboardButtons.length; i++) { keyboardButtons[i].alpha = 0; keyboardTexts[i].alpha = 0; } feedbackText.alpha = 0; // Show lesson menu lessonMenuPanel.alpha = 1; lessonMenuTitle.alpha = 1; additionButton.alpha = 1; additionButtonText.alpha = 1; multiplicationButton.alpha = 1; multiplicationButtonText.alpha = 1; lessonCloseButton.alpha = 1; lessonCloseButtonText.alpha = 1; } function hideLessonMenu() { showingLessonMenu = false; // Hide lesson menu lessonMenuPanel.alpha = 0; lessonMenuTitle.alpha = 0; additionButton.alpha = 0; additionButtonText.alpha = 0; multiplicationButton.alpha = 0; multiplicationButtonText.alpha = 0; lessonCloseButton.alpha = 0; lessonCloseButtonText.alpha = 0; // Show game elements problemBox.alpha = 1; problemText.alpha = 1; writingArea.alpha = 1; if (writingArea.writtenAnswer.length > 0) { textBar.alpha = 1; } answerText.alpha = 1; instructionText.alpha = 1; submitButton.alpha = 1; submitButtonText.alpha = 1; clearButton.alpha = 1; clearButtonText.alpha = 1; howToReadButton.alpha = 1; howToReadButtonText.alpha = 1; keyboardBackground.alpha = 1; for (var i = 0; i < keyboardButtons.length; i++) { keyboardButtons[i].alpha = 1; keyboardTexts[i].alpha = 1; } feedbackText.alpha = 1; } function showLessonContent(lessonType) { currentLessonType = lessonType; // Hide game elements problemBox.alpha = 0; problemText.alpha = 0; writingArea.alpha = 0; textBar.alpha = 0; answerText.alpha = 0; instructionText.alpha = 0; submitButton.alpha = 0; submitButtonText.alpha = 0; clearButton.alpha = 0; clearButtonText.alpha = 0; howToReadButton.alpha = 0; howToReadButtonText.alpha = 0; keyboardBackground.alpha = 0; for (var i = 0; i < keyboardButtons.length; i++) { keyboardButtons[i].alpha = 0; keyboardTexts[i].alpha = 0; } feedbackText.alpha = 0; // Show lesson content lessonContentPanel.alpha = 1; lessonContentTitle.alpha = 1; lessonContentText.alpha = 1; lessonContentCloseButton.alpha = 1; lessonContentCloseButtonText.alpha = 1; if (lessonType === 'addition') { lessonContentTitle.setText('Addition Lesson'); lessonContentText.setText('• Addition means combining numbers together\n• The + symbol means "add" or "plus"\n• Example: 3 + 2 = 5\n• Think of it as counting forward\n• Start with the first number: 3\n• Count forward by the second number: 4, 5\n• Practice: 5 + 3 = ? (Start at 5, count: 6, 7, 8)\n• Try some problems to practice!'); } else if (lessonType === 'multiplication') { lessonContentTitle.setText('Multiplication Lesson'); lessonContentText.setText('• Multiplication means repeated addition\n• The × symbol means "times" or "multiply"\n• Example: 3 × 2 = 6 (same as 3 + 3 = 6)\n• Think of it as groups of numbers\n• 3 × 2 means "3 groups of 2" or "2 groups of 3"\n• Practice: 4 × 3 = ? (4 + 4 + 4 = 12)\n• Start with small numbers and work up!\n• Try some problems to practice!'); } } function hideLessonContent() { // Hide lesson content lessonContentPanel.alpha = 0; lessonContentTitle.alpha = 0; lessonContentText.alpha = 0; lessonContentCloseButton.alpha = 0; lessonContentCloseButtonText.alpha = 0; // Show game elements problemBox.alpha = 1; problemText.alpha = 1; writingArea.alpha = 1; if (writingArea.writtenAnswer.length > 0) { textBar.alpha = 1; } answerText.alpha = 1; instructionText.alpha = 1; submitButton.alpha = 1; submitButtonText.alpha = 1; clearButton.alpha = 1; clearButtonText.alpha = 1; howToReadButton.alpha = 1; howToReadButtonText.alpha = 1; keyboardBackground.alpha = 1; for (var i = 0; i < keyboardButtons.length; i++) { keyboardButtons[i].alpha = 1; keyboardTexts[i].alpha = 1; } feedbackText.alpha = 1; } function showWritingLesson() { showingWritingLesson = true; screenState = 'writing_lesson'; // Hide game elements problemBox.alpha = 0; problemText.alpha = 0; writingArea.alpha = 0; textBar.alpha = 0; answerText.alpha = 0; instructionText.alpha = 0; submitButton.alpha = 0; submitButtonText.alpha = 0; clearButton.alpha = 0; clearButtonText.alpha = 0; howToReadButton.alpha = 0; howToReadButtonText.alpha = 0; keyboardBackground.alpha = 0; for (var i = 0; i < keyboardButtons.length; i++) { keyboardButtons[i].alpha = 0; keyboardTexts[i].alpha = 0; } feedbackText.alpha = 0; lessonButton.alpha = 0; lessonButtonText.alpha = 0; // Show writing lesson elements writingLessonPanel.alpha = 1; writingLessonTitle.alpha = 1; writingPromptText.alpha = 1; writingLessonArea.alpha = 1; writingLessonTextBar.alpha = 1; writingLessonAnswerText.alpha = 1; writingCheckButton.alpha = 1; writingCheckButtonText.alpha = 1; writingClearButton.alpha = 1; writingClearButtonText.alpha = 1; writingLessonCloseButton.alpha = 1; writingLessonCloseButtonText.alpha = 1; writingFeedbackText.alpha = 1; writingHomeButton.alpha = 1; writingHomeButtonText.alpha = 1; // Show letter keyboard letterKeyboardBackground.alpha = 1; for (var i = 0; i < letterKeyboardButtons.length; i++) { letterKeyboardButtons[i].alpha = 1; letterKeyboardTexts[i].alpha = 1; } // Set a writing prompt var prompts = ['Hello', 'World', 'Learn', 'Write', 'Practice']; writingPrompt = prompts[Math.floor(Math.random() * prompts.length)]; writingPromptText.setText('Write the word: ' + writingPrompt); writingAnswer = writingPrompt.toLowerCase(); writingLessonArea.writtenAnswer = ''; writingLessonAnswerText.setText(''); writingFeedbackText.setText(''); } function hideWritingLesson() { showingWritingLesson = false; screenState = 'game'; // Hide writing lesson elements writingLessonPanel.alpha = 0; writingLessonTitle.alpha = 0; writingPromptText.alpha = 0; writingLessonArea.alpha = 0; writingLessonTextBar.alpha = 0; writingLessonAnswerText.alpha = 0; writingCheckButton.alpha = 0; writingCheckButtonText.alpha = 0; writingClearButton.alpha = 0; writingClearButtonText.alpha = 0; writingLessonCloseButton.alpha = 0; writingLessonCloseButtonText.alpha = 0; writingFeedbackText.alpha = 0; writingHomeButton.alpha = 0; writingHomeButtonText.alpha = 0; // Hide letter keyboard letterKeyboardBackground.alpha = 0; for (var i = 0; i < letterKeyboardButtons.length; i++) { letterKeyboardButtons[i].alpha = 0; letterKeyboardTexts[i].alpha = 0; } // Show game elements problemBox.alpha = 1; problemText.alpha = 1; writingArea.alpha = 1; if (writingArea.writtenAnswer.length > 0) { textBar.alpha = 1; } answerText.alpha = 1; instructionText.alpha = 1; submitButton.alpha = 1; submitButtonText.alpha = 1; clearButton.alpha = 1; clearButtonText.alpha = 1; howToReadButton.alpha = 1; howToReadButtonText.alpha = 1; keyboardBackground.alpha = 1; for (var i = 0; i < keyboardButtons.length; i++) { keyboardButtons[i].alpha = 1; keyboardTexts[i].alpha = 1; } feedbackText.alpha = 1; lessonButton.alpha = 1; lessonButtonText.alpha = 1; } function showHomeScreen() { // Show home screen elements homeScreenPanel.alpha = 1; homeScreenTitle.alpha = 1; homeRightButton.alpha = 1; homeRightButtonText.alpha = 1; homeMathButton.alpha = 1; homeMathButtonText.alpha = 1; // Show background shapes for (var i = 0; i < homeBackgroundShapes.length; i++) { homeBackgroundShapes[i].alpha = 0.3; } // Hide all other elements hideAllGameElements(); } function hideHomeScreen() { // Hide home screen elements homeScreenPanel.alpha = 0; homeScreenTitle.alpha = 0; homeRightButton.alpha = 0; homeRightButtonText.alpha = 0; homeMathButton.alpha = 0; homeMathButtonText.alpha = 0; // Hide background shapes for (var i = 0; i < homeBackgroundShapes.length; i++) { homeBackgroundShapes[i].alpha = 0; } } function hideAllGameElements() { // Hide game elements problemBox.alpha = 0; problemText.alpha = 0; writingArea.alpha = 0; textBar.alpha = 0; answerText.alpha = 0; instructionText.alpha = 0; submitButton.alpha = 0; submitButtonText.alpha = 0; clearButton.alpha = 0; clearButtonText.alpha = 0; howToReadButton.alpha = 0; howToReadButtonText.alpha = 0; keyboardBackground.alpha = 0; for (var i = 0; i < keyboardButtons.length; i++) { keyboardButtons[i].alpha = 0; keyboardTexts[i].alpha = 0; } feedbackText.alpha = 0; lessonButton.alpha = 0; lessonButtonText.alpha = 0; nextButton.alpha = 0; nextButtonText.alpha = 0; mathHomeButton.alpha = 0; mathHomeButtonText.alpha = 0; } function showGameElements() { // Show game elements problemBox.alpha = 1; problemText.alpha = 1; writingArea.alpha = 1; if (writingArea.writtenAnswer.length > 0) { textBar.alpha = 1; } answerText.alpha = 1; instructionText.alpha = 1; submitButton.alpha = 1; submitButtonText.alpha = 1; clearButton.alpha = 1; clearButtonText.alpha = 1; howToReadButton.alpha = 0; howToReadButtonText.alpha = 0; keyboardBackground.alpha = 1; for (var i = 0; i < keyboardButtons.length; i++) { keyboardButtons[i].alpha = 1; keyboardTexts[i].alpha = 1; } feedbackText.alpha = 1; lessonButton.alpha = 1; lessonButtonText.alpha = 1; mathHomeButton.alpha = 1; mathHomeButtonText.alpha = 1; } function checkWritingAnswer() { var userAnswer = writingLessonArea.writtenAnswer.toLowerCase().trim(); if (userAnswer === writingAnswer) { writingFeedbackText.setText('Correct! Well done!'); writingFeedbackText.tint = 0x32CD32; LK.getSound('correct').play(); LK.setTimeout(function () { // Generate new prompt var prompts = ['Hello', 'World', 'Learn', 'Write', 'Practice', 'Good', 'Nice', 'Great']; writingPrompt = prompts[Math.floor(Math.random() * prompts.length)]; writingPromptText.setText('Write the word: ' + writingPrompt); writingAnswer = writingPrompt.toLowerCase(); writingLessonArea.clearDrawing(); writingLessonAnswerText.setText(''); writingFeedbackText.setText(''); }, 2000); } else { writingFeedbackText.setText('Try again! The word is: ' + writingPrompt); writingFeedbackText.tint = 0xFF6B6B; LK.getSound('incorrect').play(); LK.setTimeout(function () { writingFeedbackText.setText(''); }, 2000); } } lessonButton.down = function (x, y, obj) { if (!showingInstructions && !showingLessonMenu && screenState === 'game') { screenState = 'lesson_menu'; showLessonMenu(); } }; additionButton.down = function (x, y, obj) { if (showingLessonMenu && screenState === 'lesson_menu') { hideLessonMenu(); screenState = 'lesson_content'; showLessonContent('addition'); } }; multiplicationButton.down = function (x, y, obj) { if (showingLessonMenu && screenState === 'lesson_menu') { hideLessonMenu(); screenState = 'lesson_content'; showLessonContent('multiplication'); } }; lessonCloseButton.down = function (x, y, obj) { if (showingLessonMenu && screenState === 'lesson_menu') { hideLessonMenu(); screenState = 'game'; } }; lessonContentCloseButton.down = function (x, y, obj) { if (currentLessonType !== '' && screenState === 'lesson_content') { hideLessonContent(); currentLessonType = ''; screenState = 'game'; } }; writingCheckButton.down = function (x, y, obj) { if (showingWritingLesson && writingLessonArea.writtenAnswer !== '') { checkWritingAnswer(); } }; writingClearButton.down = function (x, y, obj) { if (showingWritingLesson) { writingLessonArea.clearDrawing(); writingLessonAnswerText.setText(''); writingFeedbackText.setText(''); } }; writingLessonCloseButton.down = function (x, y, obj) { if (showingWritingLesson && screenState === 'writing_lesson') { hideWritingLesson(); } }; homeRightButton.down = function (x, y, obj) { if (screenState === 'home') { hideHomeScreen(); screenState = 'writing_lesson'; showWritingLesson(); } }; homeMathButton.down = function (x, y, obj) { if (screenState === 'home') { hideHomeScreen(); screenState = 'game'; showGameElements(); } }; mathHomeButton.down = function (x, y, obj) { if (screenState === 'game') { hideAllGameElements(); screenState = 'home'; showHomeScreen(); } }; writingHomeButton.down = function (x, y, obj) { if (screenState === 'writing_lesson') { hideWritingLesson(); screenState = 'home'; showHomeScreen(); } }; game.update = function () { for (var i = celebrationStars.length - 1; i >= 0; i--) { var star = celebrationStars[i]; if (star.alpha <= 0) { celebrationStars.splice(i, 1); } } // Animate home screen background shapes if (screenState === 'home') { for (var i = 0; i < homeBackgroundShapes.length; i++) { var shape = homeBackgroundShapes[i]; // Move shapes shape.x += shape.speedX; shape.y += shape.speedY; // Rotate shapes shape.rotation += shape.rotationSpeed; // Bounce off edges if (shape.x < 0 || shape.x > 2048) { shape.speedX *= -1; } if (shape.y < 0 || shape.y > 2732) { shape.speedY *= -1; } // Keep shapes within bounds if (shape.x < 0) shape.x = 0; if (shape.x > 2048) shape.x = 2048; if (shape.y < 0) shape.y = 0; if (shape.y > 2732) shape.y = 2732; } } };
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var CelebrationStar = Container.expand(function () {
var self = Container.call(this);
var starGraphic = self.attachAsset('star', {
anchorX: 0.5,
anchorY: 0.5
});
self.startAnimation = function () {
self.alpha = 1;
self.scaleX = 0.1;
self.scaleY = 0.1;
tween(self, {
scaleX: 1.5,
scaleY: 1.5
}, {
duration: 500,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(self, {
alpha: 0,
scaleX: 0.5,
scaleY: 0.5
}, {
duration: 500,
easing: tween.easeIn,
onFinish: function onFinish() {
self.destroy();
}
});
}
});
};
return self;
});
var MathProblem = Container.expand(function () {
var self = Container.call(this);
self.num1 = 0;
self.num2 = 0;
self.operation = '+';
self.answer = 0;
self.difficulty = 1;
self.generateProblem = function () {
var maxNum = Math.min(10, 5 + self.difficulty * 2);
self.num1 = Math.floor(Math.random() * maxNum) + 1;
self.num2 = Math.floor(Math.random() * maxNum) + 1;
var operations = ['+', '-'];
if (self.difficulty > 3) {
operations.push('×');
operations.push('×'); // Add multiplication twice to make it more likely
}
self.operation = operations[Math.floor(Math.random() * operations.length)];
if (self.operation === '-' && self.num1 < self.num2) {
var temp = self.num1;
self.num1 = self.num2;
self.num2 = temp;
}
switch (self.operation) {
case '+':
self.answer = self.num1 + self.num2;
break;
case '-':
self.answer = self.num1 - self.num2;
break;
case '×':
self.answer = self.num1 * self.num2;
break;
}
};
self.getProblemText = function () {
return self.num1 + ' ' + self.operation + ' ' + self.num2 + ' = ?';
};
return self;
});
var WritingArea = Container.expand(function () {
var self = Container.call(this);
var areaBackground = self.attachAsset('writingArea', {
anchorX: 0.5,
anchorY: 0.5
});
self.drawingPath = [];
self.isDrawing = false;
self.writtenAnswer = '';
self.startDrawing = function (x, y) {
self.isDrawing = true;
self.drawingPath = [];
var localPos = self.toLocal({
x: x,
y: y
});
self.drawingPath.push({
x: localPos.x,
y: localPos.y
});
self.addDrawingDot(localPos.x, localPos.y);
// Show text bar when writing starts
textBar.alpha = 1;
};
self.continueDrawing = function (x, y) {
if (self.isDrawing) {
var localPos = self.toLocal({
x: x,
y: y
});
self.drawingPath.push({
x: localPos.x,
y: localPos.y
});
self.addDrawingDot(localPos.x, localPos.y);
}
};
self.stopDrawing = function () {
self.isDrawing = false;
self.recognizeNumber();
};
self.addDrawingDot = function (x, y) {
var dot = self.addChild(LK.getAsset('drawingDot', {
anchorX: 0.5,
anchorY: 0.5
}));
dot.x = x;
dot.y = y;
};
self.recognizeNumber = function () {
if (self.drawingPath.length > 3) {
var bounds = self.getDrawingBounds();
var recognizedChar = self.simpleNumberRecognition(bounds);
if (recognizedChar !== null) {
self.writtenAnswer += recognizedChar; // Append characters to build text
answerText.setText(self.writtenAnswer);
// Show text bar when text is recognized
textBar.alpha = 1;
// Clear the drawing path after recognition to prepare for next character
self.clearCurrentDrawing();
}
}
};
self.getDrawingBounds = function () {
if (self.drawingPath.length === 0) return null;
var minX = self.drawingPath[0].x;
var maxX = self.drawingPath[0].x;
var minY = self.drawingPath[0].y;
var maxY = self.drawingPath[0].y;
for (var i = 1; i < self.drawingPath.length; i++) {
var point = self.drawingPath[i];
minX = Math.min(minX, point.x);
maxX = Math.max(maxX, point.x);
minY = Math.min(minY, point.y);
maxY = Math.max(maxY, point.y);
}
return {
minX: minX,
maxX: maxX,
minY: minY,
maxY: maxY,
width: maxX - minX,
height: maxY - minY
};
};
self.simpleNumberRecognition = function (bounds) {
if (!bounds || bounds.width < 10 || bounds.height < 10) {
feedbackText.setText('Draw bigger');
feedbackText.tint = 0xFFA500;
LK.setTimeout(function () {
feedbackText.setText('');
}, 1000);
return null;
}
var aspectRatio = bounds.width / bounds.height;
var pathLength = self.drawingPath.length;
var recognizedChar = null;
// Numbers - more lenient recognition
if (aspectRatio > 2.0 || aspectRatio < 0.8 && pathLength > 20) recognizedChar = '1';else if (aspectRatio > 0.7 && aspectRatio < 1.3 && pathLength > 25) recognizedChar = '0';else if (pathLength > 20 && pathLength < 55 && aspectRatio > 0.5) recognizedChar = '2';else if (pathLength > 15 && pathLength < 45 && aspectRatio > 0.6) recognizedChar = '3';else if (pathLength > 10 && pathLength < 40) recognizedChar = '4';else if (pathLength > 20 && pathLength < 60 && aspectRatio > 0.5) recognizedChar = '5';else if (pathLength > 25 && pathLength < 65 && aspectRatio > 0.6) recognizedChar = '6';else if (pathLength > 10 && pathLength < 35 && aspectRatio > 0.4) recognizedChar = '7';else if (pathLength > 30 && pathLength < 75) recognizedChar = '8';else if (pathLength > 25 && pathLength < 70 && aspectRatio > 0.5) recognizedChar = '9';
if (recognizedChar) {
feedbackText.setText('Recognized: ' + recognizedChar);
feedbackText.tint = 0x32CD32;
LK.setTimeout(function () {
feedbackText.setText('');
}, 500);
return recognizedChar;
}
// Fallback - show a hint about drawing more clearly
feedbackText.setText('Draw more clearly');
feedbackText.tint = 0xFFA500;
LK.setTimeout(function () {
feedbackText.setText('');
}, 1000);
return null;
};
self.clearCurrentDrawing = function () {
for (var i = self.children.length - 1; i >= 0; i--) {
var child = self.children[i];
if (child !== areaBackground) {
child.destroy();
}
}
self.drawingPath = [];
};
self.clearDrawing = function () {
for (var i = self.children.length - 1; i >= 0; i--) {
var child = self.children[i];
if (child !== areaBackground) {
child.destroy();
}
}
self.drawingPath = [];
self.writtenAnswer = '';
answerText.setText('');
// Hide text bar when clearing
textBar.alpha = 0;
};
self.backspace = function () {
if (self.writtenAnswer.length > 0) {
self.writtenAnswer = self.writtenAnswer.slice(0, -1);
answerText.setText(self.writtenAnswer);
// Hide text bar if no text remains
if (self.writtenAnswer.length === 0) {
textBar.alpha = 0;
}
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87CEEB
});
/****
* Game Code
****/
var currentProblem = new MathProblem();
var writingArea = new WritingArea();
var gameState = 'playing';
var screenState = 'home'; // Track current screen: 'home', 'game', 'lesson_menu', 'lesson_content'
var correctAnswers = 0;
var level = storage.level || 1;
var celebrationStars = [];
currentProblem.difficulty = level;
currentProblem.generateProblem();
var background = game.addChild(LK.getAsset('background', {
anchorX: 0,
anchorY: 0
}));
var problemBox = game.addChild(LK.getAsset('problemBox', {
anchorX: 0.5,
anchorY: 0.5
}));
problemBox.x = 1024;
problemBox.y = 600;
var problemText = new Text2(currentProblem.getProblemText(), {
size: 120,
fill: 0x333333
});
problemText.anchor.set(0.5, 0.5);
problemText.x = 1024;
problemText.y = 600;
game.addChild(problemText);
writingArea.x = 1024;
writingArea.y = 1200;
game.addChild(writingArea);
var instructionText = new Text2('Write your answer below:', {
size: 80,
fill: 0x444444
});
instructionText.anchor.set(0.5, 0.5);
instructionText.x = 1024;
instructionText.y = 950;
game.addChild(instructionText);
var textBar = game.addChild(LK.getAsset('writingArea', {
anchorX: 0.5,
anchorY: 0.5
}));
textBar.x = 1024;
textBar.y = 1450;
textBar.alpha = 0;
textBar.tint = 0xE6F3FF;
var answerText = new Text2('', {
size: 150,
fill: 0x000000
});
answerText.anchor.set(0.5, 0.5);
answerText.x = 1024;
answerText.y = 1450;
game.addChild(answerText);
var submitButton = game.addChild(LK.getAsset('submitButton', {
anchorX: 0.5,
anchorY: 0.5
}));
submitButton.x = 800;
submitButton.y = 1600;
var submitButtonText = new Text2('Check', {
size: 60,
fill: 0xFFFFFF
});
submitButtonText.anchor.set(0.5, 0.5);
submitButtonText.x = 800;
submitButtonText.y = 1600;
game.addChild(submitButtonText);
var clearButton = game.addChild(LK.getAsset('submitButton', {
anchorX: 0.5,
anchorY: 0.5
}));
clearButton.x = 1150;
clearButton.y = 1600;
clearButton.tint = 0xFF6B6B;
var clearButtonText = new Text2('Clear', {
size: 60,
fill: 0xFFFFFF
});
clearButtonText.anchor.set(0.5, 0.5);
clearButtonText.x = 1150;
clearButtonText.y = 1600;
game.addChild(clearButtonText);
var nextButton = game.addChild(LK.getAsset('nextButton', {
anchorX: 0.5,
anchorY: 0.5
}));
nextButton.x = 1024;
nextButton.y = 1900;
nextButton.alpha = 0;
var nextButtonText = new Text2('Next Problem', {
size: 60,
fill: 0xFFFFFF
});
nextButtonText.anchor.set(0.5, 0.5);
nextButtonText.x = 1024;
nextButtonText.y = 1900;
nextButtonText.alpha = 0;
game.addChild(nextButtonText);
var feedbackText = new Text2('', {
size: 80,
fill: 0x32CD32
});
feedbackText.anchor.set(0.5, 0.5);
feedbackText.x = 1024;
feedbackText.y = 1750;
game.addChild(feedbackText);
var scoreText = new Text2('Score: 0', {
size: 60,
fill: 0xFFFFFF
});
scoreText.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreText);
var levelText = new Text2('Level: ' + level, {
size: 60,
fill: 0xFFFFFF
});
levelText.anchor.set(1, 0);
LK.gui.topRight.addChild(levelText);
levelText.x = -120;
var howToReadButton = game.addChild(LK.getAsset('howToReadButton', {
anchorX: 0.5,
anchorY: 0.5
}));
howToReadButton.x = 1750;
howToReadButton.y = 1600;
var howToReadButtonText = new Text2('Right', {
size: 50,
fill: 0xFFFFFF
});
howToReadButtonText.anchor.set(0.5, 0.5);
howToReadButtonText.x = 1750;
howToReadButtonText.y = 1600;
game.addChild(howToReadButtonText);
var mathHomeButton = game.addChild(LK.getAsset('homeButton', {
anchorX: 0.5,
anchorY: 0.5
}));
mathHomeButton.x = 1750;
mathHomeButton.y = 1700;
mathHomeButton.alpha = 0;
var mathHomeButtonText = new Text2('Home', {
size: 40,
fill: 0xFFFFFF
});
mathHomeButtonText.anchor.set(0.5, 0.5);
mathHomeButtonText.x = 1750;
mathHomeButtonText.y = 1700;
mathHomeButtonText.alpha = 0;
game.addChild(mathHomeButtonText);
var instructionPanel = game.addChild(LK.getAsset('instructionPanel', {
anchorX: 0.5,
anchorY: 0.5
}));
instructionPanel.x = 1024;
instructionPanel.y = 1366;
instructionPanel.alpha = 0;
var instructionTitle = new Text2('How to Read Math Problems', {
size: 100,
fill: 0x333333
});
instructionTitle.anchor.set(0.5, 0.5);
instructionTitle.x = 1024;
instructionTitle.y = 900;
instructionTitle.alpha = 0;
game.addChild(instructionTitle);
var instructionContent = new Text2('• Look at the math problem carefully\n• Read each number and symbol from left to right\n• + means add the numbers together\n• - means subtract the second from the first\n• × means multiply the numbers\n• = means "equals" - find what number comes after\n• Practice reading math problems out loud', {
size: 70,
fill: 0x444444
});
instructionContent.anchor.set(0.5, 0.5);
instructionContent.x = 1024;
instructionContent.y = 1300;
instructionContent.alpha = 0;
game.addChild(instructionContent);
var closeButton = game.addChild(LK.getAsset('closeButton', {
anchorX: 0.5,
anchorY: 0.5
}));
closeButton.x = 1024;
closeButton.y = 1700;
closeButton.alpha = 0;
var closeButtonText = new Text2('Close', {
size: 50,
fill: 0xFFFFFF
});
closeButtonText.anchor.set(0.5, 0.5);
closeButtonText.x = 1024;
closeButtonText.y = 1700;
closeButtonText.alpha = 0;
game.addChild(closeButtonText);
var showingInstructions = false;
var showingLessonMenu = false;
var currentLessonType = '';
var showingWritingLesson = false;
var writingPrompt = '';
var writingAnswer = '';
function checkAnswer() {
var userAnswer = writingArea.writtenAnswer.trim();
var correctAnswer = currentProblem.answer.toString();
if (userAnswer === correctAnswer) {
feedbackText.setText('Correct! Great job!');
feedbackText.tint = 0x32CD32;
LK.getSound('correct').play();
correctAnswers++;
LK.setScore(LK.getScore() + 10 * level);
scoreText.setText('Score: ' + LK.getScore());
createCelebrationStars();
nextButton.alpha = 1;
nextButtonText.alpha = 1;
gameState = 'correct';
if (correctAnswers >= 5) {
level++;
storage.level = level;
levelText.setText('Level: ' + level);
currentProblem.difficulty = level;
correctAnswers = 0;
LK.setTimeout(function () {
feedbackText.setText('Level Up! Well done!');
LK.getSound('celebration').play();
}, 1000);
}
} else {
feedbackText.setText('Try again! The answer is ' + correctAnswer);
feedbackText.tint = 0xFF6B6B;
LK.getSound('incorrect').play();
LK.setTimeout(function () {
feedbackText.setText('');
writingArea.clearDrawing();
}, 2000);
}
}
function createCelebrationStars() {
for (var i = 0; i < 5; i++) {
var star = new CelebrationStar();
star.x = 1024 + (Math.random() - 0.5) * 600;
star.y = 1200 + (Math.random() - 0.5) * 400;
celebrationStars.push(star);
game.addChild(star);
LK.setTimeout(function (starToAnimate) {
return function () {
starToAnimate.startAnimation();
};
}(star), i * 100);
}
}
function nextProblem() {
currentProblem.generateProblem();
problemText.setText(currentProblem.getProblemText());
writingArea.clearDrawing();
feedbackText.setText('');
nextButton.alpha = 0;
nextButtonText.alpha = 0;
gameState = 'playing';
}
game.down = function (x, y, obj) {
if (gameState === 'playing') {
// Check if touch is within writing area bounds using proper coordinate system
var areaX = writingArea.x - 800; // writingArea width is 1600, so half is 800
var areaY = writingArea.y - 200; // writingArea height is 400, so half is 200
var areaWidth = 1600;
var areaHeight = 400;
if (x >= areaX && x <= areaX + areaWidth && y >= areaY && y <= areaY + areaHeight) {
writingArea.startDrawing(x, y);
}
}
if (showingWritingLesson) {
// Check if touch is within writing lesson area bounds
var lessonAreaX = writingLessonArea.x - 800;
var lessonAreaY = writingLessonArea.y - 200;
var lessonAreaWidth = 1600;
var lessonAreaHeight = 400;
if (x >= lessonAreaX && x <= lessonAreaX + lessonAreaWidth && y >= lessonAreaY && y <= lessonAreaY + lessonAreaHeight) {
writingLessonArea.startDrawing(x, y);
}
}
};
game.move = function (x, y, obj) {
if (gameState === 'playing') {
writingArea.continueDrawing(x, y);
}
if (showingWritingLesson) {
writingLessonArea.continueDrawing(x, y);
}
};
game.up = function (x, y, obj) {
if (gameState === 'playing') {
writingArea.stopDrawing();
}
if (showingWritingLesson) {
writingLessonArea.stopDrawing();
writingLessonAnswerText.setText(writingLessonArea.writtenAnswer);
}
};
submitButton.down = function (x, y, obj) {
if (gameState === 'playing' && writingArea.writtenAnswer !== '') {
checkAnswer();
}
};
clearButton.down = function (x, y, obj) {
if (gameState === 'playing') {
writingArea.clearDrawing();
feedbackText.setText('');
}
};
nextButton.down = function (x, y, obj) {
if (gameState === 'correct') {
nextProblem();
}
};
howToReadButton.down = function (x, y, obj) {
if (!showingInstructions && !showingLessonMenu && !showingWritingLesson && screenState === 'game') {
showWritingLesson();
}
};
closeButton.down = function (x, y, obj) {
if (showingInstructions) {
showingInstructions = false;
instructionPanel.alpha = 0;
instructionTitle.alpha = 0;
instructionContent.alpha = 0;
closeButton.alpha = 0;
closeButtonText.alpha = 0;
}
};
// Create number keyboard
var keyboardNumbers = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0'];
var keyboardButtons = [];
var keyboardTexts = [];
// Create letter keyboard
var keyboardLetters = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'];
var letterKeyboardButtons = [];
var letterKeyboardTexts = [];
// Create keyboard background
var keyboardBackground = game.addChild(LK.getAsset('instructionPanel', {
anchorX: 0.5,
anchorY: 0.5
}));
keyboardBackground.x = 1024;
keyboardBackground.y = 2200;
keyboardBackground.width = 800;
keyboardBackground.height = 400;
keyboardBackground.tint = 0xE0E0E0;
// Create number buttons in a 3x4 grid (3 columns, 4 rows)
for (var i = 0; i < keyboardNumbers.length; i++) {
var number = keyboardNumbers[i];
var col = i % 3;
var row = Math.floor(i / 3);
// Special case for 0 - center it in the bottom row
if (number === '0') {
col = 1;
row = 3;
}
var button = game.addChild(LK.getAsset('submitButton', {
anchorX: 0.5,
anchorY: 0.5
}));
button.x = 1024 + (col - 1) * 150;
button.y = 2100 + row * 100;
button.width = 120;
button.height = 80;
button.tint = 0x4169E1;
var buttonText = new Text2(number, {
size: 50,
fill: 0xFFFFFF
});
buttonText.anchor.set(0.5, 0.5);
buttonText.x = button.x;
buttonText.y = button.y;
game.addChild(buttonText);
keyboardButtons.push(button);
keyboardTexts.push(buttonText);
}
// Add event handlers for number buttons
for (var i = 0; i < keyboardButtons.length; i++) {
(function (index) {
keyboardButtons[index].down = function (x, y, obj) {
if (gameState === 'playing') {
var number = keyboardNumbers[index];
writingArea.writtenAnswer += number;
answerText.setText(writingArea.writtenAnswer);
textBar.alpha = 1;
feedbackText.setText('');
}
};
})(i);
}
// Create letter keyboard background
var letterKeyboardBackground = game.addChild(LK.getAsset('instructionPanel', {
anchorX: 0.5,
anchorY: 0.5
}));
letterKeyboardBackground.x = 1024;
letterKeyboardBackground.y = 2450;
letterKeyboardBackground.width = 1800;
letterKeyboardBackground.height = 300;
letterKeyboardBackground.tint = 0xE0E0E0;
letterKeyboardBackground.alpha = 0;
// Create letter buttons in rows (QWERTY-like layout but alphabetical)
for (var i = 0; i < keyboardLetters.length; i++) {
var letter = keyboardLetters[i];
var col = i % 9; // 9 letters per row
var row = Math.floor(i / 9);
var button = game.addChild(LK.getAsset('submitButton', {
anchorX: 0.5,
anchorY: 0.5
}));
button.x = 1024 + (col - 4) * 180; // Center the row
button.y = 2350 + row * 80;
button.width = 160;
button.height = 70;
button.tint = 0x9370DB;
button.alpha = 0;
var buttonText = new Text2(letter, {
size: 40,
fill: 0xFFFFFF
});
buttonText.anchor.set(0.5, 0.5);
buttonText.x = button.x;
buttonText.y = button.y;
buttonText.alpha = 0;
game.addChild(buttonText);
letterKeyboardButtons.push(button);
letterKeyboardTexts.push(buttonText);
}
// Add event handlers for letter buttons
for (var i = 0; i < letterKeyboardButtons.length; i++) {
(function (index) {
letterKeyboardButtons[index].down = function (x, y, obj) {
if (showingWritingLesson) {
var letter = keyboardLetters[index].toLowerCase();
writingLessonArea.writtenAnswer += letter;
writingLessonAnswerText.setText(writingLessonArea.writtenAnswer);
writingLessonTextBar.alpha = 1;
writingFeedbackText.setText('');
}
};
})(i);
}
// Create lesson button in bottom right
var lessonButton = game.addChild(LK.getAsset('howToReadButton', {
anchorX: 0.5,
anchorY: 0.5
}));
lessonButton.x = 1700;
lessonButton.y = 2500;
var lessonButtonText = new Text2('Lesson', {
size: 50,
fill: 0xFFFFFF
});
lessonButtonText.anchor.set(0.5, 0.5);
lessonButtonText.x = 1700;
lessonButtonText.y = 2500;
game.addChild(lessonButtonText);
// Create lesson menu UI elements
var lessonMenuPanel = game.addChild(LK.getAsset('instructionPanel', {
anchorX: 0.5,
anchorY: 0.5
}));
lessonMenuPanel.x = 1024;
lessonMenuPanel.y = 1366;
lessonMenuPanel.alpha = 0;
var lessonMenuTitle = new Text2('Choose Your Lesson', {
size: 100,
fill: 0x333333
});
lessonMenuTitle.anchor.set(0.5, 0.5);
lessonMenuTitle.x = 1024;
lessonMenuTitle.y = 1000;
lessonMenuTitle.alpha = 0;
game.addChild(lessonMenuTitle);
var additionButton = game.addChild(LK.getAsset('submitButton', {
anchorX: 0.5,
anchorY: 0.5
}));
additionButton.x = 800;
additionButton.y = 1300;
additionButton.alpha = 0;
additionButton.tint = 0x32CD32;
var additionButtonText = new Text2('Addition (+)', {
size: 60,
fill: 0xFFFFFF
});
additionButtonText.anchor.set(0.5, 0.5);
additionButtonText.x = 800;
additionButtonText.y = 1300;
additionButtonText.alpha = 0;
game.addChild(additionButtonText);
var multiplicationButton = game.addChild(LK.getAsset('submitButton', {
anchorX: 0.5,
anchorY: 0.5
}));
multiplicationButton.x = 1248;
multiplicationButton.y = 1300;
multiplicationButton.alpha = 0;
multiplicationButton.tint = 0x4169E1;
var multiplicationButtonText = new Text2('Multiplication (×)', {
size: 60,
fill: 0xFFFFFF
});
multiplicationButtonText.anchor.set(0.5, 0.5);
multiplicationButtonText.x = 1248;
multiplicationButtonText.y = 1300;
multiplicationButtonText.alpha = 0;
game.addChild(multiplicationButtonText);
var lessonCloseButton = game.addChild(LK.getAsset('closeButton', {
anchorX: 0.5,
anchorY: 0.5
}));
lessonCloseButton.x = 1024;
lessonCloseButton.y = 1700;
lessonCloseButton.alpha = 0;
var lessonCloseButtonText = new Text2('Close', {
size: 50,
fill: 0xFFFFFF
});
lessonCloseButtonText.anchor.set(0.5, 0.5);
lessonCloseButtonText.x = 1024;
lessonCloseButtonText.y = 1700;
lessonCloseButtonText.alpha = 0;
game.addChild(lessonCloseButtonText);
// Create lesson content UI elements
var lessonContentPanel = game.addChild(LK.getAsset('instructionPanel', {
anchorX: 0.5,
anchorY: 0.5
}));
lessonContentPanel.x = 1024;
lessonContentPanel.y = 1366;
lessonContentPanel.alpha = 0;
var lessonContentTitle = new Text2('', {
size: 100,
fill: 0x333333
});
lessonContentTitle.anchor.set(0.5, 0.5);
lessonContentTitle.x = 1024;
lessonContentTitle.y = 900;
lessonContentTitle.alpha = 0;
game.addChild(lessonContentTitle);
var lessonContentText = new Text2('', {
size: 70,
fill: 0x444444
});
lessonContentText.anchor.set(0.5, 0.5);
lessonContentText.x = 1024;
lessonContentText.y = 1300;
lessonContentText.alpha = 0;
game.addChild(lessonContentText);
var lessonContentCloseButton = game.addChild(LK.getAsset('closeButton', {
anchorX: 0.5,
anchorY: 0.5
}));
lessonContentCloseButton.x = 1024;
lessonContentCloseButton.y = 1700;
lessonContentCloseButton.alpha = 0;
var lessonContentCloseButtonText = new Text2('Close', {
size: 50,
fill: 0xFFFFFF
});
lessonContentCloseButtonText.anchor.set(0.5, 0.5);
lessonContentCloseButtonText.x = 1024;
lessonContentCloseButtonText.y = 1700;
lessonContentCloseButtonText.alpha = 0;
game.addChild(lessonContentCloseButtonText);
// Create writing lesson UI elements
var writingLessonPanel = game.addChild(LK.getAsset('instructionPanel', {
anchorX: 0.5,
anchorY: 0.5
}));
writingLessonPanel.x = 1024;
writingLessonPanel.y = 1366;
writingLessonPanel.alpha = 0;
var writingLessonTitle = new Text2('Writing Lesson', {
size: 100,
fill: 0x333333
});
writingLessonTitle.anchor.set(0.5, 0.5);
writingLessonTitle.x = 1024;
writingLessonTitle.y = 800;
writingLessonTitle.alpha = 0;
game.addChild(writingLessonTitle);
var writingPromptText = new Text2('', {
size: 70,
fill: 0x444444
});
writingPromptText.anchor.set(0.5, 0.5);
writingPromptText.x = 1024;
writingPromptText.y = 1000;
writingPromptText.alpha = 0;
game.addChild(writingPromptText);
var writingLessonArea = new WritingArea();
writingLessonArea.x = 1024;
writingLessonArea.y = 1300;
writingLessonArea.alpha = 0;
game.addChild(writingLessonArea);
var writingLessonTextBar = game.addChild(LK.getAsset('writingArea', {
anchorX: 0.5,
anchorY: 0.5
}));
writingLessonTextBar.x = 1024;
writingLessonTextBar.y = 1550;
writingLessonTextBar.alpha = 0;
writingLessonTextBar.tint = 0xE6F3FF;
var writingLessonAnswerText = new Text2('', {
size: 80,
fill: 0x000000
});
writingLessonAnswerText.anchor.set(0.5, 0.5);
writingLessonAnswerText.x = 1024;
writingLessonAnswerText.y = 1550;
writingLessonAnswerText.alpha = 0;
game.addChild(writingLessonAnswerText);
var writingCheckButton = game.addChild(LK.getAsset('submitButton', {
anchorX: 0.5,
anchorY: 0.5
}));
writingCheckButton.x = 800;
writingCheckButton.y = 1650;
writingCheckButton.alpha = 0;
var writingCheckButtonText = new Text2('Check', {
size: 60,
fill: 0xFFFFFF
});
writingCheckButtonText.anchor.set(0.5, 0.5);
writingCheckButtonText.x = 800;
writingCheckButtonText.y = 1650;
writingCheckButtonText.alpha = 0;
game.addChild(writingCheckButtonText);
var writingClearButton = game.addChild(LK.getAsset('submitButton', {
anchorX: 0.5,
anchorY: 0.5
}));
writingClearButton.x = 1248;
writingClearButton.y = 1650;
writingClearButton.alpha = 0;
writingClearButton.tint = 0xFF6B6B;
var writingClearButtonText = new Text2('Clear', {
size: 60,
fill: 0xFFFFFF
});
writingClearButtonText.anchor.set(0.5, 0.5);
writingClearButtonText.x = 1248;
writingClearButtonText.y = 1650;
writingClearButtonText.alpha = 0;
game.addChild(writingClearButtonText);
var writingLessonCloseButton = game.addChild(LK.getAsset('closeButton', {
anchorX: 0.5,
anchorY: 0.5
}));
writingLessonCloseButton.x = 1024;
writingLessonCloseButton.y = 1800;
writingLessonCloseButton.alpha = 0;
var writingLessonCloseButtonText = new Text2('Close', {
size: 50,
fill: 0xFFFFFF
});
writingLessonCloseButtonText.anchor.set(0.5, 0.5);
writingLessonCloseButtonText.x = 1024;
writingLessonCloseButtonText.y = 1800;
writingLessonCloseButtonText.alpha = 0;
game.addChild(writingLessonCloseButtonText);
var writingFeedbackText = new Text2('', {
size: 70,
fill: 0x32CD32
});
writingFeedbackText.anchor.set(0.5, 0.5);
writingFeedbackText.x = 1024;
writingFeedbackText.y = 1750;
writingFeedbackText.alpha = 0;
game.addChild(writingFeedbackText);
var writingHomeButton = game.addChild(LK.getAsset('homeButton', {
anchorX: 0.5,
anchorY: 0.5
}));
writingHomeButton.x = 1700;
writingHomeButton.y = 1800;
writingHomeButton.alpha = 0;
var writingHomeButtonText = new Text2('Home', {
size: 40,
fill: 0xFFFFFF
});
writingHomeButtonText.anchor.set(0.5, 0.5);
writingHomeButtonText.x = 1700;
writingHomeButtonText.y = 1800;
writingHomeButtonText.alpha = 0;
game.addChild(writingHomeButtonText);
// Create home screen background shapes
var homeBackgroundShapes = [];
var homeBackgroundColors = [0xFF6B6B, 0x4ECDC4, 0x45B7D1, 0x96CEB4, 0xFECA57, 0xFF9FF3, 0x54A0FF];
// Create floating background shapes
for (var i = 0; i < 8; i++) {
var shape = game.addChild(LK.getAsset('star', {
anchorX: 0.5,
anchorY: 0.5
}));
shape.x = Math.random() * 2048;
shape.y = Math.random() * 2732;
shape.alpha = 0.3;
shape.tint = homeBackgroundColors[i % homeBackgroundColors.length];
shape.scaleX = 0.5 + Math.random() * 1.5;
shape.scaleY = shape.scaleX;
shape.speedX = (Math.random() - 0.5) * 2;
shape.speedY = (Math.random() - 0.5) * 2;
shape.rotationSpeed = (Math.random() - 0.5) * 0.02;
homeBackgroundShapes.push(shape);
}
// Create home screen UI elements
var homeScreenPanel = game.addChild(LK.getAsset('instructionPanel', {
anchorX: 0.5,
anchorY: 0.5
}));
homeScreenPanel.x = 1024;
homeScreenPanel.y = 1366;
homeScreenPanel.alpha = 1;
var homeScreenTitle = new Text2('Learning Center', {
size: 120,
fill: 0x333333
});
homeScreenTitle.anchor.set(0.5, 0.5);
homeScreenTitle.x = 1024;
homeScreenTitle.y = 1000;
homeScreenTitle.alpha = 1;
game.addChild(homeScreenTitle);
var homeRightButton = game.addChild(LK.getAsset('submitButton', {
anchorX: 0.5,
anchorY: 0.5
}));
homeRightButton.x = 800;
homeRightButton.y = 1300;
homeRightButton.alpha = 1;
homeRightButton.tint = 0x9370DB;
var homeRightButtonText = new Text2('Write', {
size: 70,
fill: 0xFFFFFF
});
homeRightButtonText.anchor.set(0.5, 0.5);
homeRightButtonText.x = 800;
homeRightButtonText.y = 1300;
homeRightButtonText.alpha = 1;
game.addChild(homeRightButtonText);
var homeMathButton = game.addChild(LK.getAsset('submitButton', {
anchorX: 0.5,
anchorY: 0.5
}));
homeMathButton.x = 1248;
homeMathButton.y = 1300;
homeMathButton.alpha = 1;
homeMathButton.tint = 0x32CD32;
var homeMathButtonText = new Text2('Math', {
size: 70,
fill: 0xFFFFFF
});
homeMathButtonText.anchor.set(0.5, 0.5);
homeMathButtonText.x = 1248;
homeMathButtonText.y = 1300;
homeMathButtonText.alpha = 1;
game.addChild(homeMathButtonText);
// Initialize with home screen visible
hideAllGameElements();
// Functions to show/hide lesson menu
function showLessonMenu() {
showingLessonMenu = true;
// Hide game elements
problemBox.alpha = 0;
problemText.alpha = 0;
writingArea.alpha = 0;
textBar.alpha = 0;
answerText.alpha = 0;
instructionText.alpha = 0;
submitButton.alpha = 0;
submitButtonText.alpha = 0;
clearButton.alpha = 0;
clearButtonText.alpha = 0;
howToReadButton.alpha = 0;
howToReadButtonText.alpha = 0;
keyboardBackground.alpha = 0;
for (var i = 0; i < keyboardButtons.length; i++) {
keyboardButtons[i].alpha = 0;
keyboardTexts[i].alpha = 0;
}
feedbackText.alpha = 0;
// Show lesson menu
lessonMenuPanel.alpha = 1;
lessonMenuTitle.alpha = 1;
additionButton.alpha = 1;
additionButtonText.alpha = 1;
multiplicationButton.alpha = 1;
multiplicationButtonText.alpha = 1;
lessonCloseButton.alpha = 1;
lessonCloseButtonText.alpha = 1;
}
function hideLessonMenu() {
showingLessonMenu = false;
// Hide lesson menu
lessonMenuPanel.alpha = 0;
lessonMenuTitle.alpha = 0;
additionButton.alpha = 0;
additionButtonText.alpha = 0;
multiplicationButton.alpha = 0;
multiplicationButtonText.alpha = 0;
lessonCloseButton.alpha = 0;
lessonCloseButtonText.alpha = 0;
// Show game elements
problemBox.alpha = 1;
problemText.alpha = 1;
writingArea.alpha = 1;
if (writingArea.writtenAnswer.length > 0) {
textBar.alpha = 1;
}
answerText.alpha = 1;
instructionText.alpha = 1;
submitButton.alpha = 1;
submitButtonText.alpha = 1;
clearButton.alpha = 1;
clearButtonText.alpha = 1;
howToReadButton.alpha = 1;
howToReadButtonText.alpha = 1;
keyboardBackground.alpha = 1;
for (var i = 0; i < keyboardButtons.length; i++) {
keyboardButtons[i].alpha = 1;
keyboardTexts[i].alpha = 1;
}
feedbackText.alpha = 1;
}
function showLessonContent(lessonType) {
currentLessonType = lessonType;
// Hide game elements
problemBox.alpha = 0;
problemText.alpha = 0;
writingArea.alpha = 0;
textBar.alpha = 0;
answerText.alpha = 0;
instructionText.alpha = 0;
submitButton.alpha = 0;
submitButtonText.alpha = 0;
clearButton.alpha = 0;
clearButtonText.alpha = 0;
howToReadButton.alpha = 0;
howToReadButtonText.alpha = 0;
keyboardBackground.alpha = 0;
for (var i = 0; i < keyboardButtons.length; i++) {
keyboardButtons[i].alpha = 0;
keyboardTexts[i].alpha = 0;
}
feedbackText.alpha = 0;
// Show lesson content
lessonContentPanel.alpha = 1;
lessonContentTitle.alpha = 1;
lessonContentText.alpha = 1;
lessonContentCloseButton.alpha = 1;
lessonContentCloseButtonText.alpha = 1;
if (lessonType === 'addition') {
lessonContentTitle.setText('Addition Lesson');
lessonContentText.setText('• Addition means combining numbers together\n• The + symbol means "add" or "plus"\n• Example: 3 + 2 = 5\n• Think of it as counting forward\n• Start with the first number: 3\n• Count forward by the second number: 4, 5\n• Practice: 5 + 3 = ? (Start at 5, count: 6, 7, 8)\n• Try some problems to practice!');
} else if (lessonType === 'multiplication') {
lessonContentTitle.setText('Multiplication Lesson');
lessonContentText.setText('• Multiplication means repeated addition\n• The × symbol means "times" or "multiply"\n• Example: 3 × 2 = 6 (same as 3 + 3 = 6)\n• Think of it as groups of numbers\n• 3 × 2 means "3 groups of 2" or "2 groups of 3"\n• Practice: 4 × 3 = ? (4 + 4 + 4 = 12)\n• Start with small numbers and work up!\n• Try some problems to practice!');
}
}
function hideLessonContent() {
// Hide lesson content
lessonContentPanel.alpha = 0;
lessonContentTitle.alpha = 0;
lessonContentText.alpha = 0;
lessonContentCloseButton.alpha = 0;
lessonContentCloseButtonText.alpha = 0;
// Show game elements
problemBox.alpha = 1;
problemText.alpha = 1;
writingArea.alpha = 1;
if (writingArea.writtenAnswer.length > 0) {
textBar.alpha = 1;
}
answerText.alpha = 1;
instructionText.alpha = 1;
submitButton.alpha = 1;
submitButtonText.alpha = 1;
clearButton.alpha = 1;
clearButtonText.alpha = 1;
howToReadButton.alpha = 1;
howToReadButtonText.alpha = 1;
keyboardBackground.alpha = 1;
for (var i = 0; i < keyboardButtons.length; i++) {
keyboardButtons[i].alpha = 1;
keyboardTexts[i].alpha = 1;
}
feedbackText.alpha = 1;
}
function showWritingLesson() {
showingWritingLesson = true;
screenState = 'writing_lesson';
// Hide game elements
problemBox.alpha = 0;
problemText.alpha = 0;
writingArea.alpha = 0;
textBar.alpha = 0;
answerText.alpha = 0;
instructionText.alpha = 0;
submitButton.alpha = 0;
submitButtonText.alpha = 0;
clearButton.alpha = 0;
clearButtonText.alpha = 0;
howToReadButton.alpha = 0;
howToReadButtonText.alpha = 0;
keyboardBackground.alpha = 0;
for (var i = 0; i < keyboardButtons.length; i++) {
keyboardButtons[i].alpha = 0;
keyboardTexts[i].alpha = 0;
}
feedbackText.alpha = 0;
lessonButton.alpha = 0;
lessonButtonText.alpha = 0;
// Show writing lesson elements
writingLessonPanel.alpha = 1;
writingLessonTitle.alpha = 1;
writingPromptText.alpha = 1;
writingLessonArea.alpha = 1;
writingLessonTextBar.alpha = 1;
writingLessonAnswerText.alpha = 1;
writingCheckButton.alpha = 1;
writingCheckButtonText.alpha = 1;
writingClearButton.alpha = 1;
writingClearButtonText.alpha = 1;
writingLessonCloseButton.alpha = 1;
writingLessonCloseButtonText.alpha = 1;
writingFeedbackText.alpha = 1;
writingHomeButton.alpha = 1;
writingHomeButtonText.alpha = 1;
// Show letter keyboard
letterKeyboardBackground.alpha = 1;
for (var i = 0; i < letterKeyboardButtons.length; i++) {
letterKeyboardButtons[i].alpha = 1;
letterKeyboardTexts[i].alpha = 1;
}
// Set a writing prompt
var prompts = ['Hello', 'World', 'Learn', 'Write', 'Practice'];
writingPrompt = prompts[Math.floor(Math.random() * prompts.length)];
writingPromptText.setText('Write the word: ' + writingPrompt);
writingAnswer = writingPrompt.toLowerCase();
writingLessonArea.writtenAnswer = '';
writingLessonAnswerText.setText('');
writingFeedbackText.setText('');
}
function hideWritingLesson() {
showingWritingLesson = false;
screenState = 'game';
// Hide writing lesson elements
writingLessonPanel.alpha = 0;
writingLessonTitle.alpha = 0;
writingPromptText.alpha = 0;
writingLessonArea.alpha = 0;
writingLessonTextBar.alpha = 0;
writingLessonAnswerText.alpha = 0;
writingCheckButton.alpha = 0;
writingCheckButtonText.alpha = 0;
writingClearButton.alpha = 0;
writingClearButtonText.alpha = 0;
writingLessonCloseButton.alpha = 0;
writingLessonCloseButtonText.alpha = 0;
writingFeedbackText.alpha = 0;
writingHomeButton.alpha = 0;
writingHomeButtonText.alpha = 0;
// Hide letter keyboard
letterKeyboardBackground.alpha = 0;
for (var i = 0; i < letterKeyboardButtons.length; i++) {
letterKeyboardButtons[i].alpha = 0;
letterKeyboardTexts[i].alpha = 0;
}
// Show game elements
problemBox.alpha = 1;
problemText.alpha = 1;
writingArea.alpha = 1;
if (writingArea.writtenAnswer.length > 0) {
textBar.alpha = 1;
}
answerText.alpha = 1;
instructionText.alpha = 1;
submitButton.alpha = 1;
submitButtonText.alpha = 1;
clearButton.alpha = 1;
clearButtonText.alpha = 1;
howToReadButton.alpha = 1;
howToReadButtonText.alpha = 1;
keyboardBackground.alpha = 1;
for (var i = 0; i < keyboardButtons.length; i++) {
keyboardButtons[i].alpha = 1;
keyboardTexts[i].alpha = 1;
}
feedbackText.alpha = 1;
lessonButton.alpha = 1;
lessonButtonText.alpha = 1;
}
function showHomeScreen() {
// Show home screen elements
homeScreenPanel.alpha = 1;
homeScreenTitle.alpha = 1;
homeRightButton.alpha = 1;
homeRightButtonText.alpha = 1;
homeMathButton.alpha = 1;
homeMathButtonText.alpha = 1;
// Show background shapes
for (var i = 0; i < homeBackgroundShapes.length; i++) {
homeBackgroundShapes[i].alpha = 0.3;
}
// Hide all other elements
hideAllGameElements();
}
function hideHomeScreen() {
// Hide home screen elements
homeScreenPanel.alpha = 0;
homeScreenTitle.alpha = 0;
homeRightButton.alpha = 0;
homeRightButtonText.alpha = 0;
homeMathButton.alpha = 0;
homeMathButtonText.alpha = 0;
// Hide background shapes
for (var i = 0; i < homeBackgroundShapes.length; i++) {
homeBackgroundShapes[i].alpha = 0;
}
}
function hideAllGameElements() {
// Hide game elements
problemBox.alpha = 0;
problemText.alpha = 0;
writingArea.alpha = 0;
textBar.alpha = 0;
answerText.alpha = 0;
instructionText.alpha = 0;
submitButton.alpha = 0;
submitButtonText.alpha = 0;
clearButton.alpha = 0;
clearButtonText.alpha = 0;
howToReadButton.alpha = 0;
howToReadButtonText.alpha = 0;
keyboardBackground.alpha = 0;
for (var i = 0; i < keyboardButtons.length; i++) {
keyboardButtons[i].alpha = 0;
keyboardTexts[i].alpha = 0;
}
feedbackText.alpha = 0;
lessonButton.alpha = 0;
lessonButtonText.alpha = 0;
nextButton.alpha = 0;
nextButtonText.alpha = 0;
mathHomeButton.alpha = 0;
mathHomeButtonText.alpha = 0;
}
function showGameElements() {
// Show game elements
problemBox.alpha = 1;
problemText.alpha = 1;
writingArea.alpha = 1;
if (writingArea.writtenAnswer.length > 0) {
textBar.alpha = 1;
}
answerText.alpha = 1;
instructionText.alpha = 1;
submitButton.alpha = 1;
submitButtonText.alpha = 1;
clearButton.alpha = 1;
clearButtonText.alpha = 1;
howToReadButton.alpha = 0;
howToReadButtonText.alpha = 0;
keyboardBackground.alpha = 1;
for (var i = 0; i < keyboardButtons.length; i++) {
keyboardButtons[i].alpha = 1;
keyboardTexts[i].alpha = 1;
}
feedbackText.alpha = 1;
lessonButton.alpha = 1;
lessonButtonText.alpha = 1;
mathHomeButton.alpha = 1;
mathHomeButtonText.alpha = 1;
}
function checkWritingAnswer() {
var userAnswer = writingLessonArea.writtenAnswer.toLowerCase().trim();
if (userAnswer === writingAnswer) {
writingFeedbackText.setText('Correct! Well done!');
writingFeedbackText.tint = 0x32CD32;
LK.getSound('correct').play();
LK.setTimeout(function () {
// Generate new prompt
var prompts = ['Hello', 'World', 'Learn', 'Write', 'Practice', 'Good', 'Nice', 'Great'];
writingPrompt = prompts[Math.floor(Math.random() * prompts.length)];
writingPromptText.setText('Write the word: ' + writingPrompt);
writingAnswer = writingPrompt.toLowerCase();
writingLessonArea.clearDrawing();
writingLessonAnswerText.setText('');
writingFeedbackText.setText('');
}, 2000);
} else {
writingFeedbackText.setText('Try again! The word is: ' + writingPrompt);
writingFeedbackText.tint = 0xFF6B6B;
LK.getSound('incorrect').play();
LK.setTimeout(function () {
writingFeedbackText.setText('');
}, 2000);
}
}
lessonButton.down = function (x, y, obj) {
if (!showingInstructions && !showingLessonMenu && screenState === 'game') {
screenState = 'lesson_menu';
showLessonMenu();
}
};
additionButton.down = function (x, y, obj) {
if (showingLessonMenu && screenState === 'lesson_menu') {
hideLessonMenu();
screenState = 'lesson_content';
showLessonContent('addition');
}
};
multiplicationButton.down = function (x, y, obj) {
if (showingLessonMenu && screenState === 'lesson_menu') {
hideLessonMenu();
screenState = 'lesson_content';
showLessonContent('multiplication');
}
};
lessonCloseButton.down = function (x, y, obj) {
if (showingLessonMenu && screenState === 'lesson_menu') {
hideLessonMenu();
screenState = 'game';
}
};
lessonContentCloseButton.down = function (x, y, obj) {
if (currentLessonType !== '' && screenState === 'lesson_content') {
hideLessonContent();
currentLessonType = '';
screenState = 'game';
}
};
writingCheckButton.down = function (x, y, obj) {
if (showingWritingLesson && writingLessonArea.writtenAnswer !== '') {
checkWritingAnswer();
}
};
writingClearButton.down = function (x, y, obj) {
if (showingWritingLesson) {
writingLessonArea.clearDrawing();
writingLessonAnswerText.setText('');
writingFeedbackText.setText('');
}
};
writingLessonCloseButton.down = function (x, y, obj) {
if (showingWritingLesson && screenState === 'writing_lesson') {
hideWritingLesson();
}
};
homeRightButton.down = function (x, y, obj) {
if (screenState === 'home') {
hideHomeScreen();
screenState = 'writing_lesson';
showWritingLesson();
}
};
homeMathButton.down = function (x, y, obj) {
if (screenState === 'home') {
hideHomeScreen();
screenState = 'game';
showGameElements();
}
};
mathHomeButton.down = function (x, y, obj) {
if (screenState === 'game') {
hideAllGameElements();
screenState = 'home';
showHomeScreen();
}
};
writingHomeButton.down = function (x, y, obj) {
if (screenState === 'writing_lesson') {
hideWritingLesson();
screenState = 'home';
showHomeScreen();
}
};
game.update = function () {
for (var i = celebrationStars.length - 1; i >= 0; i--) {
var star = celebrationStars[i];
if (star.alpha <= 0) {
celebrationStars.splice(i, 1);
}
}
// Animate home screen background shapes
if (screenState === 'home') {
for (var i = 0; i < homeBackgroundShapes.length; i++) {
var shape = homeBackgroundShapes[i];
// Move shapes
shape.x += shape.speedX;
shape.y += shape.speedY;
// Rotate shapes
shape.rotation += shape.rotationSpeed;
// Bounce off edges
if (shape.x < 0 || shape.x > 2048) {
shape.speedX *= -1;
}
if (shape.y < 0 || shape.y > 2732) {
shape.speedY *= -1;
}
// Keep shapes within bounds
if (shape.x < 0) shape.x = 0;
if (shape.x > 2048) shape.x = 2048;
if (shape.y < 0) shape.y = 0;
if (shape.y > 2732) shape.y = 2732;
}
}
};