/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var AnswerButton = Container.expand(function () { var self = Container.call(this); var graphics = self.attachAsset('answerButton', { anchorX: 0.5, anchorY: 0.5 }); self.answerText = new Text2('0', { size: 40, fill: 0xFFFFFF }); self.answerText.anchor.set(0.5, 0.5); self.addChild(self.answerText); self.answer = 0; self.isCorrect = false; self.setAnswer = function (value, correct) { self.answer = value; self.isCorrect = correct; self.answerText.setText(value.toString()); }; self.down = function (x, y, obj) { if (currentEnemyTarget && !currentEnemyTarget.hasBeenAnswered) { currentEnemyTarget.hasBeenAnswered = true; if (self.isCorrect) { handleCorrectAnswer(); } else { handleWrongAnswer(); } } }; return self; }); var EnemyNinja = Container.expand(function () { var self = Container.call(this); var graphics = self.attachAsset('enemyNinja', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 2; self.problem = null; self.correctAnswer = 0; self.hasBeenAnswered = false; self.update = function () { self.y += self.speed; }; return self; }); var PlayerNinja = Container.expand(function () { var self = Container.call(this); var graphics = self.attachAsset('playerNinja', { anchorX: 0.5, anchorY: 0.5 }); self.health = 100; self.maxHealth = 100; return self; }); var PowerUp = Container.expand(function () { var self = Container.call(this); var graphics = self.attachAsset('powerUp', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 1; self.collected = false; self.update = function () { self.y += self.speed; self.rotation += 0.05; if (self.intersects(player)) { if (!self.collected) { self.collected = true; player.health = Math.min(player.health + 20, player.maxHealth); updateHealthBar(); LK.getSound('powerUpCollect').play(); LK.effects.flashObject(player, 0xFFEB3B, 500); self.destroy(); powerUps.splice(powerUps.indexOf(self), 1); } } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x1A1A2E }); /**** * Game Code ****/ var player = game.addChild(new PlayerNinja()); player.x = 2048 / 2; player.y = 2732 - 200; var enemies = []; var answerButtons = []; var powerUps = []; var currentEnemyTarget = null; var consecutiveCorrect = 0; var gameLevel = 1; var spawnTimer = 0; var problemTypes = ['+', '-', '×', '÷']; // UI Elements var scoreText = new Text2('Score: 0', { size: 60, fill: 0xFFFFFF }); scoreText.anchor.set(0, 0); LK.gui.topLeft.addChild(scoreText); scoreText.x = 120; scoreText.y = 20; var healthBarBg = LK.getAsset('healthBar', { anchorX: 0, anchorY: 0, scaleX: 1, scaleY: 1 }); healthBarBg.tint = 0x333333; LK.gui.top.addChild(healthBarBg); healthBarBg.x = -150; healthBarBg.y = 20; var healthBarFg = LK.getAsset('healthBar', { anchorX: 0, anchorY: 0, scaleX: 1, scaleY: 1 }); LK.gui.top.addChild(healthBarFg); healthBarFg.x = -150; healthBarFg.y = 20; var levelText = new Text2('Level: 1', { size: 50, fill: 0xFFFFFF }); levelText.anchor.set(1, 0); LK.gui.topRight.addChild(levelText); levelText.x = -20; levelText.y = 20; // Initialize answer buttons for (var i = 0; i < 4; i++) { var button = game.addChild(new AnswerButton()); button.x = 400 + i * 200; button.y = 2732 - 120; answerButtons.push(button); } function generateMathProblem() { var operation = problemTypes[Math.floor(Math.random() * Math.min(problemTypes.length, Math.ceil(gameLevel / 2)))]; var num1, num2, answer; var range = Math.min(5 + gameLevel * 2, 20); switch (operation) { case '+': num1 = Math.floor(Math.random() * range) + 1; num2 = Math.floor(Math.random() * range) + 1; answer = num1 + num2; break; case '-': num1 = Math.floor(Math.random() * range) + range; num2 = Math.floor(Math.random() * range) + 1; answer = num1 - num2; break; case '×': num1 = Math.floor(Math.random() * Math.min(range / 2, 10)) + 1; num2 = Math.floor(Math.random() * Math.min(range / 2, 10)) + 1; answer = num1 * num2; break; case '÷': answer = Math.floor(Math.random() * Math.min(range / 2, 10)) + 1; num2 = Math.floor(Math.random() * Math.min(range / 2, 8)) + 1; num1 = answer * num2; break; } return { text: num1 + ' ' + operation + ' ' + num2, answer: answer }; } function createEnemyWithProblem() { var enemy = game.addChild(new EnemyNinja()); enemy.x = Math.random() * (2048 - 200) + 100; enemy.y = -50; var problem = generateMathProblem(); enemy.problem = problem; enemy.correctAnswer = problem.answer; var problemText = new Text2(problem.text, { size: 36, fill: 0xFFFFFF }); problemText.anchor.set(0.5, 0.5); problemText.y = -60; enemy.addChild(problemText); enemies.push(enemy); currentEnemyTarget = enemy; // Generate answer options var correctAnswer = problem.answer; var answers = [correctAnswer]; // Generate wrong answers while (answers.length < 4) { var wrongAnswer; if (Math.random() < 0.5) { wrongAnswer = correctAnswer + Math.floor(Math.random() * 10) - 5; } else { wrongAnswer = Math.floor(Math.random() * (correctAnswer + 20)) + 1; } if (wrongAnswer !== correctAnswer && answers.indexOf(wrongAnswer) === -1 && wrongAnswer > 0) { answers.push(wrongAnswer); } } // Shuffle answers for (var i = answers.length - 1; i > 0; i--) { var j = Math.floor(Math.random() * (i + 1)); var temp = answers[i]; answers[i] = answers[j]; answers[j] = temp; } // Set button answers for (var i = 0; i < 4; i++) { answerButtons[i].setAnswer(answers[i], answers[i] === correctAnswer); } } function handleCorrectAnswer() { if (currentEnemyTarget) { LK.getSound('correctAnswer').play(); LK.setScore(LK.getScore() + 10 + gameLevel * 5); scoreText.setText('Score: ' + LK.getScore()); consecutiveCorrect++; LK.effects.flashObject(currentEnemyTarget, 0x00FF00, 300); tween(currentEnemyTarget, { alpha: 0, scaleX: 0, scaleY: 0 }, { duration: 300, onFinish: function onFinish() { if (currentEnemyTarget && enemies.indexOf(currentEnemyTarget) !== -1) { currentEnemyTarget.destroy(); enemies.splice(enemies.indexOf(currentEnemyTarget), 1); } } }); currentEnemyTarget = null; // Spawn power-up after 3 consecutive correct answers if (consecutiveCorrect >= 3 && Math.random() < 0.7) { spawnPowerUp(); consecutiveCorrect = 0; } // Level progression if (LK.getScore() > 0 && LK.getScore() % 100 === 0) { gameLevel++; levelText.setText('Level: ' + gameLevel); LK.effects.flashScreen(0x00FF00, 500); } } } function handleWrongAnswer() { LK.getSound('wrongAnswer').play(); player.health -= 25; consecutiveCorrect = 0; updateHealthBar(); LK.effects.flashObject(player, 0xFF0000, 500); if (player.health <= 0) { LK.showGameOver(); return; } currentEnemyTarget = null; } function spawnPowerUp() { var powerUp = game.addChild(new PowerUp()); powerUp.x = Math.random() * (2048 - 100) + 50; powerUp.y = -30; powerUps.push(powerUp); } function updateHealthBar() { var healthPercent = player.health / player.maxHealth; healthBarFg.scaleX = healthPercent; if (healthPercent > 0.6) { healthBarFg.tint = 0x4CAF50; } else if (healthPercent > 0.3) { healthBarFg.tint = 0xFF9800; } else { healthBarFg.tint = 0xF44336; } } game.update = function () { spawnTimer++; // Spawn new enemies if (enemies.length === 0 || spawnTimer > 180 && Math.random() < 0.02) { if (enemies.length === 0 || !currentEnemyTarget || currentEnemyTarget.hasBeenAnswered) { createEnemyWithProblem(); spawnTimer = 0; } } // Update enemies for (var i = enemies.length - 1; i >= 0; i--) { var enemy = enemies[i]; // Check if enemy reached player if (enemy.y > player.y - 100) { if (!enemy.hasBeenAnswered) { player.health -= 20; updateHealthBar(); LK.effects.flashObject(player, 0xFF0000, 400); if (player.health <= 0) { LK.showGameOver(); return; } } enemy.destroy(); enemies.splice(i, 1); if (enemy === currentEnemyTarget) { currentEnemyTarget = null; } continue; } // Remove enemies that are off screen if (enemy.y > 2732 + 100) { enemy.destroy(); enemies.splice(i, 1); if (enemy === currentEnemyTarget) { currentEnemyTarget = null; } } } // Update power-ups for (var i = powerUps.length - 1; i >= 0; i--) { var powerUp = powerUps[i]; if (powerUp.y > 2732 + 100 || powerUp.collected) { if (!powerUp.collected) { powerUp.destroy(); } powerUps.splice(i, 1); } } // Increase enemy speed over time for (var i = 0; i < enemies.length; i++) { enemies[i].speed = 2 + gameLevel * 0.3; } }; // Initialize health bar updateHealthBar(); // Create first enemy LK.setTimeout(function () { createEnemyWithProblem(); }, 1000);
===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,351 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+
+/****
+* Classes
+****/
+var AnswerButton = Container.expand(function () {
+ var self = Container.call(this);
+ var graphics = self.attachAsset('answerButton', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.answerText = new Text2('0', {
+ size: 40,
+ fill: 0xFFFFFF
+ });
+ self.answerText.anchor.set(0.5, 0.5);
+ self.addChild(self.answerText);
+ self.answer = 0;
+ self.isCorrect = false;
+ self.setAnswer = function (value, correct) {
+ self.answer = value;
+ self.isCorrect = correct;
+ self.answerText.setText(value.toString());
+ };
+ self.down = function (x, y, obj) {
+ if (currentEnemyTarget && !currentEnemyTarget.hasBeenAnswered) {
+ currentEnemyTarget.hasBeenAnswered = true;
+ if (self.isCorrect) {
+ handleCorrectAnswer();
+ } else {
+ handleWrongAnswer();
+ }
+ }
+ };
+ return self;
+});
+var EnemyNinja = Container.expand(function () {
+ var self = Container.call(this);
+ var graphics = self.attachAsset('enemyNinja', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 2;
+ self.problem = null;
+ self.correctAnswer = 0;
+ self.hasBeenAnswered = false;
+ self.update = function () {
+ self.y += self.speed;
+ };
+ return self;
+});
+var PlayerNinja = Container.expand(function () {
+ var self = Container.call(this);
+ var graphics = self.attachAsset('playerNinja', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.health = 100;
+ self.maxHealth = 100;
+ return self;
+});
+var PowerUp = Container.expand(function () {
+ var self = Container.call(this);
+ var graphics = self.attachAsset('powerUp', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 1;
+ self.collected = false;
+ self.update = function () {
+ self.y += self.speed;
+ self.rotation += 0.05;
+ if (self.intersects(player)) {
+ if (!self.collected) {
+ self.collected = true;
+ player.health = Math.min(player.health + 20, player.maxHealth);
+ updateHealthBar();
+ LK.getSound('powerUpCollect').play();
+ LK.effects.flashObject(player, 0xFFEB3B, 500);
+ self.destroy();
+ powerUps.splice(powerUps.indexOf(self), 1);
+ }
+ }
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x1A1A2E
+});
+
+/****
+* Game Code
+****/
+var player = game.addChild(new PlayerNinja());
+player.x = 2048 / 2;
+player.y = 2732 - 200;
+var enemies = [];
+var answerButtons = [];
+var powerUps = [];
+var currentEnemyTarget = null;
+var consecutiveCorrect = 0;
+var gameLevel = 1;
+var spawnTimer = 0;
+var problemTypes = ['+', '-', '×', '÷'];
+// UI Elements
+var scoreText = new Text2('Score: 0', {
+ size: 60,
+ fill: 0xFFFFFF
+});
+scoreText.anchor.set(0, 0);
+LK.gui.topLeft.addChild(scoreText);
+scoreText.x = 120;
+scoreText.y = 20;
+var healthBarBg = LK.getAsset('healthBar', {
+ anchorX: 0,
+ anchorY: 0,
+ scaleX: 1,
+ scaleY: 1
+});
+healthBarBg.tint = 0x333333;
+LK.gui.top.addChild(healthBarBg);
+healthBarBg.x = -150;
+healthBarBg.y = 20;
+var healthBarFg = LK.getAsset('healthBar', {
+ anchorX: 0,
+ anchorY: 0,
+ scaleX: 1,
+ scaleY: 1
+});
+LK.gui.top.addChild(healthBarFg);
+healthBarFg.x = -150;
+healthBarFg.y = 20;
+var levelText = new Text2('Level: 1', {
+ size: 50,
+ fill: 0xFFFFFF
+});
+levelText.anchor.set(1, 0);
+LK.gui.topRight.addChild(levelText);
+levelText.x = -20;
+levelText.y = 20;
+// Initialize answer buttons
+for (var i = 0; i < 4; i++) {
+ var button = game.addChild(new AnswerButton());
+ button.x = 400 + i * 200;
+ button.y = 2732 - 120;
+ answerButtons.push(button);
+}
+function generateMathProblem() {
+ var operation = problemTypes[Math.floor(Math.random() * Math.min(problemTypes.length, Math.ceil(gameLevel / 2)))];
+ var num1, num2, answer;
+ var range = Math.min(5 + gameLevel * 2, 20);
+ switch (operation) {
+ case '+':
+ num1 = Math.floor(Math.random() * range) + 1;
+ num2 = Math.floor(Math.random() * range) + 1;
+ answer = num1 + num2;
+ break;
+ case '-':
+ num1 = Math.floor(Math.random() * range) + range;
+ num2 = Math.floor(Math.random() * range) + 1;
+ answer = num1 - num2;
+ break;
+ case '×':
+ num1 = Math.floor(Math.random() * Math.min(range / 2, 10)) + 1;
+ num2 = Math.floor(Math.random() * Math.min(range / 2, 10)) + 1;
+ answer = num1 * num2;
+ break;
+ case '÷':
+ answer = Math.floor(Math.random() * Math.min(range / 2, 10)) + 1;
+ num2 = Math.floor(Math.random() * Math.min(range / 2, 8)) + 1;
+ num1 = answer * num2;
+ break;
+ }
+ return {
+ text: num1 + ' ' + operation + ' ' + num2,
+ answer: answer
+ };
+}
+function createEnemyWithProblem() {
+ var enemy = game.addChild(new EnemyNinja());
+ enemy.x = Math.random() * (2048 - 200) + 100;
+ enemy.y = -50;
+ var problem = generateMathProblem();
+ enemy.problem = problem;
+ enemy.correctAnswer = problem.answer;
+ var problemText = new Text2(problem.text, {
+ size: 36,
+ fill: 0xFFFFFF
+ });
+ problemText.anchor.set(0.5, 0.5);
+ problemText.y = -60;
+ enemy.addChild(problemText);
+ enemies.push(enemy);
+ currentEnemyTarget = enemy;
+ // Generate answer options
+ var correctAnswer = problem.answer;
+ var answers = [correctAnswer];
+ // Generate wrong answers
+ while (answers.length < 4) {
+ var wrongAnswer;
+ if (Math.random() < 0.5) {
+ wrongAnswer = correctAnswer + Math.floor(Math.random() * 10) - 5;
+ } else {
+ wrongAnswer = Math.floor(Math.random() * (correctAnswer + 20)) + 1;
+ }
+ if (wrongAnswer !== correctAnswer && answers.indexOf(wrongAnswer) === -1 && wrongAnswer > 0) {
+ answers.push(wrongAnswer);
+ }
+ }
+ // Shuffle answers
+ for (var i = answers.length - 1; i > 0; i--) {
+ var j = Math.floor(Math.random() * (i + 1));
+ var temp = answers[i];
+ answers[i] = answers[j];
+ answers[j] = temp;
+ }
+ // Set button answers
+ for (var i = 0; i < 4; i++) {
+ answerButtons[i].setAnswer(answers[i], answers[i] === correctAnswer);
+ }
+}
+function handleCorrectAnswer() {
+ if (currentEnemyTarget) {
+ LK.getSound('correctAnswer').play();
+ LK.setScore(LK.getScore() + 10 + gameLevel * 5);
+ scoreText.setText('Score: ' + LK.getScore());
+ consecutiveCorrect++;
+ LK.effects.flashObject(currentEnemyTarget, 0x00FF00, 300);
+ tween(currentEnemyTarget, {
+ alpha: 0,
+ scaleX: 0,
+ scaleY: 0
+ }, {
+ duration: 300,
+ onFinish: function onFinish() {
+ if (currentEnemyTarget && enemies.indexOf(currentEnemyTarget) !== -1) {
+ currentEnemyTarget.destroy();
+ enemies.splice(enemies.indexOf(currentEnemyTarget), 1);
+ }
+ }
+ });
+ currentEnemyTarget = null;
+ // Spawn power-up after 3 consecutive correct answers
+ if (consecutiveCorrect >= 3 && Math.random() < 0.7) {
+ spawnPowerUp();
+ consecutiveCorrect = 0;
+ }
+ // Level progression
+ if (LK.getScore() > 0 && LK.getScore() % 100 === 0) {
+ gameLevel++;
+ levelText.setText('Level: ' + gameLevel);
+ LK.effects.flashScreen(0x00FF00, 500);
+ }
+ }
+}
+function handleWrongAnswer() {
+ LK.getSound('wrongAnswer').play();
+ player.health -= 25;
+ consecutiveCorrect = 0;
+ updateHealthBar();
+ LK.effects.flashObject(player, 0xFF0000, 500);
+ if (player.health <= 0) {
+ LK.showGameOver();
+ return;
+ }
+ currentEnemyTarget = null;
+}
+function spawnPowerUp() {
+ var powerUp = game.addChild(new PowerUp());
+ powerUp.x = Math.random() * (2048 - 100) + 50;
+ powerUp.y = -30;
+ powerUps.push(powerUp);
+}
+function updateHealthBar() {
+ var healthPercent = player.health / player.maxHealth;
+ healthBarFg.scaleX = healthPercent;
+ if (healthPercent > 0.6) {
+ healthBarFg.tint = 0x4CAF50;
+ } else if (healthPercent > 0.3) {
+ healthBarFg.tint = 0xFF9800;
+ } else {
+ healthBarFg.tint = 0xF44336;
+ }
+}
+game.update = function () {
+ spawnTimer++;
+ // Spawn new enemies
+ if (enemies.length === 0 || spawnTimer > 180 && Math.random() < 0.02) {
+ if (enemies.length === 0 || !currentEnemyTarget || currentEnemyTarget.hasBeenAnswered) {
+ createEnemyWithProblem();
+ spawnTimer = 0;
+ }
+ }
+ // Update enemies
+ for (var i = enemies.length - 1; i >= 0; i--) {
+ var enemy = enemies[i];
+ // Check if enemy reached player
+ if (enemy.y > player.y - 100) {
+ if (!enemy.hasBeenAnswered) {
+ player.health -= 20;
+ updateHealthBar();
+ LK.effects.flashObject(player, 0xFF0000, 400);
+ if (player.health <= 0) {
+ LK.showGameOver();
+ return;
+ }
+ }
+ enemy.destroy();
+ enemies.splice(i, 1);
+ if (enemy === currentEnemyTarget) {
+ currentEnemyTarget = null;
+ }
+ continue;
+ }
+ // Remove enemies that are off screen
+ if (enemy.y > 2732 + 100) {
+ enemy.destroy();
+ enemies.splice(i, 1);
+ if (enemy === currentEnemyTarget) {
+ currentEnemyTarget = null;
+ }
+ }
+ }
+ // Update power-ups
+ for (var i = powerUps.length - 1; i >= 0; i--) {
+ var powerUp = powerUps[i];
+ if (powerUp.y > 2732 + 100 || powerUp.collected) {
+ if (!powerUp.collected) {
+ powerUp.destroy();
+ }
+ powerUps.splice(i, 1);
+ }
+ }
+ // Increase enemy speed over time
+ for (var i = 0; i < enemies.length; i++) {
+ enemies[i].speed = 2 + gameLevel * 0.3;
+ }
+};
+// Initialize health bar
+updateHealthBar();
+// Create first enemy
+LK.setTimeout(function () {
+ createEnemyWithProblem();
+}, 1000);
\ No newline at end of file