/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1", { highScore: 0 }); /**** * Classes ****/ var Asteroid = Container.expand(function () { var self = Container.call(this); var asteroidGraphics = self.attachAsset('asteroid', { anchorX: 0.5, anchorY: 0.5 }); // Randomize asteroid appearance asteroidGraphics.rotation = Math.random() * Math.PI * 2; var scale = 0.6 + Math.random() * 0.8; asteroidGraphics.scale.set(scale, scale); self.speed = 2 + Math.random() * 3; self.rotationSpeed = (Math.random() - 0.5) * 0.05; self.width = asteroidGraphics.width * scale; self.height = asteroidGraphics.height * scale; self.update = function () { self.y += self.speed; asteroidGraphics.rotation += self.rotationSpeed; }; 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 = -8; self.width = bulletGraphics.width; self.height = bulletGraphics.height; self.update = function () { self.y += self.speed; }; return self; }); var PowerUp = Container.expand(function () { var self = Container.call(this); var powerupGraphics = self.attachAsset('powerup', { anchorX: 0.5, anchorY: 0.5 }); self.type = Math.floor(Math.random() * 3); // 0: shield, 1: slow motion, 2: blaster // Set color based on powerup type if (self.type === 0) { powerupGraphics.tint = 0x3498db; // Blue for shield } else if (self.type === 1) { powerupGraphics.tint = 0xf1c40f; // Yellow for slow motion } else { powerupGraphics.tint = 0xe74c3c; // Red for blaster } self.speed = 1.5 + Math.random() * 1.5; self.width = powerupGraphics.width; self.height = powerupGraphics.height; self.update = function () { self.y += self.speed; powerupGraphics.rotation += 0.02; }; return self; }); var Spaceship = Container.expand(function () { var self = Container.call(this); var shipGraphics = self.attachAsset('spaceship', { anchorX: 0.5, anchorY: 0.5 }); self.shield = self.attachAsset('shield', { anchorX: 0.5, anchorY: 0.5, alpha: 0 }); self.hasShield = false; self.canShoot = false; self.width = shipGraphics.width; self.height = shipGraphics.height; self.activateShield = function (duration) { self.hasShield = true; self.shield.alpha = 0.5; // Deactivate shield after duration LK.setTimeout(function () { self.deactivateShield(); }, duration); }; self.deactivateShield = function () { self.hasShield = false; self.shield.alpha = 0; }; self.activateBlaster = function (duration) { self.canShoot = true; // Disable blaster after duration LK.setTimeout(function () { self.canShoot = false; }, duration); }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000000 }); /**** * Game Code ****/ game.setBackgroundColor(0x000022); // Deep space blue // Game variables var spaceship; var asteroids = []; var powerups = []; var bullets = []; var score = 0; var gameSpeed = 1; // Used for slow-motion effect var lastAsteroidTime = 0; var lastPowerupTime = 0; var isSlowMotion = false; var gameStartTime = Date.now(); var dragNode = null; // Load high score var highScore = storage.highScore || 0; // Create score text var scoreTxt = new Text2('Score: 0', { size: 50, fill: 0xFFFFFF }); scoreTxt.anchor.set(0, 0); LK.gui.topRight.addChild(scoreTxt); scoreTxt.x = -250; scoreTxt.y = 50; // Create high score text var highScoreTxt = new Text2('High Score: ' + highScore, { size: 40, fill: 0xAAAAAA }); highScoreTxt.anchor.set(0, 0); LK.gui.topRight.addChild(highScoreTxt); highScoreTxt.x = -250; highScoreTxt.y = 110; // Initialize game elements function initGame() { // Start game music LK.playMusic('space_music', { fade: { start: 0, end: 0.7, duration: 1000 } }); // Reset score score = 0; LK.setScore(0); updateScoreDisplay(); // Reset game speed gameSpeed = 1; // Record start time gameStartTime = Date.now(); // Create spaceship spaceship = new Spaceship(); spaceship.x = 2048 / 2; spaceship.y = 2732 - 300; game.addChild(spaceship); // Clear existing arrays clearGameElements(); // Reset timers lastAsteroidTime = 0; lastPowerupTime = 0; } function clearGameElements() { // Clear all asteroids for (var i = asteroids.length - 1; i >= 0; i--) { asteroids[i].destroy(); } asteroids = []; // Clear all powerups for (var i = powerups.length - 1; i >= 0; i--) { powerups[i].destroy(); } powerups = []; // Clear all bullets for (var i = bullets.length - 1; i >= 0; i--) { bullets[i].destroy(); } bullets = []; } function updateScoreDisplay() { scoreTxt.setText('Score: ' + score); highScoreTxt.setText('High Score: ' + highScore); } function createAsteroid() { var asteroid = new Asteroid(); asteroid.x = Math.random() * 2048; asteroid.y = -100; asteroids.push(asteroid); game.addChild(asteroid); } function createPowerup() { var powerup = new PowerUp(); powerup.x = 100 + Math.random() * (2048 - 200); powerup.y = -100; powerups.push(powerup); game.addChild(powerup); } function createBullet() { var bullet = new Bullet(); bullet.x = spaceship.x; bullet.y = spaceship.y - 60; bullets.push(bullet); game.addChild(bullet); LK.getSound('shoot').play(); } function activateSlowMotion(duration) { isSlowMotion = true; gameSpeed = 0.5; // Return to normal speed after duration LK.setTimeout(function () { isSlowMotion = false; gameSpeed = 1; }, duration); } function handleCollision() { // Flash the screen red LK.effects.flashScreen(0xff0000, 500); // Play explosion sound LK.getSound('explosion').play(); // Flash the ship LK.effects.flashObject(spaceship, 0xff0000, 500); // Store high score if (score > highScore) { highScore = score; storage.highScore = highScore; updateScoreDisplay(); } // Show game over LK.setTimeout(function () { LK.showGameOver(); }, 500); } // Event handlers function handleMove(x, y, obj) { if (dragNode) { // Keep spaceship within game bounds dragNode.x = Math.max(dragNode.width / 2, Math.min(2048 - dragNode.width / 2, x)); dragNode.y = Math.max(dragNode.height / 2, Math.min(2732 - dragNode.height / 2, y)); } } game.move = handleMove; game.down = function (x, y, obj) { dragNode = spaceship; handleMove(x, y, obj); }; game.up = function (x, y, obj) { dragNode = null; }; // Game update function game.update = function () { // Increment score based on survival time (10 points per second) var currentTime = Date.now(); var elapsedSeconds = Math.floor((currentTime - gameStartTime) / 1000); score = elapsedSeconds * 10; LK.setScore(score); updateScoreDisplay(); // Spawn asteroids with increasing frequency var difficulty = Math.min(10, 1 + Math.floor(elapsedSeconds / 10)); var asteroidInterval = Math.max(30, 60 - difficulty * 5); if (LK.ticks - lastAsteroidTime > asteroidInterval / gameSpeed) { createAsteroid(); lastAsteroidTime = LK.ticks; } // Occasionally spawn power-ups if (LK.ticks - lastPowerupTime > 300 / gameSpeed && Math.random() < 0.01) { createPowerup(); lastPowerupTime = LK.ticks; } // Update asteroids for (var i = asteroids.length - 1; i >= 0; i--) { var asteroid = asteroids[i]; // Increase asteroid speed every 100 points if (score % 100 === 0 && score !== 0) { asteroid.speed += 0.5; } // Apply game speed to movement asteroid.speed = asteroid.speed * gameSpeed; asteroid.update(); asteroid.speed = asteroid.speed / gameSpeed; // Check if asteroid is off screen if (asteroid.y > 2732 + 100) { asteroid.destroy(); asteroids.splice(i, 1); continue; } // Check for collision with spaceship if (spaceship && asteroid.intersects(spaceship)) { if (spaceship.hasShield) { // Shield protects the spaceship spaceship.deactivateShield(); asteroid.destroy(); asteroids.splice(i, 1); score += 25; // Bonus for destroying asteroid with shield continue; } else { // Game over on collision handleCollision(); return; } } // Check for collision with bullets for (var j = bullets.length - 1; j >= 0; j--) { if (asteroid.intersects(bullets[j])) { asteroid.destroy(); asteroids.splice(i, 1); bullets[j].destroy(); bullets.splice(j, 1); score += 50; // Bonus for destroying asteroid with bullet break; } } } // Update powerups for (var i = powerups.length - 1; i >= 0; i--) { var powerup = powerups[i]; // Apply game speed to movement powerup.speed = powerup.speed * gameSpeed; powerup.update(); powerup.speed = powerup.speed / gameSpeed; // Check if powerup is off screen if (powerup.y > 2732 + 100) { powerup.destroy(); powerups.splice(i, 1); continue; } // Check for collision with spaceship if (spaceship && powerup.intersects(spaceship)) { // Play powerup sound LK.getSound('powerup_collect').play(); // Apply powerup effect if (powerup.type === 0) { // Shield spaceship.activateShield(10000); } else if (powerup.type === 1) { // Slow motion activateSlowMotion(8000); } else { // Blaster spaceship.activateBlaster(12000); } // Remove powerup powerup.destroy(); powerups.splice(i, 1); } } // Update bullets for (var i = bullets.length - 1; i >= 0; i--) { var bullet = bullets[i]; bullet.update(); // Remove bullets that go off screen if (bullet.y < -100) { bullet.destroy(); bullets.splice(i, 1); } } // Fire bullet if spaceship has blaster and space is pressed if (spaceship && spaceship.canShoot && LK.ticks % 15 === 0) { createBullet(); } }; // Initialize the game initGame();
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1", {
highScore: 0
});
/****
* Classes
****/
var Asteroid = Container.expand(function () {
var self = Container.call(this);
var asteroidGraphics = self.attachAsset('asteroid', {
anchorX: 0.5,
anchorY: 0.5
});
// Randomize asteroid appearance
asteroidGraphics.rotation = Math.random() * Math.PI * 2;
var scale = 0.6 + Math.random() * 0.8;
asteroidGraphics.scale.set(scale, scale);
self.speed = 2 + Math.random() * 3;
self.rotationSpeed = (Math.random() - 0.5) * 0.05;
self.width = asteroidGraphics.width * scale;
self.height = asteroidGraphics.height * scale;
self.update = function () {
self.y += self.speed;
asteroidGraphics.rotation += self.rotationSpeed;
};
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 = -8;
self.width = bulletGraphics.width;
self.height = bulletGraphics.height;
self.update = function () {
self.y += self.speed;
};
return self;
});
var PowerUp = Container.expand(function () {
var self = Container.call(this);
var powerupGraphics = self.attachAsset('powerup', {
anchorX: 0.5,
anchorY: 0.5
});
self.type = Math.floor(Math.random() * 3); // 0: shield, 1: slow motion, 2: blaster
// Set color based on powerup type
if (self.type === 0) {
powerupGraphics.tint = 0x3498db; // Blue for shield
} else if (self.type === 1) {
powerupGraphics.tint = 0xf1c40f; // Yellow for slow motion
} else {
powerupGraphics.tint = 0xe74c3c; // Red for blaster
}
self.speed = 1.5 + Math.random() * 1.5;
self.width = powerupGraphics.width;
self.height = powerupGraphics.height;
self.update = function () {
self.y += self.speed;
powerupGraphics.rotation += 0.02;
};
return self;
});
var Spaceship = Container.expand(function () {
var self = Container.call(this);
var shipGraphics = self.attachAsset('spaceship', {
anchorX: 0.5,
anchorY: 0.5
});
self.shield = self.attachAsset('shield', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0
});
self.hasShield = false;
self.canShoot = false;
self.width = shipGraphics.width;
self.height = shipGraphics.height;
self.activateShield = function (duration) {
self.hasShield = true;
self.shield.alpha = 0.5;
// Deactivate shield after duration
LK.setTimeout(function () {
self.deactivateShield();
}, duration);
};
self.deactivateShield = function () {
self.hasShield = false;
self.shield.alpha = 0;
};
self.activateBlaster = function (duration) {
self.canShoot = true;
// Disable blaster after duration
LK.setTimeout(function () {
self.canShoot = false;
}, duration);
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000000
});
/****
* Game Code
****/
game.setBackgroundColor(0x000022); // Deep space blue
// Game variables
var spaceship;
var asteroids = [];
var powerups = [];
var bullets = [];
var score = 0;
var gameSpeed = 1; // Used for slow-motion effect
var lastAsteroidTime = 0;
var lastPowerupTime = 0;
var isSlowMotion = false;
var gameStartTime = Date.now();
var dragNode = null;
// Load high score
var highScore = storage.highScore || 0;
// Create score text
var scoreTxt = new Text2('Score: 0', {
size: 50,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0, 0);
LK.gui.topRight.addChild(scoreTxt);
scoreTxt.x = -250;
scoreTxt.y = 50;
// Create high score text
var highScoreTxt = new Text2('High Score: ' + highScore, {
size: 40,
fill: 0xAAAAAA
});
highScoreTxt.anchor.set(0, 0);
LK.gui.topRight.addChild(highScoreTxt);
highScoreTxt.x = -250;
highScoreTxt.y = 110;
// Initialize game elements
function initGame() {
// Start game music
LK.playMusic('space_music', {
fade: {
start: 0,
end: 0.7,
duration: 1000
}
});
// Reset score
score = 0;
LK.setScore(0);
updateScoreDisplay();
// Reset game speed
gameSpeed = 1;
// Record start time
gameStartTime = Date.now();
// Create spaceship
spaceship = new Spaceship();
spaceship.x = 2048 / 2;
spaceship.y = 2732 - 300;
game.addChild(spaceship);
// Clear existing arrays
clearGameElements();
// Reset timers
lastAsteroidTime = 0;
lastPowerupTime = 0;
}
function clearGameElements() {
// Clear all asteroids
for (var i = asteroids.length - 1; i >= 0; i--) {
asteroids[i].destroy();
}
asteroids = [];
// Clear all powerups
for (var i = powerups.length - 1; i >= 0; i--) {
powerups[i].destroy();
}
powerups = [];
// Clear all bullets
for (var i = bullets.length - 1; i >= 0; i--) {
bullets[i].destroy();
}
bullets = [];
}
function updateScoreDisplay() {
scoreTxt.setText('Score: ' + score);
highScoreTxt.setText('High Score: ' + highScore);
}
function createAsteroid() {
var asteroid = new Asteroid();
asteroid.x = Math.random() * 2048;
asteroid.y = -100;
asteroids.push(asteroid);
game.addChild(asteroid);
}
function createPowerup() {
var powerup = new PowerUp();
powerup.x = 100 + Math.random() * (2048 - 200);
powerup.y = -100;
powerups.push(powerup);
game.addChild(powerup);
}
function createBullet() {
var bullet = new Bullet();
bullet.x = spaceship.x;
bullet.y = spaceship.y - 60;
bullets.push(bullet);
game.addChild(bullet);
LK.getSound('shoot').play();
}
function activateSlowMotion(duration) {
isSlowMotion = true;
gameSpeed = 0.5;
// Return to normal speed after duration
LK.setTimeout(function () {
isSlowMotion = false;
gameSpeed = 1;
}, duration);
}
function handleCollision() {
// Flash the screen red
LK.effects.flashScreen(0xff0000, 500);
// Play explosion sound
LK.getSound('explosion').play();
// Flash the ship
LK.effects.flashObject(spaceship, 0xff0000, 500);
// Store high score
if (score > highScore) {
highScore = score;
storage.highScore = highScore;
updateScoreDisplay();
}
// Show game over
LK.setTimeout(function () {
LK.showGameOver();
}, 500);
}
// Event handlers
function handleMove(x, y, obj) {
if (dragNode) {
// Keep spaceship within game bounds
dragNode.x = Math.max(dragNode.width / 2, Math.min(2048 - dragNode.width / 2, x));
dragNode.y = Math.max(dragNode.height / 2, Math.min(2732 - dragNode.height / 2, y));
}
}
game.move = handleMove;
game.down = function (x, y, obj) {
dragNode = spaceship;
handleMove(x, y, obj);
};
game.up = function (x, y, obj) {
dragNode = null;
};
// Game update function
game.update = function () {
// Increment score based on survival time (10 points per second)
var currentTime = Date.now();
var elapsedSeconds = Math.floor((currentTime - gameStartTime) / 1000);
score = elapsedSeconds * 10;
LK.setScore(score);
updateScoreDisplay();
// Spawn asteroids with increasing frequency
var difficulty = Math.min(10, 1 + Math.floor(elapsedSeconds / 10));
var asteroidInterval = Math.max(30, 60 - difficulty * 5);
if (LK.ticks - lastAsteroidTime > asteroidInterval / gameSpeed) {
createAsteroid();
lastAsteroidTime = LK.ticks;
}
// Occasionally spawn power-ups
if (LK.ticks - lastPowerupTime > 300 / gameSpeed && Math.random() < 0.01) {
createPowerup();
lastPowerupTime = LK.ticks;
}
// Update asteroids
for (var i = asteroids.length - 1; i >= 0; i--) {
var asteroid = asteroids[i];
// Increase asteroid speed every 100 points
if (score % 100 === 0 && score !== 0) {
asteroid.speed += 0.5;
}
// Apply game speed to movement
asteroid.speed = asteroid.speed * gameSpeed;
asteroid.update();
asteroid.speed = asteroid.speed / gameSpeed;
// Check if asteroid is off screen
if (asteroid.y > 2732 + 100) {
asteroid.destroy();
asteroids.splice(i, 1);
continue;
}
// Check for collision with spaceship
if (spaceship && asteroid.intersects(spaceship)) {
if (spaceship.hasShield) {
// Shield protects the spaceship
spaceship.deactivateShield();
asteroid.destroy();
asteroids.splice(i, 1);
score += 25; // Bonus for destroying asteroid with shield
continue;
} else {
// Game over on collision
handleCollision();
return;
}
}
// Check for collision with bullets
for (var j = bullets.length - 1; j >= 0; j--) {
if (asteroid.intersects(bullets[j])) {
asteroid.destroy();
asteroids.splice(i, 1);
bullets[j].destroy();
bullets.splice(j, 1);
score += 50; // Bonus for destroying asteroid with bullet
break;
}
}
}
// Update powerups
for (var i = powerups.length - 1; i >= 0; i--) {
var powerup = powerups[i];
// Apply game speed to movement
powerup.speed = powerup.speed * gameSpeed;
powerup.update();
powerup.speed = powerup.speed / gameSpeed;
// Check if powerup is off screen
if (powerup.y > 2732 + 100) {
powerup.destroy();
powerups.splice(i, 1);
continue;
}
// Check for collision with spaceship
if (spaceship && powerup.intersects(spaceship)) {
// Play powerup sound
LK.getSound('powerup_collect').play();
// Apply powerup effect
if (powerup.type === 0) {
// Shield
spaceship.activateShield(10000);
} else if (powerup.type === 1) {
// Slow motion
activateSlowMotion(8000);
} else {
// Blaster
spaceship.activateBlaster(12000);
}
// Remove powerup
powerup.destroy();
powerups.splice(i, 1);
}
}
// Update bullets
for (var i = bullets.length - 1; i >= 0; i--) {
var bullet = bullets[i];
bullet.update();
// Remove bullets that go off screen
if (bullet.y < -100) {
bullet.destroy();
bullets.splice(i, 1);
}
}
// Fire bullet if spaceship has blaster and space is pressed
if (spaceship && spaceship.canShoot && LK.ticks % 15 === 0) {
createBullet();
}
};
// Initialize the game
initGame();