/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Boss = Container.expand(function () {
var self = Container.call(this);
var bossGraphics = self.attachAsset('boss', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 20;
self.maxHealth = 20;
self.speed = 2;
self.fireTimer = 0;
self.moveDirection = 1;
self.scoreValue = 500;
self.update = function () {
self.x += self.moveDirection * self.speed;
if (self.x <= 150 || self.x >= 1898) {
self.moveDirection *= -1;
}
self.fireTimer--;
if (self.fireTimer <= 0) {
self.fire();
self.fireTimer = 60;
}
var healthPercent = self.health / self.maxHealth;
if (healthPercent < 0.3) {
bossGraphics.tint = 0xff0000;
} else if (healthPercent < 0.7) {
bossGraphics.tint = 0xff8800;
}
};
self.fire = function () {
for (var i = -2; i <= 2; i++) {
var bullet = new EnemyBullet();
bullet.x = self.x + i * 30;
bullet.y = self.y + 75;
enemyBullets.push(bullet);
game.addChild(bullet);
}
LK.getSound('shoot').play();
};
self.takeDamage = function () {
self.health--;
if (self.health <= 0) {
self.destroy();
return true;
}
LK.effects.flashObject(self, 0xffffff, 200);
return false;
};
return self;
});
var Enemy = Container.expand(function (type) {
var self = Container.call(this);
var assetName = type === 2 ? 'enemy2' : 'enemy1';
var enemyGraphics = self.attachAsset(assetName, {
anchorX: 0.5,
anchorY: 0.5
});
self.type = type || 1;
self.speed = self.type === 2 ? 5 : 4;
self.health = 5;
self.scoreValue = self.type === 2 ? 20 : 10;
self.fireTimer = Math.random() * 60 + 30;
self.moveDirection = Math.random() * Math.PI * 2;
self.moveTimer = 0;
self.update = function () {
self.y += self.speed;
self.moveTimer++;
if (self.moveTimer > 60) {
self.moveDirection = Math.random() * Math.PI * 2;
self.moveTimer = 0;
}
self.x += Math.cos(self.moveDirection) * 1;
if (self.x < 50) self.x = 50;
if (self.x > 1998) self.x = 1998;
self.fireTimer--;
if (self.fireTimer <= 0) {
self.fire();
self.fireTimer = Math.random() * 180 + 120;
}
};
self.fire = function () {
var bullet = new EnemyBullet();
bullet.x = self.x;
bullet.y = self.y + 30;
// Calculate direction to player
var dx = player.x - self.x;
var dy = player.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
bullet.directionX = dx / distance;
bullet.directionY = dy / distance;
enemyBullets.push(bullet);
game.addChild(bullet);
LK.getSound('shoot').play();
};
self.takeDamage = function () {
self.health--;
if (self.health <= 0) {
self.destroy();
return true;
}
LK.effects.flashObject(self, 0xffffff, 200);
return false;
};
return self;
});
var EnemyBullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('enemyBullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 6;
self.directionX = 0;
self.directionY = 1;
self.update = function () {
self.x += self.directionX * self.speed;
self.y += self.directionY * self.speed;
};
return self;
});
var Player = Container.expand(function () {
var self = Container.call(this);
var playerGraphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 25;
self.fireRate = 15;
self.multiShot = false;
self.shieldActive = false;
self.fireTimer = 0;
self.isShooting = false;
self.update = function () {
if (self.fireTimer > 0) {
self.fireTimer--;
}
if (self.isShooting && self.fireTimer <= 0) {
self.fire();
self.fireTimer = self.fireRate;
}
if (self.shieldActive) {
playerGraphics.tint = 0x00ffff;
} else {
playerGraphics.tint = 0xffffff;
}
};
self.fire = function () {
if (self.multiShot) {
var bullet1 = new PlayerBullet();
bullet1.x = self.x - 20;
bullet1.y = self.y - 50;
playerBullets.push(bullet1);
game.addChild(bullet1);
var bullet2 = new PlayerBullet();
bullet2.x = self.x;
bullet2.y = self.y - 50;
playerBullets.push(bullet2);
game.addChild(bullet2);
var bullet3 = new PlayerBullet();
bullet3.x = self.x + 20;
bullet3.y = self.y - 50;
playerBullets.push(bullet3);
game.addChild(bullet3);
} else {
var bullet = new PlayerBullet();
bullet.x = self.x;
bullet.y = self.y - 50;
playerBullets.push(bullet);
game.addChild(bullet);
}
LK.getSound('shoot').play();
};
self.takeDamage = function () {
if (self.shieldActive) {
self.shieldActive = false;
return;
}
self.health--;
LK.getSound('playerHit').play();
LK.effects.flashObject(self, 0xff0000, 500);
if (self.health <= 0) {
LK.showGameOver();
}
};
return self;
});
var PlayerBullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('playerBullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = -12;
self.update = function () {
self.y += self.speed;
};
return self;
});
var PowerUp = Container.expand(function (type) {
var self = Container.call(this);
var powerUpGraphics = self.attachAsset('powerUp', {
anchorX: 0.5,
anchorY: 0.5
});
self.powerType = type || 1;
self.speed = 3;
if (self.powerType === 1) {
powerUpGraphics.tint = 0x00ff00;
} else if (self.powerType === 2) {
powerUpGraphics.tint = 0xff9900;
} else if (self.powerType === 3) {
powerUpGraphics.tint = 0x0099ff;
}
self.update = function () {
self.y += self.speed;
self.rotation += 0.1;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000033
});
/****
* Game Code
****/
var player;
var playerBullets = [];
var enemies = [];
var enemyBullets = [];
var powerUps = [];
var boss = null;
var currentLevel = 1;
var enemySpawnTimer = 0;
var powerUpSpawnTimer = 0;
var levelTransitionTimer = 0;
var isBossLevel = false;
var scoreText = new Text2('Score: 0', {
size: 60,
fill: 0xFFFFFF
});
scoreText.anchor.set(0, 0);
scoreText.x = 120;
scoreText.y = 50;
LK.gui.topLeft.addChild(scoreText);
var livesText = new Text2('Lives: 25/25', {
size: 60,
fill: 0xFFFFFF
});
livesText.anchor.set(1, 0);
livesText.x = -50;
livesText.y = 50;
LK.gui.topRight.addChild(livesText);
var levelText = new Text2('Level: 1', {
size: 60,
fill: 0xFFFFFF
});
levelText.anchor.set(0.5, 0);
levelText.x = 0;
levelText.y = 50;
LK.gui.top.addChild(levelText);
var healthBarBg = LK.getAsset('healthBarBg', {
anchorX: 0.5,
anchorY: 0
});
healthBarBg.x = 0;
healthBarBg.y = 120;
LK.gui.top.addChild(healthBarBg);
var healthBarFill = LK.getAsset('healthBarFill', {
anchorX: 0,
anchorY: 0
});
healthBarFill.x = -148;
healthBarFill.y = 122;
LK.gui.top.addChild(healthBarFill);
player = game.addChild(new Player());
player.x = 1024;
player.y = 2400;
LK.playMusic('gameMusic');
function spawnEnemy() {
var enemyType = Math.random() < 0.7 ? 1 : 2;
var enemy = new Enemy(enemyType);
enemy.x = Math.random() * 1800 + 124;
enemy.y = -50;
enemies.push(enemy);
game.addChild(enemy);
}
function spawnPowerUp() {
var powerType = Math.floor(Math.random() * 3) + 1;
var powerUp = new PowerUp(powerType);
powerUp.x = Math.random() * 1800 + 124;
powerUp.y = -50;
powerUps.push(powerUp);
game.addChild(powerUp);
}
function spawnBoss() {
boss = new Boss();
boss.x = 1024;
boss.y = 200;
game.addChild(boss);
isBossLevel = true;
}
function handleMove(x, y, obj) {
if (player && !player.destroyed) {
player.x = x;
player.y = y;
player.isShooting = true;
}
}
game.move = handleMove;
game.down = function (x, y, obj) {
if (player && !player.destroyed) {
player.x = x;
player.y = y;
player.isShooting = true;
}
};
game.up = function (x, y, obj) {
if (player && !player.destroyed) {
player.isShooting = false;
}
};
game.update = function () {
scoreText.setText('Score: ' + LK.getScore());
livesText.setText('Lives: ' + player.health + '/25');
levelText.setText('Level: ' + currentLevel);
// Update health bar
var healthPercent = Math.max(0, player.health / 25);
healthBarFill.width = 296 * healthPercent;
if (healthPercent > 0.6) {
healthBarFill.tint = 0x00ff00;
} else if (healthPercent > 0.3) {
healthBarFill.tint = 0xffff00;
} else {
healthBarFill.tint = 0xff0000;
}
// Player bullets
for (var i = playerBullets.length - 1; i >= 0; i--) {
var bullet = playerBullets[i];
if (bullet.y < -50) {
bullet.destroy();
playerBullets.splice(i, 1);
continue;
}
// Check collision with enemies
for (var j = enemies.length - 1; j >= 0; j--) {
var enemy = enemies[j];
if (bullet.intersects(enemy)) {
if (enemy.takeDamage()) {
LK.setScore(LK.getScore() + enemy.scoreValue);
enemies.splice(j, 1);
LK.getSound('enemyHit').play();
}
bullet.destroy();
playerBullets.splice(i, 1);
break;
}
}
// Check collision with boss
if (boss && bullet.intersects(boss)) {
if (boss.takeDamage()) {
LK.setScore(LK.getScore() + boss.scoreValue);
boss = null;
isBossLevel = false;
currentLevel++;
levelTransitionTimer = 180;
LK.getSound('enemyHit').play();
}
bullet.destroy();
playerBullets.splice(i, 1);
}
}
// Enemy bullets
for (var i = enemyBullets.length - 1; i >= 0; i--) {
var bullet = enemyBullets[i];
if (bullet.y > 2782) {
bullet.destroy();
enemyBullets.splice(i, 1);
continue;
}
if (bullet.intersects(player)) {
player.takeDamage();
bullet.destroy();
enemyBullets.splice(i, 1);
}
}
// Enemies
for (var i = enemies.length - 1; i >= 0; i--) {
var enemy = enemies[i];
if (enemy.y > 2782) {
enemy.destroy();
enemies.splice(i, 1);
continue;
}
if (enemy.intersects(player)) {
player.takeDamage();
enemy.destroy();
enemies.splice(i, 1);
}
}
// Power-ups
for (var i = powerUps.length - 1; i >= 0; i--) {
var powerUp = powerUps[i];
if (powerUp.y > 2782) {
powerUp.destroy();
powerUps.splice(i, 1);
continue;
}
if (powerUp.intersects(player)) {
if (powerUp.powerType === 1) {
player.fireRate = Math.max(5, player.fireRate - 3);
} else if (powerUp.powerType === 2) {
player.multiShot = true;
LK.setTimeout(function () {
player.multiShot = false;
}, 10000);
} else if (powerUp.powerType === 3) {
player.shieldActive = true;
LK.setTimeout(function () {
player.shieldActive = false;
}, 8000);
}
LK.getSound('powerUpCollect').play();
powerUp.destroy();
powerUps.splice(i, 1);
}
}
// Level progression
if (levelTransitionTimer > 0) {
levelTransitionTimer--;
return;
}
// Boss level every 5 levels
if (currentLevel % 5 === 0 && !isBossLevel && !boss) {
spawnBoss();
return;
}
if (!isBossLevel) {
// Spawn enemies
enemySpawnTimer++;
var spawnRate = Math.max(30, 120 - currentLevel * 5);
if (enemySpawnTimer >= spawnRate) {
spawnEnemy();
enemySpawnTimer = 0;
}
// Spawn power-ups
powerUpSpawnTimer++;
if (powerUpSpawnTimer >= 600) {
spawnPowerUp();
powerUpSpawnTimer = 0;
}
// Level up condition
if (LK.getScore() >= currentLevel * 100) {
currentLevel++;
}
}
}; /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Boss = Container.expand(function () {
var self = Container.call(this);
var bossGraphics = self.attachAsset('boss', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 20;
self.maxHealth = 20;
self.speed = 2;
self.fireTimer = 0;
self.moveDirection = 1;
self.scoreValue = 500;
self.update = function () {
self.x += self.moveDirection * self.speed;
if (self.x <= 150 || self.x >= 1898) {
self.moveDirection *= -1;
}
self.fireTimer--;
if (self.fireTimer <= 0) {
self.fire();
self.fireTimer = 60;
}
var healthPercent = self.health / self.maxHealth;
if (healthPercent < 0.3) {
bossGraphics.tint = 0xff0000;
} else if (healthPercent < 0.7) {
bossGraphics.tint = 0xff8800;
}
};
self.fire = function () {
for (var i = -2; i <= 2; i++) {
var bullet = new EnemyBullet();
bullet.x = self.x + i * 30;
bullet.y = self.y + 75;
enemyBullets.push(bullet);
game.addChild(bullet);
}
LK.getSound('shoot').play();
};
self.takeDamage = function () {
self.health--;
if (self.health <= 0) {
self.destroy();
return true;
}
LK.effects.flashObject(self, 0xffffff, 200);
return false;
};
return self;
});
var Enemy = Container.expand(function (type) {
var self = Container.call(this);
var assetName = type === 2 ? 'enemy2' : 'enemy1';
var enemyGraphics = self.attachAsset(assetName, {
anchorX: 0.5,
anchorY: 0.5
});
self.type = type || 1;
self.speed = self.type === 2 ? 5 : 4;
self.health = 5;
self.scoreValue = self.type === 2 ? 20 : 10;
self.fireTimer = Math.random() * 60 + 30;
self.moveDirection = Math.random() * Math.PI * 2;
self.moveTimer = 0;
self.update = function () {
self.y += self.speed;
self.moveTimer++;
if (self.moveTimer > 60) {
self.moveDirection = Math.random() * Math.PI * 2;
self.moveTimer = 0;
}
self.x += Math.cos(self.moveDirection) * 1;
if (self.x < 50) self.x = 50;
if (self.x > 1998) self.x = 1998;
self.fireTimer--;
if (self.fireTimer <= 0) {
self.fire();
self.fireTimer = Math.random() * 180 + 120;
}
};
self.fire = function () {
var bullet = new EnemyBullet();
bullet.x = self.x;
bullet.y = self.y + 30;
// Calculate direction to player
var dx = player.x - self.x;
var dy = player.y - self.y;
var distance = Math.sqrt(dx * dx + dy * dy);
bullet.directionX = dx / distance;
bullet.directionY = dy / distance;
enemyBullets.push(bullet);
game.addChild(bullet);
LK.getSound('shoot').play();
};
self.takeDamage = function () {
self.health--;
if (self.health <= 0) {
self.destroy();
return true;
}
LK.effects.flashObject(self, 0xffffff, 200);
return false;
};
return self;
});
var EnemyBullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('enemyBullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 6;
self.directionX = 0;
self.directionY = 1;
self.update = function () {
self.x += self.directionX * self.speed;
self.y += self.directionY * self.speed;
};
return self;
});
var Player = Container.expand(function () {
var self = Container.call(this);
var playerGraphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 25;
self.fireRate = 15;
self.multiShot = false;
self.shieldActive = false;
self.fireTimer = 0;
self.isShooting = false;
self.update = function () {
if (self.fireTimer > 0) {
self.fireTimer--;
}
if (self.isShooting && self.fireTimer <= 0) {
self.fire();
self.fireTimer = self.fireRate;
}
if (self.shieldActive) {
playerGraphics.tint = 0x00ffff;
} else {
playerGraphics.tint = 0xffffff;
}
};
self.fire = function () {
if (self.multiShot) {
var bullet1 = new PlayerBullet();
bullet1.x = self.x - 20;
bullet1.y = self.y - 50;
playerBullets.push(bullet1);
game.addChild(bullet1);
var bullet2 = new PlayerBullet();
bullet2.x = self.x;
bullet2.y = self.y - 50;
playerBullets.push(bullet2);
game.addChild(bullet2);
var bullet3 = new PlayerBullet();
bullet3.x = self.x + 20;
bullet3.y = self.y - 50;
playerBullets.push(bullet3);
game.addChild(bullet3);
} else {
var bullet = new PlayerBullet();
bullet.x = self.x;
bullet.y = self.y - 50;
playerBullets.push(bullet);
game.addChild(bullet);
}
LK.getSound('shoot').play();
};
self.takeDamage = function () {
if (self.shieldActive) {
self.shieldActive = false;
return;
}
self.health--;
LK.getSound('playerHit').play();
LK.effects.flashObject(self, 0xff0000, 500);
if (self.health <= 0) {
LK.showGameOver();
}
};
return self;
});
var PlayerBullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('playerBullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = -12;
self.update = function () {
self.y += self.speed;
};
return self;
});
var PowerUp = Container.expand(function (type) {
var self = Container.call(this);
var powerUpGraphics = self.attachAsset('powerUp', {
anchorX: 0.5,
anchorY: 0.5
});
self.powerType = type || 1;
self.speed = 3;
if (self.powerType === 1) {
powerUpGraphics.tint = 0x00ff00;
} else if (self.powerType === 2) {
powerUpGraphics.tint = 0xff9900;
} else if (self.powerType === 3) {
powerUpGraphics.tint = 0x0099ff;
}
self.update = function () {
self.y += self.speed;
self.rotation += 0.1;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000033
});
/****
* Game Code
****/
var player;
var playerBullets = [];
var enemies = [];
var enemyBullets = [];
var powerUps = [];
var boss = null;
var currentLevel = 1;
var enemySpawnTimer = 0;
var powerUpSpawnTimer = 0;
var levelTransitionTimer = 0;
var isBossLevel = false;
var scoreText = new Text2('Score: 0', {
size: 60,
fill: 0xFFFFFF
});
scoreText.anchor.set(0, 0);
scoreText.x = 120;
scoreText.y = 50;
LK.gui.topLeft.addChild(scoreText);
var livesText = new Text2('Lives: 25/25', {
size: 60,
fill: 0xFFFFFF
});
livesText.anchor.set(1, 0);
livesText.x = -50;
livesText.y = 50;
LK.gui.topRight.addChild(livesText);
var levelText = new Text2('Level: 1', {
size: 60,
fill: 0xFFFFFF
});
levelText.anchor.set(0.5, 0);
levelText.x = 0;
levelText.y = 50;
LK.gui.top.addChild(levelText);
var healthBarBg = LK.getAsset('healthBarBg', {
anchorX: 0.5,
anchorY: 0
});
healthBarBg.x = 0;
healthBarBg.y = 120;
LK.gui.top.addChild(healthBarBg);
var healthBarFill = LK.getAsset('healthBarFill', {
anchorX: 0,
anchorY: 0
});
healthBarFill.x = -148;
healthBarFill.y = 122;
LK.gui.top.addChild(healthBarFill);
player = game.addChild(new Player());
player.x = 1024;
player.y = 2400;
LK.playMusic('gameMusic');
function spawnEnemy() {
var enemyType = Math.random() < 0.7 ? 1 : 2;
var enemy = new Enemy(enemyType);
enemy.x = Math.random() * 1800 + 124;
enemy.y = -50;
enemies.push(enemy);
game.addChild(enemy);
}
function spawnPowerUp() {
var powerType = Math.floor(Math.random() * 3) + 1;
var powerUp = new PowerUp(powerType);
powerUp.x = Math.random() * 1800 + 124;
powerUp.y = -50;
powerUps.push(powerUp);
game.addChild(powerUp);
}
function spawnBoss() {
boss = new Boss();
boss.x = 1024;
boss.y = 200;
game.addChild(boss);
isBossLevel = true;
}
function handleMove(x, y, obj) {
if (player && !player.destroyed) {
player.x = x;
player.y = y;
player.isShooting = true;
}
}
game.move = handleMove;
game.down = function (x, y, obj) {
if (player && !player.destroyed) {
player.x = x;
player.y = y;
player.isShooting = true;
}
};
game.up = function (x, y, obj) {
if (player && !player.destroyed) {
player.isShooting = false;
}
};
game.update = function () {
scoreText.setText('Score: ' + LK.getScore());
livesText.setText('Lives: ' + player.health + '/25');
levelText.setText('Level: ' + currentLevel);
// Update health bar
var healthPercent = Math.max(0, player.health / 25);
healthBarFill.width = 296 * healthPercent;
if (healthPercent > 0.6) {
healthBarFill.tint = 0x00ff00;
} else if (healthPercent > 0.3) {
healthBarFill.tint = 0xffff00;
} else {
healthBarFill.tint = 0xff0000;
}
// Player bullets
for (var i = playerBullets.length - 1; i >= 0; i--) {
var bullet = playerBullets[i];
if (bullet.y < -50) {
bullet.destroy();
playerBullets.splice(i, 1);
continue;
}
// Check collision with enemies
for (var j = enemies.length - 1; j >= 0; j--) {
var enemy = enemies[j];
if (bullet.intersects(enemy)) {
if (enemy.takeDamage()) {
LK.setScore(LK.getScore() + enemy.scoreValue);
enemies.splice(j, 1);
LK.getSound('enemyHit').play();
}
bullet.destroy();
playerBullets.splice(i, 1);
break;
}
}
// Check collision with boss
if (boss && bullet.intersects(boss)) {
if (boss.takeDamage()) {
LK.setScore(LK.getScore() + boss.scoreValue);
boss = null;
isBossLevel = false;
currentLevel++;
levelTransitionTimer = 180;
LK.getSound('enemyHit').play();
}
bullet.destroy();
playerBullets.splice(i, 1);
}
}
// Enemy bullets
for (var i = enemyBullets.length - 1; i >= 0; i--) {
var bullet = enemyBullets[i];
if (bullet.y > 2782) {
bullet.destroy();
enemyBullets.splice(i, 1);
continue;
}
if (bullet.intersects(player)) {
player.takeDamage();
bullet.destroy();
enemyBullets.splice(i, 1);
}
}
// Enemies
for (var i = enemies.length - 1; i >= 0; i--) {
var enemy = enemies[i];
if (enemy.y > 2782) {
enemy.destroy();
enemies.splice(i, 1);
continue;
}
if (enemy.intersects(player)) {
player.takeDamage();
enemy.destroy();
enemies.splice(i, 1);
}
}
// Power-ups
for (var i = powerUps.length - 1; i >= 0; i--) {
var powerUp = powerUps[i];
if (powerUp.y > 2782) {
powerUp.destroy();
powerUps.splice(i, 1);
continue;
}
if (powerUp.intersects(player)) {
if (powerUp.powerType === 1) {
player.fireRate = Math.max(5, player.fireRate - 3);
} else if (powerUp.powerType === 2) {
player.multiShot = true;
LK.setTimeout(function () {
player.multiShot = false;
}, 10000);
} else if (powerUp.powerType === 3) {
player.shieldActive = true;
LK.setTimeout(function () {
player.shieldActive = false;
}, 8000);
}
LK.getSound('powerUpCollect').play();
powerUp.destroy();
powerUps.splice(i, 1);
}
}
// Level progression
if (levelTransitionTimer > 0) {
levelTransitionTimer--;
return;
}
// Boss level every 5 levels
if (currentLevel % 5 === 0 && !isBossLevel && !boss) {
spawnBoss();
return;
}
if (!isBossLevel) {
// Spawn enemies
enemySpawnTimer++;
var spawnRate = Math.max(30, 120 - currentLevel * 5);
if (enemySpawnTimer >= spawnRate) {
spawnEnemy();
enemySpawnTimer = 0;
}
// Spawn power-ups
powerUpSpawnTimer++;
if (powerUpSpawnTimer >= 600) {
spawnPowerUp();
powerUpSpawnTimer = 0;
}
// Level up condition
if (LK.getScore() >= currentLevel * 100) {
currentLevel++;
}
}
};