/****
* 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