Code edit (1 edits merged)
Please save this source code
User prompt
add when the player choose correct or in correct answer the space should be 10 lines between the question panel and the message
User prompt
add when the player choose correct or in correct answer the space should be 4 lines between the question panel and the message
User prompt
add 4lines space after the question panel
User prompt
add a player choose the correct answer then pop the congratualtion message with paper blast
User prompt
the emoji should be fun and sad mixing and it will walk the through the page
User prompt
add when the player choose incorrect answer then the sad emoji has to appear in that page
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot set properties of undefined (setting 'alpha')' in or related to this line: 'quitButton.buttonShape.alpha = 0.7;' Line Number: 712
User prompt
add option in the the home Ui
User prompt
remove the over all badges option in the game
User prompt
add 20 questions for each category
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot set properties of undefined (setting 'alpha')' in or related to this line: 'nextButton.buttonShape.alpha = 1;' Line Number: 233
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot set properties of undefined (setting 'fill')' in or related to this line: 'feedbackText.style.fill = "#FF3B30";' Line Number: 252
Code edit (1 edits merged)
Please save this source code
User prompt
Science Explorer: Educational Discovery Quest
Initial prompt
"Create an interactive educational game called Science Explorer where players learn about space, wildlife, and the human body through engaging activities. 🧩 Game Structure: Players choose from three categories: Space, Wildlife, and Human Anatomy.(every category contains 25 questions) Quiz Mode: Answer fun science questions to unlock new levels. for every correct answer-- congratulations pop up Mini-Puzzles: Solve interactive challenges to reinforce learning. add quit option --then player will want to quit any time they will 🏆 Progress & Rewards: Correct answers unlock new levels and earn badges like "Space Cadet", "Wildlife Ranger", and "Anatomy Expert". Fun animations and sounds celebrate achievements. A progress tracker keeps players motivated. 🎨 Design & UX: Bright, engaging visuals with smooth animations and easy navigation. Instant feedback: "Great Job!" for correct answers, hints for retries. No time pressure, allowing a stress-free learning experience. 🏁 Win/Lose Condition: ✅ Completing activities unlocks new challenges.
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1", { currentCategory: "space", progress: { space: 0, wildlife: 0, anatomy: 0 }, badges: { space: false, wildlife: false, anatomy: false }, currentLevel: 1, highestLevel: 1 }); /**** * Classes ****/ var Badge = Container.expand(function (category) { var self = Container.call(this); var badgeShape = self.attachAsset('badgeIcon', { anchorX: 0.5, anchorY: 0.5 }); var badgeText = new Text2(getCategoryName(category), { size: 24, fill: 0x000000 }); badgeText.anchor.set(0.5, 0.5); self.addChild(badgeText); self.category = category; self.unlocked = false; self.unlock = function () { if (!self.unlocked) { self.unlocked = true; tween(badgeShape, { scaleX: 1.3, scaleY: 1.3 }, { duration: 500, easing: tween.elasticOut, onFinish: function onFinish() { tween(badgeShape, { scaleX: 1.0, scaleY: 1.0 }, { duration: 300, easing: tween.easeOut }); } }); } }; self.setLocked = function () { badgeShape.alpha = 0.4; badgeText.alpha = 0.4; self.unlocked = false; }; return self; }); var CategoryButton = Container.expand(function (category, title, description) { var self = Container.call(this); var buttonShape = self.attachAsset(category + 'Theme', { anchorX: 0.5, anchorY: 0.5 }); var titleText = new Text2(title, { size: 60, fill: 0xFFFFFF }); titleText.anchor.set(0.5, 0); titleText.y = -80; self.addChild(titleText); var descText = new Text2(description, { size: 30, fill: 0xFFFFFF }); descText.anchor.set(0.5, 0); descText.y = 10; descText.wordWrap = true; descText.wordWrapWidth = 450; self.addChild(descText); var progressLabel = new Text2("Progress: 0%", { size: 30, fill: 0xFFFFFF }); progressLabel.anchor.set(0.5, 0); progressLabel.y = 100; self.addChild(progressLabel); self.category = category; self.updateProgress = function (progress) { progressLabel.setText("Progress: " + Math.floor(progress * 100) + "%"); }; self.down = function (x, y, obj) { LK.getSound('buttonClick').play(); buttonShape.alpha = 0.7; }; self.up = function (x, y, obj) { buttonShape.alpha = 1; selectCategory(self.category); }; return self; }); var OptionButton = Container.expand(function (text) { var self = Container.call(this); var buttonShape = self.attachAsset('optionButton', { anchorX: 0.5, anchorY: 0.5 }); var optionText = new Text2(text, { size: 40, fill: 0xFFFFFF }); optionText.anchor.set(0.5, 0.5); self.addChild(optionText); self.isCorrect = false; self.setText = function (text) { optionText.setText(text); }; self.down = function (x, y, obj) { LK.getSound('buttonClick').play(); buttonShape.alpha = 0.7; }; self.up = function (x, y, obj) { buttonShape.alpha = 1; checkAnswer(self); }; self.setEnabled = function (enabled) { self.interactive = enabled; buttonShape.alpha = enabled ? 1 : 0.5; }; return self; }); var ProgressBar = Container.expand(function () { var self = Container.call(this); var barBackground = self.attachAsset('progressBar', { anchorX: 0, anchorY: 0.5 }); var barFill = self.attachAsset('progressFill', { anchorX: 0, anchorY: 0.5 }); var levelText = new Text2("Level 1", { size: 40, fill: 0xFFFFFF }); levelText.anchor.set(0.5, 0.5); levelText.x = barBackground.width / 2; self.addChild(levelText); self.updateProgress = function (current, total) { var percentage = current / total; var targetWidth = barBackground.width * percentage; tween(barFill, { width: targetWidth }, { duration: 500, easing: tween.easeOut }); levelText.setText("Level " + storage.currentLevel); }; return self; }); var QuestionPanel = Container.expand(function () { var self = Container.call(this); var panel = self.attachAsset('questionPanel', { anchorX: 0.5, anchorY: 0.5 }); var questionText = new Text2("", { size: 50, fill: 0x000000 }); questionText.anchor.set(0.5, 0); questionText.y = -150; questionText.wordWrap = true; questionText.wordWrapWidth = 1700; self.addChild(questionText); self.options = []; for (var i = 0; i < 4; i++) { var option = new OptionButton(""); option.x = i % 2 === 0 ? -400 : 400; option.y = i < 2 ? 0 : 150; self.options.push(option); self.addChild(option); } var feedbackIcon = self.attachAsset('correctFeedback', { anchorX: 0.5, anchorY: 0.5, x: 0, y: 250 }); feedbackIcon.visible = false; var feedbackText = new Text2("", { size: 40, fill: 0x000000 }); feedbackText.anchor.set(0.5, 0.5); feedbackText.y = 250; feedbackText.wordWrap = true; feedbackText.wordWrapWidth = 1700; self.addChild(feedbackText); var nextButton = new OptionButton("Next Question"); nextButton.y = 350; nextButton.visible = false; self.addChild(nextButton); nextButton.up = function () { nextButton.buttonShape.alpha = 1; loadNextQuestion(); }; self.setQuestion = function (question) { questionText.setText(question.question); for (var i = 0; i < self.options.length; i++) { self.options[i].setText(question.options[i]); self.options[i].isCorrect = i === question.correctIndex; self.options[i].setEnabled(true); } feedbackIcon.visible = false; feedbackText.setText(""); nextButton.visible = false; }; self.showFeedback = function (correct, explanation) { feedbackIcon.visible = true; if (correct) { feedbackIcon.texture = LK.getAsset('correctFeedback', {}).texture; feedbackText.setText("Correct! " + explanation); feedbackText.style.fill = "#34C759"; } else { feedbackIcon.texture = LK.getAsset('incorrectFeedback', {}).texture; feedbackText.setText("Incorrect. " + explanation); feedbackText.style.fill = "#FF3B30"; } nextButton.visible = true; // Disable all option buttons for (var i = 0; i < self.options.length; i++) { self.options[i].setEnabled(false); } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x87CEEB }); /**** * Game Code ****/ // Game state variables var currentScreen = "categories"; // categories, gameplay var questions = []; var currentQuestionIndex = 0; var categoryButtons = []; // Category and question data var categoryData = { space: { name: "Space", description: "Explore planets, stars, and galaxies", questions: [{ question: "Which planet is known as the Red Planet?", options: ["Venus", "Mars", "Jupiter", "Mercury"], correctIndex: 1, explanation: "Mars is called the Red Planet because of the reddish iron oxide on its surface." }, { question: "How many planets are in our solar system?", options: ["7", "8", "9", "10"], correctIndex: 1, explanation: "There are 8 planets: Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, and Neptune." }, { question: "What is the largest planet in our solar system?", options: ["Earth", "Saturn", "Jupiter", "Neptune"], correctIndex: 2, explanation: "Jupiter is the largest planet in our solar system." }, { question: "What is the name of the galaxy we live in?", options: ["Andromeda", "Milky Way", "Triangulum", "Sombrero"], correctIndex: 1, explanation: "We live in the Milky Way galaxy, which contains billions of stars." }, { question: "What causes the phases of the Moon?", options: ["Earth's shadow", "Moon's rotation", "Moon's orbit and sunlight", "Solar flares"], correctIndex: 2, explanation: "The Moon's phases are caused by its position relative to Earth and the Sun as it orbits Earth." }] }, wildlife: { name: "Wildlife", description: "Discover amazing animals and their habitats", questions: [{ question: "Which is the fastest land animal?", options: ["Lion", "Cheetah", "Gazelle", "Elephant"], correctIndex: 1, explanation: "Cheetahs can run up to 70 mph (112 km/h) for short bursts." }, { question: "What do koalas mainly eat?", options: ["Bamboo", "Eucalyptus leaves", "Fruits", "Insects"], correctIndex: 1, explanation: "Koalas primarily eat eucalyptus leaves, which are toxic to many other animals." }, { question: "Which animal is known as the 'King of the Jungle'?", options: ["Tiger", "Lion", "Gorilla", "Panther"], correctIndex: 1, explanation: "Lions are called 'King of the Jungle' despite living in savannas, not jungles." }, { question: "How many hearts does an octopus have?", options: ["1", "2", "3", "4"], correctIndex: 2, explanation: "Octopuses have three hearts: two pump blood through the gills and one pumps it through the body." }, { question: "Which bird can fly backward?", options: ["Eagle", "Sparrow", "Hummingbird", "Penguin"], correctIndex: 2, explanation: "Hummingbirds are the only birds that can fly backward, upside down, and hover in mid-air." }] }, anatomy: { name: "Human Anatomy", description: "Learn about the amazing human body", questions: [{ question: "What is the largest organ in the human body?", options: ["Heart", "Liver", "Skin", "Brain"], correctIndex: 2, explanation: "The skin is the body's largest organ, covering about 20 square feet in adults." }, { question: "How many bones are in the adult human body?", options: ["206", "186", "226", "246"], correctIndex: 0, explanation: "The adult human body has 206 bones. Babies are born with about 300 bones that fuse as they grow." }, { question: "What is the strongest muscle in the human body?", options: ["Biceps", "Heart", "Jaw muscles", "Gluteus maximus"], correctIndex: 2, explanation: "The masseter (jaw muscle) is the strongest based on its size and the force it can exert." }, { question: "What percentage of the human body is water?", options: ["50-60%", "60-70%", "70-80%", "80-90%"], correctIndex: 1, explanation: "The human body is composed of about 60-70% water, varying by age, gender, and body composition." }, { question: "Which part of the body produces insulin?", options: ["Liver", "Kidney", "Pancreas", "Gallbladder"], correctIndex: 2, explanation: "The pancreas produces insulin, which regulates blood sugar levels." }] } }; // UI Elements var questionPanel = new QuestionPanel(); questionPanel.x = 2048 / 2; questionPanel.y = 2732 / 2; questionPanel.visible = false; var progressBar = new ProgressBar(); progressBar.x = 124; progressBar.y = 100; progressBar.visible = false; var badges = []; // Helper functions function getCategoryName(category) { return categoryData[category].name; } function selectCategory(category) { currentScreen = "gameplay"; storage.currentCategory = category; // Update UI visibility showGameplayScreen(); // Load questions questions = categoryData[category].questions; currentQuestionIndex = 0; // Show first question loadQuestion(currentQuestionIndex); // Update progress bar progressBar.updateProgress(currentQuestionIndex, questions.length); LK.playMusic('gameMusic'); } function showCategoriesScreen() { currentScreen = "categories"; // Hide gameplay elements questionPanel.visible = false; progressBar.visible = false; // Show category buttons for (var i = 0; i < categoryButtons.length; i++) { categoryButtons[i].visible = true; categoryButtons[i].updateProgress(storage.progress[categoryButtons[i].category]); } // Show badges for (var i = 0; i < badges.length; i++) { badges[i].visible = true; if (storage.badges[badges[i].category]) { badges[i].unlock(); } else { badges[i].setLocked(); } } } function showGameplayScreen() { // Hide category buttons for (var i = 0; i < categoryButtons.length; i++) { categoryButtons[i].visible = false; } // Hide badges for (var i = 0; i < badges.length; i++) { badges[i].visible = false; } // Show gameplay elements questionPanel.visible = true; progressBar.visible = true; } function loadQuestion(index) { if (index < questions.length) { questionPanel.setQuestion(questions[index]); } else { completeCategoryProgress(); } } function loadNextQuestion() { currentQuestionIndex++; progressBar.updateProgress(currentQuestionIndex, questions.length); loadQuestion(currentQuestionIndex); } function checkAnswer(selectedOption) { var isCorrect = selectedOption.isCorrect; if (isCorrect) { LK.getSound('correct').play(); LK.setScore(LK.getScore() + 10); } else { LK.getSound('incorrect').play(); } questionPanel.showFeedback(isCorrect, questions[currentQuestionIndex].explanation); // Update progress if (isCorrect) { var categoryProgress = storage.progress[storage.currentCategory]; var newProgress = (currentQuestionIndex + 1) / questions.length; if (newProgress > categoryProgress) { storage.progress[storage.currentCategory] = newProgress; } } } function completeCategoryProgress() { // Award badge if completed all questions if (storage.progress[storage.currentCategory] >= 1) { storage.badges[storage.currentCategory] = true; // Increase level if all badges are collected if (storage.badges.space && storage.badges.wildlife && storage.badges.anatomy) { storage.currentLevel++; if (storage.currentLevel > storage.highestLevel) { storage.highestLevel = storage.currentLevel; } } LK.getSound('levelComplete').play(); } showCategoriesScreen(); } // Initialize game function initializeGame() { // Create category selection screen var spaceButton = new CategoryButton('space', "SPACE", "Explore planets, stars, and the universe"); spaceButton.x = 2048 / 2 - 550; spaceButton.y = 2732 / 2; game.addChild(spaceButton); categoryButtons.push(spaceButton); var wildlifeButton = new CategoryButton('wildlife', "WILDLIFE", "Discover amazing animals and their habitats"); wildlifeButton.x = 2048 / 2; wildlifeButton.y = 2732 / 2; game.addChild(wildlifeButton); categoryButtons.push(wildlifeButton); var anatomyButton = new CategoryButton('anatomy', "ANATOMY", "Learn about the amazing human body"); anatomyButton.x = 2048 / 2 + 550; anatomyButton.y = 2732 / 2; game.addChild(anatomyButton); categoryButtons.push(anatomyButton); // Create title var titleText = new Text2("SCIENCE EXPLORER", { size: 100, fill: 0xFFFFFF }); titleText.anchor.set(0.5, 0.5); titleText.x = 2048 / 2; titleText.y = 400; game.addChild(titleText); var subtitleText = new Text2("Choose a topic to explore", { size: 50, fill: 0xFFFFFF }); subtitleText.anchor.set(0.5, 0.5); subtitleText.x = 2048 / 2; subtitleText.y = 500; game.addChild(subtitleText); // Create badges var spaceBadge = new Badge('space'); spaceBadge.x = 2048 / 2 - 350; spaceBadge.y = 1800; game.addChild(spaceBadge); badges.push(spaceBadge); var wildlifeBadge = new Badge('wildlife'); wildlifeBadge.x = 2048 / 2; wildlifeBadge.y = 1800; game.addChild(wildlifeBadge); badges.push(wildlifeBadge); var anatomyBadge = new Badge('anatomy'); anatomyBadge.x = 2048 / 2 + 350; anatomyBadge.y = 1800; game.addChild(anatomyBadge); badges.push(anatomyBadge); var badgeTitle = new Text2("Badges", { size: 60, fill: 0xFFFFFF }); badgeTitle.anchor.set(0.5, 0.5); badgeTitle.x = 2048 / 2; badgeTitle.y = 1700; game.addChild(badgeTitle); // Set initial badge states for (var i = 0; i < badges.length; i++) { if (storage.badges[badges[i].category]) { badges[i].unlock(); } else { badges[i].setLocked(); } } // Create score display var scoreText = new Text2("Score: 0", { size: 50, fill: 0xFFFFFF }); scoreText.anchor.set(1, 0); LK.gui.topRight.addChild(scoreText); // Add gameplay elements game.addChild(questionPanel); game.addChild(progressBar); // Update category buttons with saved progress for (var i = 0; i < categoryButtons.length; i++) { categoryButtons[i].updateProgress(storage.progress[categoryButtons[i].category]); } // Update UI based on initial screen if (currentScreen === "categories") { showCategoriesScreen(); } else { showGameplayScreen(); } // Update score display LK.setScore(0); } initializeGame(); // Game update loop game.update = function () { // Update score display var scoreDisplay = LK.gui.topRight.children[0]; if (scoreDisplay) { scoreDisplay.setText("Score: " + LK.getScore()); } }; LK.playMusic('gameMusic');
===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,560 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+var storage = LK.import("@upit/storage.v1", {
+ currentCategory: "space",
+ progress: {
+ space: 0,
+ wildlife: 0,
+ anatomy: 0
+ },
+ badges: {
+ space: false,
+ wildlife: false,
+ anatomy: false
+ },
+ currentLevel: 1,
+ highestLevel: 1
+});
+
+/****
+* Classes
+****/
+var Badge = Container.expand(function (category) {
+ var self = Container.call(this);
+ var badgeShape = self.attachAsset('badgeIcon', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ var badgeText = new Text2(getCategoryName(category), {
+ size: 24,
+ fill: 0x000000
+ });
+ badgeText.anchor.set(0.5, 0.5);
+ self.addChild(badgeText);
+ self.category = category;
+ self.unlocked = false;
+ self.unlock = function () {
+ if (!self.unlocked) {
+ self.unlocked = true;
+ tween(badgeShape, {
+ scaleX: 1.3,
+ scaleY: 1.3
+ }, {
+ duration: 500,
+ easing: tween.elasticOut,
+ onFinish: function onFinish() {
+ tween(badgeShape, {
+ scaleX: 1.0,
+ scaleY: 1.0
+ }, {
+ duration: 300,
+ easing: tween.easeOut
+ });
+ }
+ });
+ }
+ };
+ self.setLocked = function () {
+ badgeShape.alpha = 0.4;
+ badgeText.alpha = 0.4;
+ self.unlocked = false;
+ };
+ return self;
+});
+var CategoryButton = Container.expand(function (category, title, description) {
+ var self = Container.call(this);
+ var buttonShape = self.attachAsset(category + 'Theme', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ var titleText = new Text2(title, {
+ size: 60,
+ fill: 0xFFFFFF
+ });
+ titleText.anchor.set(0.5, 0);
+ titleText.y = -80;
+ self.addChild(titleText);
+ var descText = new Text2(description, {
+ size: 30,
+ fill: 0xFFFFFF
+ });
+ descText.anchor.set(0.5, 0);
+ descText.y = 10;
+ descText.wordWrap = true;
+ descText.wordWrapWidth = 450;
+ self.addChild(descText);
+ var progressLabel = new Text2("Progress: 0%", {
+ size: 30,
+ fill: 0xFFFFFF
+ });
+ progressLabel.anchor.set(0.5, 0);
+ progressLabel.y = 100;
+ self.addChild(progressLabel);
+ self.category = category;
+ self.updateProgress = function (progress) {
+ progressLabel.setText("Progress: " + Math.floor(progress * 100) + "%");
+ };
+ self.down = function (x, y, obj) {
+ LK.getSound('buttonClick').play();
+ buttonShape.alpha = 0.7;
+ };
+ self.up = function (x, y, obj) {
+ buttonShape.alpha = 1;
+ selectCategory(self.category);
+ };
+ return self;
+});
+var OptionButton = Container.expand(function (text) {
+ var self = Container.call(this);
+ var buttonShape = self.attachAsset('optionButton', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ var optionText = new Text2(text, {
+ size: 40,
+ fill: 0xFFFFFF
+ });
+ optionText.anchor.set(0.5, 0.5);
+ self.addChild(optionText);
+ self.isCorrect = false;
+ self.setText = function (text) {
+ optionText.setText(text);
+ };
+ self.down = function (x, y, obj) {
+ LK.getSound('buttonClick').play();
+ buttonShape.alpha = 0.7;
+ };
+ self.up = function (x, y, obj) {
+ buttonShape.alpha = 1;
+ checkAnswer(self);
+ };
+ self.setEnabled = function (enabled) {
+ self.interactive = enabled;
+ buttonShape.alpha = enabled ? 1 : 0.5;
+ };
+ return self;
+});
+var ProgressBar = Container.expand(function () {
+ var self = Container.call(this);
+ var barBackground = self.attachAsset('progressBar', {
+ anchorX: 0,
+ anchorY: 0.5
+ });
+ var barFill = self.attachAsset('progressFill', {
+ anchorX: 0,
+ anchorY: 0.5
+ });
+ var levelText = new Text2("Level 1", {
+ size: 40,
+ fill: 0xFFFFFF
+ });
+ levelText.anchor.set(0.5, 0.5);
+ levelText.x = barBackground.width / 2;
+ self.addChild(levelText);
+ self.updateProgress = function (current, total) {
+ var percentage = current / total;
+ var targetWidth = barBackground.width * percentage;
+ tween(barFill, {
+ width: targetWidth
+ }, {
+ duration: 500,
+ easing: tween.easeOut
+ });
+ levelText.setText("Level " + storage.currentLevel);
+ };
+ return self;
+});
+var QuestionPanel = Container.expand(function () {
+ var self = Container.call(this);
+ var panel = self.attachAsset('questionPanel', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ var questionText = new Text2("", {
+ size: 50,
+ fill: 0x000000
+ });
+ questionText.anchor.set(0.5, 0);
+ questionText.y = -150;
+ questionText.wordWrap = true;
+ questionText.wordWrapWidth = 1700;
+ self.addChild(questionText);
+ self.options = [];
+ for (var i = 0; i < 4; i++) {
+ var option = new OptionButton("");
+ option.x = i % 2 === 0 ? -400 : 400;
+ option.y = i < 2 ? 0 : 150;
+ self.options.push(option);
+ self.addChild(option);
+ }
+ var feedbackIcon = self.attachAsset('correctFeedback', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: 0,
+ y: 250
+ });
+ feedbackIcon.visible = false;
+ var feedbackText = new Text2("", {
+ size: 40,
+ fill: 0x000000
+ });
+ feedbackText.anchor.set(0.5, 0.5);
+ feedbackText.y = 250;
+ feedbackText.wordWrap = true;
+ feedbackText.wordWrapWidth = 1700;
+ self.addChild(feedbackText);
+ var nextButton = new OptionButton("Next Question");
+ nextButton.y = 350;
+ nextButton.visible = false;
+ self.addChild(nextButton);
+ nextButton.up = function () {
+ nextButton.buttonShape.alpha = 1;
+ loadNextQuestion();
+ };
+ self.setQuestion = function (question) {
+ questionText.setText(question.question);
+ for (var i = 0; i < self.options.length; i++) {
+ self.options[i].setText(question.options[i]);
+ self.options[i].isCorrect = i === question.correctIndex;
+ self.options[i].setEnabled(true);
+ }
+ feedbackIcon.visible = false;
+ feedbackText.setText("");
+ nextButton.visible = false;
+ };
+ self.showFeedback = function (correct, explanation) {
+ feedbackIcon.visible = true;
+ if (correct) {
+ feedbackIcon.texture = LK.getAsset('correctFeedback', {}).texture;
+ feedbackText.setText("Correct! " + explanation);
+ feedbackText.style.fill = "#34C759";
+ } else {
+ feedbackIcon.texture = LK.getAsset('incorrectFeedback', {}).texture;
+ feedbackText.setText("Incorrect. " + explanation);
+ feedbackText.style.fill = "#FF3B30";
+ }
+ nextButton.visible = true;
+ // Disable all option buttons
+ for (var i = 0; i < self.options.length; i++) {
+ self.options[i].setEnabled(false);
+ }
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x87CEEB
+});
+
+/****
+* Game Code
+****/
+// Game state variables
+var currentScreen = "categories"; // categories, gameplay
+var questions = [];
+var currentQuestionIndex = 0;
+var categoryButtons = [];
+// Category and question data
+var categoryData = {
+ space: {
+ name: "Space",
+ description: "Explore planets, stars, and galaxies",
+ questions: [{
+ question: "Which planet is known as the Red Planet?",
+ options: ["Venus", "Mars", "Jupiter", "Mercury"],
+ correctIndex: 1,
+ explanation: "Mars is called the Red Planet because of the reddish iron oxide on its surface."
+ }, {
+ question: "How many planets are in our solar system?",
+ options: ["7", "8", "9", "10"],
+ correctIndex: 1,
+ explanation: "There are 8 planets: Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, and Neptune."
+ }, {
+ question: "What is the largest planet in our solar system?",
+ options: ["Earth", "Saturn", "Jupiter", "Neptune"],
+ correctIndex: 2,
+ explanation: "Jupiter is the largest planet in our solar system."
+ }, {
+ question: "What is the name of the galaxy we live in?",
+ options: ["Andromeda", "Milky Way", "Triangulum", "Sombrero"],
+ correctIndex: 1,
+ explanation: "We live in the Milky Way galaxy, which contains billions of stars."
+ }, {
+ question: "What causes the phases of the Moon?",
+ options: ["Earth's shadow", "Moon's rotation", "Moon's orbit and sunlight", "Solar flares"],
+ correctIndex: 2,
+ explanation: "The Moon's phases are caused by its position relative to Earth and the Sun as it orbits Earth."
+ }]
+ },
+ wildlife: {
+ name: "Wildlife",
+ description: "Discover amazing animals and their habitats",
+ questions: [{
+ question: "Which is the fastest land animal?",
+ options: ["Lion", "Cheetah", "Gazelle", "Elephant"],
+ correctIndex: 1,
+ explanation: "Cheetahs can run up to 70 mph (112 km/h) for short bursts."
+ }, {
+ question: "What do koalas mainly eat?",
+ options: ["Bamboo", "Eucalyptus leaves", "Fruits", "Insects"],
+ correctIndex: 1,
+ explanation: "Koalas primarily eat eucalyptus leaves, which are toxic to many other animals."
+ }, {
+ question: "Which animal is known as the 'King of the Jungle'?",
+ options: ["Tiger", "Lion", "Gorilla", "Panther"],
+ correctIndex: 1,
+ explanation: "Lions are called 'King of the Jungle' despite living in savannas, not jungles."
+ }, {
+ question: "How many hearts does an octopus have?",
+ options: ["1", "2", "3", "4"],
+ correctIndex: 2,
+ explanation: "Octopuses have three hearts: two pump blood through the gills and one pumps it through the body."
+ }, {
+ question: "Which bird can fly backward?",
+ options: ["Eagle", "Sparrow", "Hummingbird", "Penguin"],
+ correctIndex: 2,
+ explanation: "Hummingbirds are the only birds that can fly backward, upside down, and hover in mid-air."
+ }]
+ },
+ anatomy: {
+ name: "Human Anatomy",
+ description: "Learn about the amazing human body",
+ questions: [{
+ question: "What is the largest organ in the human body?",
+ options: ["Heart", "Liver", "Skin", "Brain"],
+ correctIndex: 2,
+ explanation: "The skin is the body's largest organ, covering about 20 square feet in adults."
+ }, {
+ question: "How many bones are in the adult human body?",
+ options: ["206", "186", "226", "246"],
+ correctIndex: 0,
+ explanation: "The adult human body has 206 bones. Babies are born with about 300 bones that fuse as they grow."
+ }, {
+ question: "What is the strongest muscle in the human body?",
+ options: ["Biceps", "Heart", "Jaw muscles", "Gluteus maximus"],
+ correctIndex: 2,
+ explanation: "The masseter (jaw muscle) is the strongest based on its size and the force it can exert."
+ }, {
+ question: "What percentage of the human body is water?",
+ options: ["50-60%", "60-70%", "70-80%", "80-90%"],
+ correctIndex: 1,
+ explanation: "The human body is composed of about 60-70% water, varying by age, gender, and body composition."
+ }, {
+ question: "Which part of the body produces insulin?",
+ options: ["Liver", "Kidney", "Pancreas", "Gallbladder"],
+ correctIndex: 2,
+ explanation: "The pancreas produces insulin, which regulates blood sugar levels."
+ }]
+ }
+};
+// UI Elements
+var questionPanel = new QuestionPanel();
+questionPanel.x = 2048 / 2;
+questionPanel.y = 2732 / 2;
+questionPanel.visible = false;
+var progressBar = new ProgressBar();
+progressBar.x = 124;
+progressBar.y = 100;
+progressBar.visible = false;
+var badges = [];
+// Helper functions
+function getCategoryName(category) {
+ return categoryData[category].name;
+}
+function selectCategory(category) {
+ currentScreen = "gameplay";
+ storage.currentCategory = category;
+ // Update UI visibility
+ showGameplayScreen();
+ // Load questions
+ questions = categoryData[category].questions;
+ currentQuestionIndex = 0;
+ // Show first question
+ loadQuestion(currentQuestionIndex);
+ // Update progress bar
+ progressBar.updateProgress(currentQuestionIndex, questions.length);
+ LK.playMusic('gameMusic');
+}
+function showCategoriesScreen() {
+ currentScreen = "categories";
+ // Hide gameplay elements
+ questionPanel.visible = false;
+ progressBar.visible = false;
+ // Show category buttons
+ for (var i = 0; i < categoryButtons.length; i++) {
+ categoryButtons[i].visible = true;
+ categoryButtons[i].updateProgress(storage.progress[categoryButtons[i].category]);
+ }
+ // Show badges
+ for (var i = 0; i < badges.length; i++) {
+ badges[i].visible = true;
+ if (storage.badges[badges[i].category]) {
+ badges[i].unlock();
+ } else {
+ badges[i].setLocked();
+ }
+ }
+}
+function showGameplayScreen() {
+ // Hide category buttons
+ for (var i = 0; i < categoryButtons.length; i++) {
+ categoryButtons[i].visible = false;
+ }
+ // Hide badges
+ for (var i = 0; i < badges.length; i++) {
+ badges[i].visible = false;
+ }
+ // Show gameplay elements
+ questionPanel.visible = true;
+ progressBar.visible = true;
+}
+function loadQuestion(index) {
+ if (index < questions.length) {
+ questionPanel.setQuestion(questions[index]);
+ } else {
+ completeCategoryProgress();
+ }
+}
+function loadNextQuestion() {
+ currentQuestionIndex++;
+ progressBar.updateProgress(currentQuestionIndex, questions.length);
+ loadQuestion(currentQuestionIndex);
+}
+function checkAnswer(selectedOption) {
+ var isCorrect = selectedOption.isCorrect;
+ if (isCorrect) {
+ LK.getSound('correct').play();
+ LK.setScore(LK.getScore() + 10);
+ } else {
+ LK.getSound('incorrect').play();
+ }
+ questionPanel.showFeedback(isCorrect, questions[currentQuestionIndex].explanation);
+ // Update progress
+ if (isCorrect) {
+ var categoryProgress = storage.progress[storage.currentCategory];
+ var newProgress = (currentQuestionIndex + 1) / questions.length;
+ if (newProgress > categoryProgress) {
+ storage.progress[storage.currentCategory] = newProgress;
+ }
+ }
+}
+function completeCategoryProgress() {
+ // Award badge if completed all questions
+ if (storage.progress[storage.currentCategory] >= 1) {
+ storage.badges[storage.currentCategory] = true;
+ // Increase level if all badges are collected
+ if (storage.badges.space && storage.badges.wildlife && storage.badges.anatomy) {
+ storage.currentLevel++;
+ if (storage.currentLevel > storage.highestLevel) {
+ storage.highestLevel = storage.currentLevel;
+ }
+ }
+ LK.getSound('levelComplete').play();
+ }
+ showCategoriesScreen();
+}
+// Initialize game
+function initializeGame() {
+ // Create category selection screen
+ var spaceButton = new CategoryButton('space', "SPACE", "Explore planets, stars, and the universe");
+ spaceButton.x = 2048 / 2 - 550;
+ spaceButton.y = 2732 / 2;
+ game.addChild(spaceButton);
+ categoryButtons.push(spaceButton);
+ var wildlifeButton = new CategoryButton('wildlife', "WILDLIFE", "Discover amazing animals and their habitats");
+ wildlifeButton.x = 2048 / 2;
+ wildlifeButton.y = 2732 / 2;
+ game.addChild(wildlifeButton);
+ categoryButtons.push(wildlifeButton);
+ var anatomyButton = new CategoryButton('anatomy', "ANATOMY", "Learn about the amazing human body");
+ anatomyButton.x = 2048 / 2 + 550;
+ anatomyButton.y = 2732 / 2;
+ game.addChild(anatomyButton);
+ categoryButtons.push(anatomyButton);
+ // Create title
+ var titleText = new Text2("SCIENCE EXPLORER", {
+ size: 100,
+ fill: 0xFFFFFF
+ });
+ titleText.anchor.set(0.5, 0.5);
+ titleText.x = 2048 / 2;
+ titleText.y = 400;
+ game.addChild(titleText);
+ var subtitleText = new Text2("Choose a topic to explore", {
+ size: 50,
+ fill: 0xFFFFFF
+ });
+ subtitleText.anchor.set(0.5, 0.5);
+ subtitleText.x = 2048 / 2;
+ subtitleText.y = 500;
+ game.addChild(subtitleText);
+ // Create badges
+ var spaceBadge = new Badge('space');
+ spaceBadge.x = 2048 / 2 - 350;
+ spaceBadge.y = 1800;
+ game.addChild(spaceBadge);
+ badges.push(spaceBadge);
+ var wildlifeBadge = new Badge('wildlife');
+ wildlifeBadge.x = 2048 / 2;
+ wildlifeBadge.y = 1800;
+ game.addChild(wildlifeBadge);
+ badges.push(wildlifeBadge);
+ var anatomyBadge = new Badge('anatomy');
+ anatomyBadge.x = 2048 / 2 + 350;
+ anatomyBadge.y = 1800;
+ game.addChild(anatomyBadge);
+ badges.push(anatomyBadge);
+ var badgeTitle = new Text2("Badges", {
+ size: 60,
+ fill: 0xFFFFFF
+ });
+ badgeTitle.anchor.set(0.5, 0.5);
+ badgeTitle.x = 2048 / 2;
+ badgeTitle.y = 1700;
+ game.addChild(badgeTitle);
+ // Set initial badge states
+ for (var i = 0; i < badges.length; i++) {
+ if (storage.badges[badges[i].category]) {
+ badges[i].unlock();
+ } else {
+ badges[i].setLocked();
+ }
+ }
+ // Create score display
+ var scoreText = new Text2("Score: 0", {
+ size: 50,
+ fill: 0xFFFFFF
+ });
+ scoreText.anchor.set(1, 0);
+ LK.gui.topRight.addChild(scoreText);
+ // Add gameplay elements
+ game.addChild(questionPanel);
+ game.addChild(progressBar);
+ // Update category buttons with saved progress
+ for (var i = 0; i < categoryButtons.length; i++) {
+ categoryButtons[i].updateProgress(storage.progress[categoryButtons[i].category]);
+ }
+ // Update UI based on initial screen
+ if (currentScreen === "categories") {
+ showCategoriesScreen();
+ } else {
+ showGameplayScreen();
+ }
+ // Update score display
+ LK.setScore(0);
+}
+initializeGame();
+// Game update loop
+game.update = function () {
+ // Update score display
+ var scoreDisplay = LK.gui.topRight.children[0];
+ if (scoreDisplay) {
+ scoreDisplay.setText("Score: " + LK.getScore());
+ }
+};
+LK.playMusic('gameMusic');
\ No newline at end of file