/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1", {
highScore: 0,
level: 1
});
/****
* Classes
****/
var Asteroid = Container.expand(function () {
var self = Container.call(this);
var asteroidGraphics = self.attachAsset('asteroid', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 5 + Math.random() * 3;
self.rotationSpeed = (Math.random() - 0.5) * 0.1;
self.size = 0.6 + Math.random() * 0.8;
asteroidGraphics.scale.set(self.size, self.size);
self.update = function () {
self.y += self.speed;
self.rotation += self.rotationSpeed;
// If asteroid goes off screen, remove it
if (self.y > 2732 + 100) {
self.destroyed = true;
}
};
return self;
});
var Boss = Container.expand(function () {
var self = Container.call(this);
var bossGraphics = self.attachAsset('boss', {
anchorX: 0.5,
anchorY: 0.5
});
self.health = 10;
self.speed = 1.5;
self.state = 'entering'; // entering, attacking, exiting
self.attackTimer = 0;
self.moveDirection = 1;
self.points = 2000;
self.update = function () {
if (self.state === 'entering') {
self.y += self.speed;
if (self.y >= 300) {
self.state = 'attacking';
}
} else if (self.state === 'attacking') {
// Move side to side
self.x += self.speed * 2 * self.moveDirection;
// Reverse direction at screen edges
if (self.x < 400 || self.x > 2048 - 400) {
self.moveDirection *= -1;
}
// Attack logic
self.attackTimer++;
if (self.attackTimer >= 60) {
// Spawn enemy
if (Math.random() < 0.5) {
var enemy = new Enemy();
enemy.x = self.x + (Math.random() - 0.5) * 200;
enemy.y = self.y + 100;
game.enemies.push(enemy);
game.addChild(enemy);
}
self.attackTimer = 0;
}
} else if (self.state === 'exiting') {
self.y -= self.speed * 2;
if (self.y < -300) {
self.destroyed = true;
}
}
};
self.damage = function () {
self.health--;
LK.effects.flashObject(self, 0xffffff, 300);
if (self.health <= 0) {
self.state = 'exiting';
}
};
return self;
});
var Bullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 15;
self.update = function () {
self.y -= self.speed;
// If bullet goes off screen, remove it
if (self.y < -100) {
self.destroyed = true;
}
};
return self;
});
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 4 + Math.random() * 2;
self.horizontalSpeed = (Math.random() - 0.5) * 4;
self.points = 100;
self.update = function () {
self.y += self.speed;
self.x += self.horizontalSpeed;
// Bounce off walls
if (self.x < 100 || self.x > 2048 - 100) {
self.horizontalSpeed *= -1;
}
// If enemy goes off screen, remove it
if (self.y > 2732 + 100) {
self.destroyed = true;
}
};
return self;
});
var Player = Container.expand(function () {
var self = Container.call(this);
var playerGraphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
self.shieldActive = false;
self.shieldGraphics = null;
self.bulletTimer = 0;
self.canShoot = false;
self.invulnerable = false;
self.activateShield = function (duration) {
if (self.shieldActive) {
return;
}
self.shieldActive = true;
self.shieldGraphics = self.attachAsset('shield', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.5
});
LK.setTimeout(function () {
if (self.shieldGraphics) {
self.shieldGraphics.destroy();
self.shieldGraphics = null;
}
self.shieldActive = false;
}, duration);
};
self.activateWeapon = function (duration) {
self.canShoot = true;
LK.setTimeout(function () {
self.canShoot = false;
}, duration);
};
self.makeInvulnerable = function (duration) {
self.invulnerable = true;
// Flash effect to show invulnerability
var flashCount = 0;
var flashInterval = LK.setInterval(function () {
playerGraphics.alpha = playerGraphics.alpha === 1 ? 0.3 : 1;
flashCount++;
if (flashCount > 10) {
LK.clearInterval(flashInterval);
playerGraphics.alpha = 1;
}
}, 150);
LK.setTimeout(function () {
self.invulnerable = false;
playerGraphics.alpha = 1;
LK.clearInterval(flashInterval);
}, duration);
};
self.shoot = function () {
if (!self.canShoot) {
return;
}
if (self.bulletTimer <= 0) {
var bullet = new Bullet();
bullet.x = self.x;
bullet.y = self.y - 50;
game.bullets.push(bullet);
game.addChild(bullet);
LK.getSound('shoot').play();
self.bulletTimer = 10; // Rate of fire control
}
};
self.update = function () {
if (self.bulletTimer > 0) {
self.bulletTimer--;
}
if (self.canShoot) {
self.shoot();
}
if (self.shieldGraphics) {
self.shieldGraphics.rotation += 0.02;
}
};
return self;
});
var PowerUp = Container.expand(function () {
var self = Container.call(this);
var type = Math.floor(Math.random() * 3); // 0: shield, 1: weapon, 2: speed
var colors = [0x2ecc71, 0xf1c40f, 0x9b59b6];
var powerupGraphics = self.attachAsset('powerup', {
anchorX: 0.5,
anchorY: 0.5,
tint: colors[type]
});
self.type = type;
self.speed = 3;
self.update = function () {
self.y += self.speed;
self.rotation += 0.02;
// If powerup goes off screen, remove it
if (self.y > 2732 + 100) {
self.destroyed = true;
}
};
return self;
});
var Star = Container.expand(function () {
var self = Container.call(this);
var brightness = 0.3 + Math.random() * 0.7;
var starGraphics = self.attachAsset('star', {
anchorX: 0.5,
anchorY: 0.5,
alpha: brightness
});
self.speed = 1 + Math.random() * 3;
self.update = function () {
self.y += self.speed;
// If star goes off screen, reset to top
if (self.y > 2732 + 50) {
self.y = -50;
self.x = Math.random() * 2048;
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000033
});
/****
* Game Code
****/
// Game state variables
var player;
var score = 0;
var level = storage.level || 1;
var highScore = storage.highScore || 0;
var gameActive = true;
var dragNode = null;
var spawnTimer = 0;
var difficultyTimer = 0;
var bossSpawnLevel = 5;
var currentBoss = null;
var spawnRate = 100;
var scoreDisplay;
var levelDisplay;
var stars = [];
// Collection arrays
game.asteroids = [];
game.enemies = [];
game.powerups = [];
game.bullets = [];
// Initialize player
function initPlayer() {
player = new Player();
player.x = 2048 / 2;
player.y = 2732 - 250;
game.addChild(player);
// Start with brief invulnerability
player.makeInvulnerable(2000);
}
// Initialize stars background
function initStars() {
for (var i = 0; i < 50; i++) {
var star = new Star();
star.x = Math.random() * 2048;
star.y = Math.random() * 2732;
stars.push(star);
game.addChild(star);
}
}
// Initialize UI
function initUI() {
// Score display
scoreDisplay = new Text2('Score: 0', {
size: 80,
fill: 0xFFFFFF
});
scoreDisplay.anchor.set(0, 0);
LK.gui.topRight.addChild(scoreDisplay);
// Level display
levelDisplay = new Text2('Level: ' + level, {
size: 80,
fill: 0xFFFFFF
});
levelDisplay.anchor.set(0, 0);
LK.gui.topRight.addChild(levelDisplay);
levelDisplay.y = 100;
// High score display
var highScoreDisplay = new Text2('High Score: ' + highScore, {
size: 60,
fill: 0xFFFF00
});
highScoreDisplay.anchor.set(0, 0);
LK.gui.topRight.addChild(highScoreDisplay);
highScoreDisplay.y = 200;
}
// Update score
function updateScore(points) {
score += points;
scoreDisplay.setText('Score: ' + score);
// Check for high score
if (score > highScore) {
highScore = score;
storage.highScore = highScore;
}
LK.setScore(score);
}
// Spawn asteroid
function spawnAsteroid() {
var asteroid = new Asteroid();
asteroid.x = Math.random() * 2048;
asteroid.y = -100;
game.asteroids.push(asteroid);
game.addChild(asteroid);
}
// Spawn enemy
function spawnEnemy() {
var enemy = new Enemy();
enemy.x = Math.random() * 2048;
enemy.y = -100;
game.enemies.push(enemy);
game.addChild(enemy);
}
// Spawn powerup
function spawnPowerup() {
var powerup = new PowerUp();
powerup.x = Math.random() * 2048;
powerup.y = -100;
game.powerups.push(powerup);
game.addChild(powerup);
}
// Spawn boss
function spawnBoss() {
currentBoss = new Boss();
currentBoss.x = 2048 / 2;
currentBoss.y = -300;
game.addChild(currentBoss);
LK.getSound('boss_arrival').play();
LK.effects.flashScreen(0xff0000, 500);
}
// Check collision between two objects
function checkCollision(obj1, obj2) {
return obj1.intersects(obj2);
}
// Handle player collision with obstacle
function handlePlayerCollision() {
if (player.invulnerable) {
return false;
}
if (player.shieldActive) {
// Shield absorbs one hit
player.shieldActive = false;
if (player.shieldGraphics) {
player.shieldGraphics.destroy();
player.shieldGraphics = null;
}
LK.effects.flashObject(player, 0x2ecc71, 500);
return false;
}
// Player hit - game over
LK.effects.flashScreen(0xff0000, 1000);
LK.getSound('explosion').play();
gameActive = false;
// Store level progress
storage.level = level;
// Show game over after a short delay
LK.setTimeout(function () {
LK.showGameOver();
}, 1200);
return true;
}
// Apply powerup effect
function applyPowerup(type) {
switch (type) {
case 0:
// Shield
player.activateShield(10000);
break;
case 1:
// Weapon
player.activateWeapon(8000);
break;
case 2:
// Speed boost
player.makeInvulnerable(5000);
break;
}
LK.getSound('powerup_collect').play();
}
// Level up
function levelUp() {
level++;
levelDisplay.setText('Level: ' + level);
// Speed up spawning as levels increase
spawnRate = Math.max(30, 100 - level * 5);
// Show level up indicator
var levelUpText = new Text2('LEVEL ' + level, {
size: 150,
fill: 0xFFFF00
});
levelUpText.anchor.set(0.5, 0.5);
levelUpText.x = 2048 / 2;
levelUpText.y = 2732 / 2;
game.addChild(levelUpText);
// Animate level up text
tween(levelUpText, {
alpha: 0,
scaleX: 2,
scaleY: 2
}, {
duration: 1500,
onFinish: function onFinish() {
levelUpText.destroy();
}
});
// Check if it's a boss level
if (level % bossSpawnLevel === 0) {
spawnBoss();
}
}
// Handle player movement
function handleMove(x, y) {
if (!gameActive || !dragNode) {
return;
}
// Constrain player to screen bounds
var boundedX = Math.max(100, Math.min(2048 - 100, x));
var boundedY = Math.max(100, Math.min(2732 - 100, y));
dragNode.x = boundedX;
dragNode.y = boundedY;
}
// Mouse or touch events
game.down = function (x, y) {
if (!gameActive) {
return;
}
dragNode = player;
handleMove(x, y);
};
game.move = function (x, y) {
handleMove(x, y);
};
game.up = function () {
dragNode = null;
};
// Initialize game
function initGame() {
// Play background music
LK.playMusic('game_music');
// Initialize game components
initStars();
initPlayer();
initUI();
// Reset game state
gameActive = true;
score = 0;
updateScore(0);
}
// Initialize the game
initGame();
// Game update loop
game.update = function () {
if (!gameActive) {
return;
}
// Update difficulty over time
difficultyTimer++;
if (difficultyTimer >= 1800) {
// 30 seconds
difficultyTimer = 0;
levelUp();
}
// Spawn objects
spawnTimer++;
if (spawnTimer >= spawnRate) {
spawnTimer = 0;
// Determine what to spawn based on probability
var rand = Math.random();
if (rand < 0.6) {
spawnAsteroid();
} else if (rand < 0.9) {
spawnEnemy();
} else {
spawnPowerup();
}
}
// Update stars
for (var i = 0; i < stars.length; i++) {
stars[i].update();
}
// Update player
if (player) {
player.update();
}
// Update boss
if (currentBoss) {
currentBoss.update();
if (currentBoss.destroyed) {
// Award points when boss is defeated
updateScore(currentBoss.points);
currentBoss = null;
}
}
// Update asteroids
for (var a = game.asteroids.length - 1; a >= 0; a--) {
var asteroid = game.asteroids[a];
asteroid.update();
// Check for collision with player
if (player && checkCollision(player, asteroid)) {
if (handlePlayerCollision()) {
break; // Game over, stop checking collisions
}
// Remove asteroid after collision
asteroid.destroy();
game.asteroids.splice(a, 1);
continue;
}
// Remove if marked as destroyed
if (asteroid.destroyed) {
asteroid.destroy();
game.asteroids.splice(a, 1);
}
}
// Update enemies
for (var e = game.enemies.length - 1; e >= 0; e--) {
var enemy = game.enemies[e];
enemy.update();
// Check for collision with player
if (player && checkCollision(player, enemy)) {
if (handlePlayerCollision()) {
break; // Game over, stop checking collisions
}
// Remove enemy after collision
enemy.destroy();
game.enemies.splice(e, 1);
continue;
}
// Remove if marked as destroyed
if (enemy.destroyed) {
enemy.destroy();
game.enemies.splice(e, 1);
}
}
// Update powerups
for (var p = game.powerups.length - 1; p >= 0; p--) {
var powerup = game.powerups[p];
powerup.update();
// Check for collision with player
if (player && checkCollision(player, powerup)) {
applyPowerup(powerup.type);
powerup.destroy();
game.powerups.splice(p, 1);
// Award points for collecting powerup
updateScore(50);
continue;
}
// Remove if marked as destroyed
if (powerup.destroyed) {
powerup.destroy();
game.powerups.splice(p, 1);
}
}
// Update bullets
for (var b = game.bullets.length - 1; b >= 0; b--) {
var bullet = game.bullets[b];
bullet.update();
var hitSomething = false;
// Check for collision with enemies
for (var e2 = game.enemies.length - 1; e2 >= 0; e2--) {
var enemy2 = game.enemies[e2];
if (checkCollision(bullet, enemy2)) {
// Remove enemy
enemy2.destroy();
game.enemies.splice(e2, 1);
// Award points
updateScore(enemy2.points);
hitSomething = true;
LK.getSound('explosion').play();
break;
}
}
// Check for collision with asteroids
if (!hitSomething) {
for (var a2 = game.asteroids.length - 1; a2 >= 0; a2--) {
var asteroid2 = game.asteroids[a2];
if (checkCollision(bullet, asteroid2)) {
// Remove asteroid
asteroid2.destroy();
game.asteroids.splice(a2, 1);
// Award points
updateScore(50);
hitSomething = true;
LK.getSound('explosion').play();
break;
}
}
}
// Check for collision with boss
if (!hitSomething && currentBoss && checkCollision(bullet, currentBoss)) {
currentBoss.damage();
hitSomething = true;
}
// Remove bullet if it hit something or went off-screen
if (hitSomething || bullet.destroyed) {
bullet.destroy();
game.bullets.splice(b, 1);
}
}
// Survive points (small increment every second)
if (LK.ticks % 60 === 0) {
updateScore(1);
}
}; ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,638 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+var storage = LK.import("@upit/storage.v1", {
+ highScore: 0,
+ level: 1
+});
+
+/****
+* Classes
+****/
+var Asteroid = Container.expand(function () {
+ var self = Container.call(this);
+ var asteroidGraphics = self.attachAsset('asteroid', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 5 + Math.random() * 3;
+ self.rotationSpeed = (Math.random() - 0.5) * 0.1;
+ self.size = 0.6 + Math.random() * 0.8;
+ asteroidGraphics.scale.set(self.size, self.size);
+ self.update = function () {
+ self.y += self.speed;
+ self.rotation += self.rotationSpeed;
+ // If asteroid goes off screen, remove it
+ if (self.y > 2732 + 100) {
+ self.destroyed = true;
+ }
+ };
+ return self;
+});
+var Boss = Container.expand(function () {
+ var self = Container.call(this);
+ var bossGraphics = self.attachAsset('boss', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.health = 10;
+ self.speed = 1.5;
+ self.state = 'entering'; // entering, attacking, exiting
+ self.attackTimer = 0;
+ self.moveDirection = 1;
+ self.points = 2000;
+ self.update = function () {
+ if (self.state === 'entering') {
+ self.y += self.speed;
+ if (self.y >= 300) {
+ self.state = 'attacking';
+ }
+ } else if (self.state === 'attacking') {
+ // Move side to side
+ self.x += self.speed * 2 * self.moveDirection;
+ // Reverse direction at screen edges
+ if (self.x < 400 || self.x > 2048 - 400) {
+ self.moveDirection *= -1;
+ }
+ // Attack logic
+ self.attackTimer++;
+ if (self.attackTimer >= 60) {
+ // Spawn enemy
+ if (Math.random() < 0.5) {
+ var enemy = new Enemy();
+ enemy.x = self.x + (Math.random() - 0.5) * 200;
+ enemy.y = self.y + 100;
+ game.enemies.push(enemy);
+ game.addChild(enemy);
+ }
+ self.attackTimer = 0;
+ }
+ } else if (self.state === 'exiting') {
+ self.y -= self.speed * 2;
+ if (self.y < -300) {
+ self.destroyed = true;
+ }
+ }
+ };
+ self.damage = function () {
+ self.health--;
+ LK.effects.flashObject(self, 0xffffff, 300);
+ if (self.health <= 0) {
+ self.state = 'exiting';
+ }
+ };
+ return self;
+});
+var Bullet = Container.expand(function () {
+ var self = Container.call(this);
+ var bulletGraphics = self.attachAsset('bullet', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 15;
+ self.update = function () {
+ self.y -= self.speed;
+ // If bullet goes off screen, remove it
+ if (self.y < -100) {
+ self.destroyed = true;
+ }
+ };
+ return self;
+});
+var Enemy = Container.expand(function () {
+ var self = Container.call(this);
+ var enemyGraphics = self.attachAsset('enemy', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 4 + Math.random() * 2;
+ self.horizontalSpeed = (Math.random() - 0.5) * 4;
+ self.points = 100;
+ self.update = function () {
+ self.y += self.speed;
+ self.x += self.horizontalSpeed;
+ // Bounce off walls
+ if (self.x < 100 || self.x > 2048 - 100) {
+ self.horizontalSpeed *= -1;
+ }
+ // If enemy goes off screen, remove it
+ if (self.y > 2732 + 100) {
+ self.destroyed = true;
+ }
+ };
+ return self;
+});
+var Player = Container.expand(function () {
+ var self = Container.call(this);
+ var playerGraphics = self.attachAsset('player', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.shieldActive = false;
+ self.shieldGraphics = null;
+ self.bulletTimer = 0;
+ self.canShoot = false;
+ self.invulnerable = false;
+ self.activateShield = function (duration) {
+ if (self.shieldActive) {
+ return;
+ }
+ self.shieldActive = true;
+ self.shieldGraphics = self.attachAsset('shield', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ alpha: 0.5
+ });
+ LK.setTimeout(function () {
+ if (self.shieldGraphics) {
+ self.shieldGraphics.destroy();
+ self.shieldGraphics = null;
+ }
+ self.shieldActive = false;
+ }, duration);
+ };
+ self.activateWeapon = function (duration) {
+ self.canShoot = true;
+ LK.setTimeout(function () {
+ self.canShoot = false;
+ }, duration);
+ };
+ self.makeInvulnerable = function (duration) {
+ self.invulnerable = true;
+ // Flash effect to show invulnerability
+ var flashCount = 0;
+ var flashInterval = LK.setInterval(function () {
+ playerGraphics.alpha = playerGraphics.alpha === 1 ? 0.3 : 1;
+ flashCount++;
+ if (flashCount > 10) {
+ LK.clearInterval(flashInterval);
+ playerGraphics.alpha = 1;
+ }
+ }, 150);
+ LK.setTimeout(function () {
+ self.invulnerable = false;
+ playerGraphics.alpha = 1;
+ LK.clearInterval(flashInterval);
+ }, duration);
+ };
+ self.shoot = function () {
+ if (!self.canShoot) {
+ return;
+ }
+ if (self.bulletTimer <= 0) {
+ var bullet = new Bullet();
+ bullet.x = self.x;
+ bullet.y = self.y - 50;
+ game.bullets.push(bullet);
+ game.addChild(bullet);
+ LK.getSound('shoot').play();
+ self.bulletTimer = 10; // Rate of fire control
+ }
+ };
+ self.update = function () {
+ if (self.bulletTimer > 0) {
+ self.bulletTimer--;
+ }
+ if (self.canShoot) {
+ self.shoot();
+ }
+ if (self.shieldGraphics) {
+ self.shieldGraphics.rotation += 0.02;
+ }
+ };
+ return self;
+});
+var PowerUp = Container.expand(function () {
+ var self = Container.call(this);
+ var type = Math.floor(Math.random() * 3); // 0: shield, 1: weapon, 2: speed
+ var colors = [0x2ecc71, 0xf1c40f, 0x9b59b6];
+ var powerupGraphics = self.attachAsset('powerup', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ tint: colors[type]
+ });
+ self.type = type;
+ self.speed = 3;
+ self.update = function () {
+ self.y += self.speed;
+ self.rotation += 0.02;
+ // If powerup goes off screen, remove it
+ if (self.y > 2732 + 100) {
+ self.destroyed = true;
+ }
+ };
+ return self;
+});
+var Star = Container.expand(function () {
+ var self = Container.call(this);
+ var brightness = 0.3 + Math.random() * 0.7;
+ var starGraphics = self.attachAsset('star', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ alpha: brightness
+ });
+ self.speed = 1 + Math.random() * 3;
+ self.update = function () {
+ self.y += self.speed;
+ // If star goes off screen, reset to top
+ if (self.y > 2732 + 50) {
+ self.y = -50;
+ self.x = Math.random() * 2048;
+ }
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x000033
+});
+
+/****
+* Game Code
+****/
+// Game state variables
+var player;
+var score = 0;
+var level = storage.level || 1;
+var highScore = storage.highScore || 0;
+var gameActive = true;
+var dragNode = null;
+var spawnTimer = 0;
+var difficultyTimer = 0;
+var bossSpawnLevel = 5;
+var currentBoss = null;
+var spawnRate = 100;
+var scoreDisplay;
+var levelDisplay;
+var stars = [];
+// Collection arrays
+game.asteroids = [];
+game.enemies = [];
+game.powerups = [];
+game.bullets = [];
+// Initialize player
+function initPlayer() {
+ player = new Player();
+ player.x = 2048 / 2;
+ player.y = 2732 - 250;
+ game.addChild(player);
+ // Start with brief invulnerability
+ player.makeInvulnerable(2000);
+}
+// Initialize stars background
+function initStars() {
+ for (var i = 0; i < 50; i++) {
+ var star = new Star();
+ star.x = Math.random() * 2048;
+ star.y = Math.random() * 2732;
+ stars.push(star);
+ game.addChild(star);
+ }
+}
+// Initialize UI
+function initUI() {
+ // Score display
+ scoreDisplay = new Text2('Score: 0', {
+ size: 80,
+ fill: 0xFFFFFF
+ });
+ scoreDisplay.anchor.set(0, 0);
+ LK.gui.topRight.addChild(scoreDisplay);
+ // Level display
+ levelDisplay = new Text2('Level: ' + level, {
+ size: 80,
+ fill: 0xFFFFFF
+ });
+ levelDisplay.anchor.set(0, 0);
+ LK.gui.topRight.addChild(levelDisplay);
+ levelDisplay.y = 100;
+ // High score display
+ var highScoreDisplay = new Text2('High Score: ' + highScore, {
+ size: 60,
+ fill: 0xFFFF00
+ });
+ highScoreDisplay.anchor.set(0, 0);
+ LK.gui.topRight.addChild(highScoreDisplay);
+ highScoreDisplay.y = 200;
+}
+// Update score
+function updateScore(points) {
+ score += points;
+ scoreDisplay.setText('Score: ' + score);
+ // Check for high score
+ if (score > highScore) {
+ highScore = score;
+ storage.highScore = highScore;
+ }
+ LK.setScore(score);
+}
+// Spawn asteroid
+function spawnAsteroid() {
+ var asteroid = new Asteroid();
+ asteroid.x = Math.random() * 2048;
+ asteroid.y = -100;
+ game.asteroids.push(asteroid);
+ game.addChild(asteroid);
+}
+// Spawn enemy
+function spawnEnemy() {
+ var enemy = new Enemy();
+ enemy.x = Math.random() * 2048;
+ enemy.y = -100;
+ game.enemies.push(enemy);
+ game.addChild(enemy);
+}
+// Spawn powerup
+function spawnPowerup() {
+ var powerup = new PowerUp();
+ powerup.x = Math.random() * 2048;
+ powerup.y = -100;
+ game.powerups.push(powerup);
+ game.addChild(powerup);
+}
+// Spawn boss
+function spawnBoss() {
+ currentBoss = new Boss();
+ currentBoss.x = 2048 / 2;
+ currentBoss.y = -300;
+ game.addChild(currentBoss);
+ LK.getSound('boss_arrival').play();
+ LK.effects.flashScreen(0xff0000, 500);
+}
+// Check collision between two objects
+function checkCollision(obj1, obj2) {
+ return obj1.intersects(obj2);
+}
+// Handle player collision with obstacle
+function handlePlayerCollision() {
+ if (player.invulnerable) {
+ return false;
+ }
+ if (player.shieldActive) {
+ // Shield absorbs one hit
+ player.shieldActive = false;
+ if (player.shieldGraphics) {
+ player.shieldGraphics.destroy();
+ player.shieldGraphics = null;
+ }
+ LK.effects.flashObject(player, 0x2ecc71, 500);
+ return false;
+ }
+ // Player hit - game over
+ LK.effects.flashScreen(0xff0000, 1000);
+ LK.getSound('explosion').play();
+ gameActive = false;
+ // Store level progress
+ storage.level = level;
+ // Show game over after a short delay
+ LK.setTimeout(function () {
+ LK.showGameOver();
+ }, 1200);
+ return true;
+}
+// Apply powerup effect
+function applyPowerup(type) {
+ switch (type) {
+ case 0:
+ // Shield
+ player.activateShield(10000);
+ break;
+ case 1:
+ // Weapon
+ player.activateWeapon(8000);
+ break;
+ case 2:
+ // Speed boost
+ player.makeInvulnerable(5000);
+ break;
+ }
+ LK.getSound('powerup_collect').play();
+}
+// Level up
+function levelUp() {
+ level++;
+ levelDisplay.setText('Level: ' + level);
+ // Speed up spawning as levels increase
+ spawnRate = Math.max(30, 100 - level * 5);
+ // Show level up indicator
+ var levelUpText = new Text2('LEVEL ' + level, {
+ size: 150,
+ fill: 0xFFFF00
+ });
+ levelUpText.anchor.set(0.5, 0.5);
+ levelUpText.x = 2048 / 2;
+ levelUpText.y = 2732 / 2;
+ game.addChild(levelUpText);
+ // Animate level up text
+ tween(levelUpText, {
+ alpha: 0,
+ scaleX: 2,
+ scaleY: 2
+ }, {
+ duration: 1500,
+ onFinish: function onFinish() {
+ levelUpText.destroy();
+ }
+ });
+ // Check if it's a boss level
+ if (level % bossSpawnLevel === 0) {
+ spawnBoss();
+ }
+}
+// Handle player movement
+function handleMove(x, y) {
+ if (!gameActive || !dragNode) {
+ return;
+ }
+ // Constrain player to screen bounds
+ var boundedX = Math.max(100, Math.min(2048 - 100, x));
+ var boundedY = Math.max(100, Math.min(2732 - 100, y));
+ dragNode.x = boundedX;
+ dragNode.y = boundedY;
+}
+// Mouse or touch events
+game.down = function (x, y) {
+ if (!gameActive) {
+ return;
+ }
+ dragNode = player;
+ handleMove(x, y);
+};
+game.move = function (x, y) {
+ handleMove(x, y);
+};
+game.up = function () {
+ dragNode = null;
+};
+// Initialize game
+function initGame() {
+ // Play background music
+ LK.playMusic('game_music');
+ // Initialize game components
+ initStars();
+ initPlayer();
+ initUI();
+ // Reset game state
+ gameActive = true;
+ score = 0;
+ updateScore(0);
+}
+// Initialize the game
+initGame();
+// Game update loop
+game.update = function () {
+ if (!gameActive) {
+ return;
+ }
+ // Update difficulty over time
+ difficultyTimer++;
+ if (difficultyTimer >= 1800) {
+ // 30 seconds
+ difficultyTimer = 0;
+ levelUp();
+ }
+ // Spawn objects
+ spawnTimer++;
+ if (spawnTimer >= spawnRate) {
+ spawnTimer = 0;
+ // Determine what to spawn based on probability
+ var rand = Math.random();
+ if (rand < 0.6) {
+ spawnAsteroid();
+ } else if (rand < 0.9) {
+ spawnEnemy();
+ } else {
+ spawnPowerup();
+ }
+ }
+ // Update stars
+ for (var i = 0; i < stars.length; i++) {
+ stars[i].update();
+ }
+ // Update player
+ if (player) {
+ player.update();
+ }
+ // Update boss
+ if (currentBoss) {
+ currentBoss.update();
+ if (currentBoss.destroyed) {
+ // Award points when boss is defeated
+ updateScore(currentBoss.points);
+ currentBoss = null;
+ }
+ }
+ // Update asteroids
+ for (var a = game.asteroids.length - 1; a >= 0; a--) {
+ var asteroid = game.asteroids[a];
+ asteroid.update();
+ // Check for collision with player
+ if (player && checkCollision(player, asteroid)) {
+ if (handlePlayerCollision()) {
+ break; // Game over, stop checking collisions
+ }
+ // Remove asteroid after collision
+ asteroid.destroy();
+ game.asteroids.splice(a, 1);
+ continue;
+ }
+ // Remove if marked as destroyed
+ if (asteroid.destroyed) {
+ asteroid.destroy();
+ game.asteroids.splice(a, 1);
+ }
+ }
+ // Update enemies
+ for (var e = game.enemies.length - 1; e >= 0; e--) {
+ var enemy = game.enemies[e];
+ enemy.update();
+ // Check for collision with player
+ if (player && checkCollision(player, enemy)) {
+ if (handlePlayerCollision()) {
+ break; // Game over, stop checking collisions
+ }
+ // Remove enemy after collision
+ enemy.destroy();
+ game.enemies.splice(e, 1);
+ continue;
+ }
+ // Remove if marked as destroyed
+ if (enemy.destroyed) {
+ enemy.destroy();
+ game.enemies.splice(e, 1);
+ }
+ }
+ // Update powerups
+ for (var p = game.powerups.length - 1; p >= 0; p--) {
+ var powerup = game.powerups[p];
+ powerup.update();
+ // Check for collision with player
+ if (player && checkCollision(player, powerup)) {
+ applyPowerup(powerup.type);
+ powerup.destroy();
+ game.powerups.splice(p, 1);
+ // Award points for collecting powerup
+ updateScore(50);
+ continue;
+ }
+ // Remove if marked as destroyed
+ if (powerup.destroyed) {
+ powerup.destroy();
+ game.powerups.splice(p, 1);
+ }
+ }
+ // Update bullets
+ for (var b = game.bullets.length - 1; b >= 0; b--) {
+ var bullet = game.bullets[b];
+ bullet.update();
+ var hitSomething = false;
+ // Check for collision with enemies
+ for (var e2 = game.enemies.length - 1; e2 >= 0; e2--) {
+ var enemy2 = game.enemies[e2];
+ if (checkCollision(bullet, enemy2)) {
+ // Remove enemy
+ enemy2.destroy();
+ game.enemies.splice(e2, 1);
+ // Award points
+ updateScore(enemy2.points);
+ hitSomething = true;
+ LK.getSound('explosion').play();
+ break;
+ }
+ }
+ // Check for collision with asteroids
+ if (!hitSomething) {
+ for (var a2 = game.asteroids.length - 1; a2 >= 0; a2--) {
+ var asteroid2 = game.asteroids[a2];
+ if (checkCollision(bullet, asteroid2)) {
+ // Remove asteroid
+ asteroid2.destroy();
+ game.asteroids.splice(a2, 1);
+ // Award points
+ updateScore(50);
+ hitSomething = true;
+ LK.getSound('explosion').play();
+ break;
+ }
+ }
+ }
+ // Check for collision with boss
+ if (!hitSomething && currentBoss && checkCollision(bullet, currentBoss)) {
+ currentBoss.damage();
+ hitSomething = true;
+ }
+ // Remove bullet if it hit something or went off-screen
+ if (hitSomething || bullet.destroyed) {
+ bullet.destroy();
+ game.bullets.splice(b, 1);
+ }
+ }
+ // Survive points (small increment every second)
+ if (LK.ticks % 60 === 0) {
+ updateScore(1);
+ }
+};
\ No newline at end of file