/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Asteroid = Container.expand(function () {
var self = Container.call(this);
var asteroidGraphics = self.attachAsset('asteroid', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 3 + Math.random() * 2;
self.rotationSpeed = (Math.random() - 0.5) * 0.1;
self.update = function () {
self.y += self.speed;
asteroidGraphics.rotation += self.rotationSpeed;
};
return self;
});
var EnemyShip = Container.expand(function () {
var self = Container.call(this);
var shipGraphics = self.attachAsset('enemyShip', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 4 + Math.random() * 3;
self.update = function () {
self.y += self.speed;
};
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 PlayerShip = Container.expand(function () {
var self = Container.call(this);
var shipGraphics = self.attachAsset('playerShip', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 8;
self.lastShotTime = 0;
self.shotInterval = 300; // milliseconds
self.powerUpActive = false;
self.powerUpEndTime = 0;
self.update = function () {
// Handle power-up expiration
if (self.powerUpActive && LK.ticks * 16.67 > self.powerUpEndTime) {
self.powerUpActive = false;
shipGraphics.tint = 0xFFFFFF;
}
// Auto-fire bullets
var currentTime = LK.ticks * 16.67;
var interval = self.powerUpActive ? self.shotInterval / 2 : self.shotInterval;
if (currentTime - self.lastShotTime > interval) {
self.fireBullet();
self.lastShotTime = currentTime;
}
};
self.fireBullet = function () {
var bullet = new PlayerBullet();
bullet.x = self.x;
bullet.y = self.y - 40;
playerBullets.push(bullet);
game.addChild(bullet);
LK.getSound('shoot').play();
};
self.activatePowerUp = function () {
self.powerUpActive = true;
self.powerUpEndTime = LK.ticks * 16.67 + 5000; // 5 seconds
shipGraphics.tint = 0x00FFFF;
};
return self;
});
var PowerUp = Container.expand(function () {
var self = Container.call(this);
var powerUpGraphics = self.attachAsset('powerUp', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 2;
self.pulseTime = 0;
self.update = function () {
self.y += self.speed;
self.pulseTime += 0.1;
powerUpGraphics.alpha = 0.7 + Math.sin(self.pulseTime) * 0.3;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000011
});
/****
* Game Code
****/
// Game variables
var player;
var playerBullets = [];
var enemies = [];
var powerUps = [];
var dragNode = null;
var lastEnemySpawn = 0;
var lastPowerUpSpawn = 0;
var enemySpawnInterval = 1500;
var powerUpSpawnInterval = 15000;
var difficultyMultiplier = 1;
// UI Elements
var scoreTxt = new Text2('Score: 0', {
size: 60,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Initialize player ship
player = game.addChild(new PlayerShip());
player.x = 1024;
player.y = 2400;
// Game event handlers
function handleMove(x, y, obj) {
if (dragNode) {
dragNode.x = Math.max(40, Math.min(2008, x));
dragNode.y = Math.max(100, Math.min(2632, y));
}
}
game.move = handleMove;
game.down = function (x, y, obj) {
dragNode = player;
handleMove(x, y, obj);
};
game.up = function (x, y, obj) {
dragNode = null;
};
// Main game update loop
game.update = function () {
var currentTime = LK.ticks * 16.67;
// Increase difficulty over time
difficultyMultiplier = 1 + LK.getScore() * 0.02;
enemySpawnInterval = Math.max(500, 1500 - LK.getScore() * 10);
// Spawn enemies
if (currentTime - lastEnemySpawn > enemySpawnInterval) {
spawnEnemy();
lastEnemySpawn = currentTime;
}
// Spawn power-ups
if (currentTime - lastPowerUpSpawn > powerUpSpawnInterval) {
spawnPowerUp();
lastPowerUpSpawn = currentTime;
}
// Update and check player bullets
for (var i = playerBullets.length - 1; i >= 0; i--) {
var bullet = playerBullets[i];
if (bullet.lastY === undefined) bullet.lastY = bullet.y;
// Remove bullets that go off screen
if (bullet.lastY >= -50 && bullet.y < -50) {
bullet.destroy();
playerBullets.splice(i, 1);
continue;
}
// Check bullet-enemy collisions
var hitEnemy = false;
for (var j = enemies.length - 1; j >= 0; j--) {
var enemy = enemies[j];
if (bullet.intersects(enemy)) {
// Destroy enemy and bullet
LK.setScore(LK.getScore() + 10);
scoreTxt.setText('Score: ' + LK.getScore());
LK.effects.flashObject(enemy, 0xFF6600, 200);
LK.getSound('explosion').play();
enemy.destroy();
enemies.splice(j, 1);
bullet.destroy();
playerBullets.splice(i, 1);
hitEnemy = true;
break;
}
}
if (!hitEnemy) {
bullet.lastY = bullet.y;
}
}
// Update and check enemies
for (var i = enemies.length - 1; i >= 0; i--) {
var enemy = enemies[i];
if (enemy.lastY === undefined) enemy.lastY = enemy.y;
if (enemy.lastIntersecting === undefined) enemy.lastIntersecting = false;
// Remove enemies that go off screen
if (enemy.lastY <= 2800 && enemy.y > 2800) {
enemy.destroy();
enemies.splice(i, 1);
continue;
}
// Check player-enemy collision
var currentIntersecting = enemy.intersects(player);
if (!enemy.lastIntersecting && currentIntersecting) {
LK.effects.flashScreen(0xFF0000, 1000);
LK.showGameOver();
return;
}
enemy.lastY = enemy.y;
enemy.lastIntersecting = currentIntersecting;
}
// Update and check power-ups
for (var i = powerUps.length - 1; i >= 0; i--) {
var powerUp = powerUps[i];
if (powerUp.lastY === undefined) powerUp.lastY = powerUp.y;
if (powerUp.lastIntersecting === undefined) powerUp.lastIntersecting = false;
// Remove power-ups that go off screen
if (powerUp.lastY <= 2800 && powerUp.y > 2800) {
powerUp.destroy();
powerUps.splice(i, 1);
continue;
}
// Check player-powerup collision
var currentIntersecting = powerUp.intersects(player);
if (!powerUp.lastIntersecting && currentIntersecting) {
player.activatePowerUp();
LK.getSound('powerup').play();
LK.effects.flashObject(player, 0x00FFFF, 500);
powerUp.destroy();
powerUps.splice(i, 1);
continue;
}
powerUp.lastY = powerUp.y;
powerUp.lastIntersecting = currentIntersecting;
}
};
// Helper functions
function spawnEnemy() {
var enemy;
var enemyType = Math.random();
if (enemyType < 0.6) {
enemy = new Asteroid();
} else {
enemy = new EnemyShip();
}
enemy.x = Math.random() * 1800 + 124; // Random x position with margins
enemy.y = -100;
enemy.speed *= difficultyMultiplier;
enemies.push(enemy);
game.addChild(enemy);
}
function spawnPowerUp() {
var powerUp = new PowerUp();
powerUp.x = Math.random() * 1800 + 124;
powerUp.y = -100;
powerUps.push(powerUp);
game.addChild(powerUp);
} /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Asteroid = Container.expand(function () {
var self = Container.call(this);
var asteroidGraphics = self.attachAsset('asteroid', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 3 + Math.random() * 2;
self.rotationSpeed = (Math.random() - 0.5) * 0.1;
self.update = function () {
self.y += self.speed;
asteroidGraphics.rotation += self.rotationSpeed;
};
return self;
});
var EnemyShip = Container.expand(function () {
var self = Container.call(this);
var shipGraphics = self.attachAsset('enemyShip', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 4 + Math.random() * 3;
self.update = function () {
self.y += self.speed;
};
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 PlayerShip = Container.expand(function () {
var self = Container.call(this);
var shipGraphics = self.attachAsset('playerShip', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 8;
self.lastShotTime = 0;
self.shotInterval = 300; // milliseconds
self.powerUpActive = false;
self.powerUpEndTime = 0;
self.update = function () {
// Handle power-up expiration
if (self.powerUpActive && LK.ticks * 16.67 > self.powerUpEndTime) {
self.powerUpActive = false;
shipGraphics.tint = 0xFFFFFF;
}
// Auto-fire bullets
var currentTime = LK.ticks * 16.67;
var interval = self.powerUpActive ? self.shotInterval / 2 : self.shotInterval;
if (currentTime - self.lastShotTime > interval) {
self.fireBullet();
self.lastShotTime = currentTime;
}
};
self.fireBullet = function () {
var bullet = new PlayerBullet();
bullet.x = self.x;
bullet.y = self.y - 40;
playerBullets.push(bullet);
game.addChild(bullet);
LK.getSound('shoot').play();
};
self.activatePowerUp = function () {
self.powerUpActive = true;
self.powerUpEndTime = LK.ticks * 16.67 + 5000; // 5 seconds
shipGraphics.tint = 0x00FFFF;
};
return self;
});
var PowerUp = Container.expand(function () {
var self = Container.call(this);
var powerUpGraphics = self.attachAsset('powerUp', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 2;
self.pulseTime = 0;
self.update = function () {
self.y += self.speed;
self.pulseTime += 0.1;
powerUpGraphics.alpha = 0.7 + Math.sin(self.pulseTime) * 0.3;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000011
});
/****
* Game Code
****/
// Game variables
var player;
var playerBullets = [];
var enemies = [];
var powerUps = [];
var dragNode = null;
var lastEnemySpawn = 0;
var lastPowerUpSpawn = 0;
var enemySpawnInterval = 1500;
var powerUpSpawnInterval = 15000;
var difficultyMultiplier = 1;
// UI Elements
var scoreTxt = new Text2('Score: 0', {
size: 60,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Initialize player ship
player = game.addChild(new PlayerShip());
player.x = 1024;
player.y = 2400;
// Game event handlers
function handleMove(x, y, obj) {
if (dragNode) {
dragNode.x = Math.max(40, Math.min(2008, x));
dragNode.y = Math.max(100, Math.min(2632, y));
}
}
game.move = handleMove;
game.down = function (x, y, obj) {
dragNode = player;
handleMove(x, y, obj);
};
game.up = function (x, y, obj) {
dragNode = null;
};
// Main game update loop
game.update = function () {
var currentTime = LK.ticks * 16.67;
// Increase difficulty over time
difficultyMultiplier = 1 + LK.getScore() * 0.02;
enemySpawnInterval = Math.max(500, 1500 - LK.getScore() * 10);
// Spawn enemies
if (currentTime - lastEnemySpawn > enemySpawnInterval) {
spawnEnemy();
lastEnemySpawn = currentTime;
}
// Spawn power-ups
if (currentTime - lastPowerUpSpawn > powerUpSpawnInterval) {
spawnPowerUp();
lastPowerUpSpawn = currentTime;
}
// Update and check player bullets
for (var i = playerBullets.length - 1; i >= 0; i--) {
var bullet = playerBullets[i];
if (bullet.lastY === undefined) bullet.lastY = bullet.y;
// Remove bullets that go off screen
if (bullet.lastY >= -50 && bullet.y < -50) {
bullet.destroy();
playerBullets.splice(i, 1);
continue;
}
// Check bullet-enemy collisions
var hitEnemy = false;
for (var j = enemies.length - 1; j >= 0; j--) {
var enemy = enemies[j];
if (bullet.intersects(enemy)) {
// Destroy enemy and bullet
LK.setScore(LK.getScore() + 10);
scoreTxt.setText('Score: ' + LK.getScore());
LK.effects.flashObject(enemy, 0xFF6600, 200);
LK.getSound('explosion').play();
enemy.destroy();
enemies.splice(j, 1);
bullet.destroy();
playerBullets.splice(i, 1);
hitEnemy = true;
break;
}
}
if (!hitEnemy) {
bullet.lastY = bullet.y;
}
}
// Update and check enemies
for (var i = enemies.length - 1; i >= 0; i--) {
var enemy = enemies[i];
if (enemy.lastY === undefined) enemy.lastY = enemy.y;
if (enemy.lastIntersecting === undefined) enemy.lastIntersecting = false;
// Remove enemies that go off screen
if (enemy.lastY <= 2800 && enemy.y > 2800) {
enemy.destroy();
enemies.splice(i, 1);
continue;
}
// Check player-enemy collision
var currentIntersecting = enemy.intersects(player);
if (!enemy.lastIntersecting && currentIntersecting) {
LK.effects.flashScreen(0xFF0000, 1000);
LK.showGameOver();
return;
}
enemy.lastY = enemy.y;
enemy.lastIntersecting = currentIntersecting;
}
// Update and check power-ups
for (var i = powerUps.length - 1; i >= 0; i--) {
var powerUp = powerUps[i];
if (powerUp.lastY === undefined) powerUp.lastY = powerUp.y;
if (powerUp.lastIntersecting === undefined) powerUp.lastIntersecting = false;
// Remove power-ups that go off screen
if (powerUp.lastY <= 2800 && powerUp.y > 2800) {
powerUp.destroy();
powerUps.splice(i, 1);
continue;
}
// Check player-powerup collision
var currentIntersecting = powerUp.intersects(player);
if (!powerUp.lastIntersecting && currentIntersecting) {
player.activatePowerUp();
LK.getSound('powerup').play();
LK.effects.flashObject(player, 0x00FFFF, 500);
powerUp.destroy();
powerUps.splice(i, 1);
continue;
}
powerUp.lastY = powerUp.y;
powerUp.lastIntersecting = currentIntersecting;
}
};
// Helper functions
function spawnEnemy() {
var enemy;
var enemyType = Math.random();
if (enemyType < 0.6) {
enemy = new Asteroid();
} else {
enemy = new EnemyShip();
}
enemy.x = Math.random() * 1800 + 124; // Random x position with margins
enemy.y = -100;
enemy.speed *= difficultyMultiplier;
enemies.push(enemy);
game.addChild(enemy);
}
function spawnPowerUp() {
var powerUp = new PowerUp();
powerUp.x = Math.random() * 1800 + 124;
powerUp.y = -100;
powerUps.push(powerUp);
game.addChild(powerUp);
}