/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ var Asteroid = Container.expand(function () { var self = Container.call(this); var size = Math.random() * 0.7 + 0.3; // Random size between 0.3 and 1.0 var asteroidGraphics = self.attachAsset('asteroid', { anchorX: 0.5, anchorY: 0.5, scaleX: size, scaleY: size }); // Random asteroid color variations (brownish) var colorVariation = Math.floor(Math.random() * 3); if (colorVariation === 0) { asteroidGraphics.tint = 0x8B4513; // Standard brown } else if (colorVariation === 1) { asteroidGraphics.tint = 0xA0522D; // Lighter brown } else { asteroidGraphics.tint = 0x704214; // Darker brown } // Set properties self.radius = 60 * size; // Collision radius self.speed = Math.random() * 3 + 1; // Random speed self.rotationSpeed = (Math.random() - 0.5) * 0.05; // Random rotation self.vx = Math.random() * 2 - 1; // Random x velocity self.vy = Math.random() * 2 - 1; // Random y velocity // Normalize velocity vector var length = Math.sqrt(self.vx * self.vx + self.vy * self.vy); self.vx /= length; self.vy /= length; // Scale velocity by speed self.vx *= self.speed; self.vy *= self.speed; self.update = function () { // Move asteroid self.x += self.vx; self.y += self.vy; // Rotate asteroid self.rotation += self.rotationSpeed; // Check for collision with bullets for (var i = bullets.length - 1; i >= 0; i--) { var bullet = bullets[i]; var dx = self.x - bullet.x; var dy = self.y - bullet.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < self.radius) { // Play explosion sound LK.getSound('explosion').play(); // Flash screen LK.effects.flashScreen(0xff0000, 500); // Destroy asteroid and bullet self.destroy(); bullet.destroy(); bullets.splice(i, 1); return; } } // Wrap around screen if (self.x < -self.radius) { self.x = 2048 + self.radius; } if (self.x > 2048 + self.radius) { self.x = -self.radius; } if (self.y < -self.radius) { self.y = 2732 + self.radius; } if (self.y > 2732 + self.radius) { self.y = -self.radius; } }; return self; }); var Bullet = Container.expand(function () { var self = Container.call(this); var bulletGraphics = self.attachAsset('bullet', { anchorX: 0.5, anchorY: 0.5 }); self.vx = 0; self.vy = 0; self.update = function () { self.x += self.vx; self.y += self.vy; // Check if bullet is out of bounds and destroy it if (self.x < 0 || self.x > 2048 || self.y < 0 || self.y > 2732) { self.destroy(); } }; return self; }); var ControlButton = Container.expand(function (type) { var self = Container.call(this); // Button properties self.type = type; // 'left', 'right', or 'boost' var color = type === 'boost' ? 0xff3300 : 0x3366ff; var width = type === 'boost' ? 200 : 150; var height = 150; // Create button shape var buttonShape = LK.getAsset('ship', { anchorX: 0.5, anchorY: 0.5, width: width, height: height }); buttonShape.tint = color; buttonShape.alpha = 0.5; // Add button to container self.addChild(buttonShape); // Add text label var label = new Text2(type.toUpperCase(), { size: 40, fill: 0xFFFFFF }); label.anchor.set(0.5, 0.5); self.addChild(label); // Button state self.isPressed = false; // Handle button press self.down = function (x, y, obj) { self.isPressed = true; buttonShape.alpha = 0.8; if (self.type === 'shoot') { ship.shoot(); } }; // Handle button release self.up = function (x, y, obj) { self.isPressed = false; buttonShape.alpha = 0.5; }; return self; }); var Ship = Container.expand(function () { var self = Container.call(this); // Ship graphics var shipGraphics = self.attachAsset('ship', { anchorX: 0.5, anchorY: 0.5 }); // Make ship triangular shipGraphics.width = 60; shipGraphics.height = 80; // Boost flame var boostFlame = self.attachAsset('boostFlame', { anchorX: 0.5, anchorY: 0, x: 0, y: 40, // Position at bottom of ship alpha: 0 // Hidden initially }); // Ship properties self.vx = 0; self.vy = 0; self.speed = 0; self.maxSpeed = 7; self.rotationSpeed = 0.08; // Radians per tick self.acceleration = 0.1; self.friction = 0.98; self.boosting = false; self.radius = 30; // Collision radius self.startBoosting = function () { self.boosting = true; boostFlame.alpha = 1; LK.getSound('boost').play(); }; self.stopBoosting = function () { self.boosting = false; boostFlame.alpha = 0; }; self.rotateLeft = function () { self.rotation -= self.rotationSpeed; LK.getSound('rotate').play(); }; self.rotateRight = function () { self.rotation += self.rotationSpeed; LK.getSound('rotate').play(); }; self.update = function () { // Apply boost if active if (self.boosting) { // Calculate direction from rotation self.vx += Math.sin(self.rotation) * self.acceleration; self.vy -= Math.cos(self.rotation) * self.acceleration; // Animate flame boostFlame.alpha = 0.6 + Math.random() * 0.4; boostFlame.scaleX = 0.8 + Math.random() * 0.4; boostFlame.scaleY = 0.8 + Math.random() * 0.4; } // Apply friction self.vx *= self.friction; self.vy *= self.friction; // Calculate speed self.speed = Math.sqrt(self.vx * self.vx + self.vy * self.vy); // Cap speed if (self.speed > self.maxSpeed) { self.vx = self.vx / self.speed * self.maxSpeed; self.vy = self.vy / self.speed * self.maxSpeed; self.speed = self.maxSpeed; } // Move ship self.x += self.vx; self.y += self.vy; // Wrap around screen if (self.x < 0) { self.x = 2048; } if (self.x > 2048) { self.x = 0; } if (self.y < 0) { self.y = 2732; } if (self.y > 2732) { self.y = 0; } }; self.shoot = function () { var bullet = new Bullet(); bullet.x = self.x; bullet.y = self.y; bullet.vx = Math.sin(self.rotation) * 10; bullet.vy = -Math.cos(self.rotation) * 10; bullets.push(bullet); game.addChild(bullet); }; return self; }); var Star = Container.expand(function () { var self = Container.call(this); var size = Math.random() * 0.5 + 0.5; var brightness = Math.floor(Math.random() * 230) + 25; // Random brightness var color = brightness << 16 | brightness << 8 | brightness; // Grayscale color var starGraphics = self.attachAsset('star', { anchorX: 0.5, anchorY: 0.5, scaleX: size, scaleY: size, alpha: Math.random() * 0.7 + 0.3 }); starGraphics.tint = color; // Twinkle effect self.twinkleSpeed = Math.random() * 0.02 + 0.01; self.twinkleAmount = Math.random() * 0.3 + 0.1; self.twinkleOffset = Math.random() * Math.PI * 2; self.update = function () { // Make stars twinkle starGraphics.alpha = 0.4 + Math.sin(LK.ticks * self.twinkleSpeed + self.twinkleOffset) * self.twinkleAmount; }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000022 }); /**** * Game Code ****/ // Game variables var ship; var bullets = []; // Array to track bullets var asteroids = []; var stars = []; var gameActive = true; var difficultyTimer; var spawnTimer; var maxAsteroids = 10; var score = 0; var highScore = storage.highScore || 0; var lastSpawnTime = 0; var spawnInterval = 1500; // Milliseconds between asteroid spawns var difficultyInterval = 10000; // Milliseconds between difficulty increases var controlButtons = {}; // Score text var scoreTxt = new Text2("SCORE: 0", { size: 60, fill: 0xFFFFFF }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); // High score text var highScoreTxt = new Text2("BEST: " + highScore, { size: 40, fill: 0xAAAAAA }); highScoreTxt.anchor.set(0.5, 0); highScoreTxt.y = 70; // Position below score text LK.gui.top.addChild(highScoreTxt); // Create stars in background function createStars() { // Add a large solar system image as the background var solarSystem = LK.getAsset('Solar_system', { anchorX: 0.5, anchorY: 0.5, scaleX: 20, // Scale to make it big scaleY: 20, // Scale to make it big x: 2048 / 2, // Center horizontally y: 2732 / 2 // Center vertically }); game.addChild(solarSystem); for (var i = 0; i < 100; i++) { var star = new Star(); star.x = Math.random() * 2048; star.y = Math.random() * 2732; stars.push(star); game.addChild(star); } } // Create player ship function createShip() { ship = new Ship(); ship.x = 2048 / 2; ship.y = 2732 / 2; game.addChild(ship); } // Create control buttons function createControls() { // Left rotation button controlButtons.left = new ControlButton('left'); controlButtons.left.x = 150; controlButtons.left.y = 2732 - 150; game.addChild(controlButtons.left); // Right rotation button controlButtons.right = new ControlButton('right'); controlButtons.right.x = 350; controlButtons.right.y = 2732 - 150; game.addChild(controlButtons.right); // Boost button controlButtons.boost = new ControlButton('boost'); controlButtons.boost.x = 2048 - 150; controlButtons.boost.y = 2732 - 150; game.addChild(controlButtons.boost); // Shoot button controlButtons.shoot = new ControlButton('shoot'); controlButtons.shoot.x = 2048 - 350; controlButtons.shoot.y = 2732 - 150; game.addChild(controlButtons.shoot); } // Spawn a new asteroid function spawnAsteroid() { if (asteroids.length >= maxAsteroids) { return; } var asteroid = new Asteroid(); // Spawn asteroid off-screen var side = Math.floor(Math.random() * 4); switch (side) { case 0: // Top asteroid.x = Math.random() * 2048; asteroid.y = -asteroid.radius; asteroid.vy = Math.abs(asteroid.vy); break; case 1: // Right asteroid.x = 2048 + asteroid.radius; asteroid.y = Math.random() * 2732; asteroid.vx = -Math.abs(asteroid.vx); break; case 2: // Bottom asteroid.x = Math.random() * 2048; asteroid.y = 2732 + asteroid.radius; asteroid.vy = -Math.abs(asteroid.vy); break; case 3: // Left asteroid.x = -asteroid.radius; asteroid.y = Math.random() * 2732; asteroid.vx = Math.abs(asteroid.vx); break; } asteroids.push(asteroid); game.addChild(asteroid); } // Check for collisions between ship and asteroids function checkCollisions() { if (!ship) { return; } for (var i = 0; i < asteroids.length; i++) { var asteroid = asteroids[i]; // Calculate distance between ship and asteroid var dx = ship.x - asteroid.x; var dy = ship.y - asteroid.y; var distance = Math.sqrt(dx * dx + dy * dy); // Check for collision if (distance < ship.radius + asteroid.radius) { gameOver(); return; } } } // Increase game difficulty function increaseDifficulty() { maxAsteroids += 3; // Increase more asteroids spawnInterval = Math.max(200, spawnInterval - 150); // Faster spawn rate // Increase max speed of ship slightly if (ship) { ship.maxSpeed = Math.min(15, ship.maxSpeed + 0.3); // Faster ship } } // Game over function gameOver() { gameActive = false; // Update high score if (score > highScore) { highScore = score; storage.highScore = highScore; highScoreTxt.setText("BEST: " + highScore); } // Play explosion sound LK.getSound('explosion').play(); // Flash screen LK.effects.flashScreen(0xff0000, 800); // Show game over LK.showGameOver(); } // Initialize game function initGame() { // Reset game state gameActive = true; score = 0; maxAsteroids = 10; spawnInterval = 1500; lastSpawnTime = 0; // Update score display scoreTxt.setText("SCORE: 0"); highScoreTxt.setText("BEST: " + highScore); // Clear existing objects for (var i = 0; i < asteroids.length; i++) { asteroids[i].destroy(); } asteroids = []; // Create game elements createStars(); createShip(); createControls(); // Start difficulty timer difficultyTimer = LK.setInterval(function () { increaseDifficulty(); }, difficultyInterval); // Play background music LK.playMusic('spaceAmbience', { fade: { start: 0, end: 0.5, duration: 1000 } }); } // Handle input game.down = function (x, y, obj) { // Check if we're touching a control button directly // No action needed here as the buttons handle their own press states }; game.up = function (x, y, obj) { // No action needed here as the buttons handle their own release states }; // Main game update loop game.update = function () { if (!gameActive) { return; } // Update score (based on survival time) if (LK.ticks % 60 === 0) { // Once per second score++; scoreTxt.setText("SCORE: " + score); } // Check control buttons if (controlButtons.left && controlButtons.left.isPressed) { ship.rotateLeft(); } if (controlButtons.right && controlButtons.right.isPressed) { ship.rotateRight(); } if (controlButtons.boost && controlButtons.boost.isPressed) { ship.startBoosting(); } else if (ship) { ship.stopBoosting(); } // Shoot bullets // Shooting is now manual, handled by button press events // Spawn new asteroids on a timer var currentTime = Date.now(); if (currentTime - lastSpawnTime > spawnInterval) { spawnAsteroid(); lastSpawnTime = currentTime; } // Check for collisions checkCollisions(); }; // Initialize game initGame();
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var Asteroid = Container.expand(function () {
var self = Container.call(this);
var size = Math.random() * 0.7 + 0.3; // Random size between 0.3 and 1.0
var asteroidGraphics = self.attachAsset('asteroid', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: size,
scaleY: size
});
// Random asteroid color variations (brownish)
var colorVariation = Math.floor(Math.random() * 3);
if (colorVariation === 0) {
asteroidGraphics.tint = 0x8B4513; // Standard brown
} else if (colorVariation === 1) {
asteroidGraphics.tint = 0xA0522D; // Lighter brown
} else {
asteroidGraphics.tint = 0x704214; // Darker brown
}
// Set properties
self.radius = 60 * size; // Collision radius
self.speed = Math.random() * 3 + 1; // Random speed
self.rotationSpeed = (Math.random() - 0.5) * 0.05; // Random rotation
self.vx = Math.random() * 2 - 1; // Random x velocity
self.vy = Math.random() * 2 - 1; // Random y velocity
// Normalize velocity vector
var length = Math.sqrt(self.vx * self.vx + self.vy * self.vy);
self.vx /= length;
self.vy /= length;
// Scale velocity by speed
self.vx *= self.speed;
self.vy *= self.speed;
self.update = function () {
// Move asteroid
self.x += self.vx;
self.y += self.vy;
// Rotate asteroid
self.rotation += self.rotationSpeed;
// Check for collision with bullets
for (var i = bullets.length - 1; i >= 0; i--) {
var bullet = bullets[i];
var dx = self.x - bullet.x;
var dy = self.y - bullet.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < self.radius) {
// Play explosion sound
LK.getSound('explosion').play();
// Flash screen
LK.effects.flashScreen(0xff0000, 500);
// Destroy asteroid and bullet
self.destroy();
bullet.destroy();
bullets.splice(i, 1);
return;
}
}
// Wrap around screen
if (self.x < -self.radius) {
self.x = 2048 + self.radius;
}
if (self.x > 2048 + self.radius) {
self.x = -self.radius;
}
if (self.y < -self.radius) {
self.y = 2732 + self.radius;
}
if (self.y > 2732 + self.radius) {
self.y = -self.radius;
}
};
return self;
});
var Bullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('bullet', {
anchorX: 0.5,
anchorY: 0.5
});
self.vx = 0;
self.vy = 0;
self.update = function () {
self.x += self.vx;
self.y += self.vy;
// Check if bullet is out of bounds and destroy it
if (self.x < 0 || self.x > 2048 || self.y < 0 || self.y > 2732) {
self.destroy();
}
};
return self;
});
var ControlButton = Container.expand(function (type) {
var self = Container.call(this);
// Button properties
self.type = type; // 'left', 'right', or 'boost'
var color = type === 'boost' ? 0xff3300 : 0x3366ff;
var width = type === 'boost' ? 200 : 150;
var height = 150;
// Create button shape
var buttonShape = LK.getAsset('ship', {
anchorX: 0.5,
anchorY: 0.5,
width: width,
height: height
});
buttonShape.tint = color;
buttonShape.alpha = 0.5;
// Add button to container
self.addChild(buttonShape);
// Add text label
var label = new Text2(type.toUpperCase(), {
size: 40,
fill: 0xFFFFFF
});
label.anchor.set(0.5, 0.5);
self.addChild(label);
// Button state
self.isPressed = false;
// Handle button press
self.down = function (x, y, obj) {
self.isPressed = true;
buttonShape.alpha = 0.8;
if (self.type === 'shoot') {
ship.shoot();
}
};
// Handle button release
self.up = function (x, y, obj) {
self.isPressed = false;
buttonShape.alpha = 0.5;
};
return self;
});
var Ship = Container.expand(function () {
var self = Container.call(this);
// Ship graphics
var shipGraphics = self.attachAsset('ship', {
anchorX: 0.5,
anchorY: 0.5
});
// Make ship triangular
shipGraphics.width = 60;
shipGraphics.height = 80;
// Boost flame
var boostFlame = self.attachAsset('boostFlame', {
anchorX: 0.5,
anchorY: 0,
x: 0,
y: 40,
// Position at bottom of ship
alpha: 0 // Hidden initially
});
// Ship properties
self.vx = 0;
self.vy = 0;
self.speed = 0;
self.maxSpeed = 7;
self.rotationSpeed = 0.08; // Radians per tick
self.acceleration = 0.1;
self.friction = 0.98;
self.boosting = false;
self.radius = 30; // Collision radius
self.startBoosting = function () {
self.boosting = true;
boostFlame.alpha = 1;
LK.getSound('boost').play();
};
self.stopBoosting = function () {
self.boosting = false;
boostFlame.alpha = 0;
};
self.rotateLeft = function () {
self.rotation -= self.rotationSpeed;
LK.getSound('rotate').play();
};
self.rotateRight = function () {
self.rotation += self.rotationSpeed;
LK.getSound('rotate').play();
};
self.update = function () {
// Apply boost if active
if (self.boosting) {
// Calculate direction from rotation
self.vx += Math.sin(self.rotation) * self.acceleration;
self.vy -= Math.cos(self.rotation) * self.acceleration;
// Animate flame
boostFlame.alpha = 0.6 + Math.random() * 0.4;
boostFlame.scaleX = 0.8 + Math.random() * 0.4;
boostFlame.scaleY = 0.8 + Math.random() * 0.4;
}
// Apply friction
self.vx *= self.friction;
self.vy *= self.friction;
// Calculate speed
self.speed = Math.sqrt(self.vx * self.vx + self.vy * self.vy);
// Cap speed
if (self.speed > self.maxSpeed) {
self.vx = self.vx / self.speed * self.maxSpeed;
self.vy = self.vy / self.speed * self.maxSpeed;
self.speed = self.maxSpeed;
}
// Move ship
self.x += self.vx;
self.y += self.vy;
// Wrap around screen
if (self.x < 0) {
self.x = 2048;
}
if (self.x > 2048) {
self.x = 0;
}
if (self.y < 0) {
self.y = 2732;
}
if (self.y > 2732) {
self.y = 0;
}
};
self.shoot = function () {
var bullet = new Bullet();
bullet.x = self.x;
bullet.y = self.y;
bullet.vx = Math.sin(self.rotation) * 10;
bullet.vy = -Math.cos(self.rotation) * 10;
bullets.push(bullet);
game.addChild(bullet);
};
return self;
});
var Star = Container.expand(function () {
var self = Container.call(this);
var size = Math.random() * 0.5 + 0.5;
var brightness = Math.floor(Math.random() * 230) + 25; // Random brightness
var color = brightness << 16 | brightness << 8 | brightness; // Grayscale color
var starGraphics = self.attachAsset('star', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: size,
scaleY: size,
alpha: Math.random() * 0.7 + 0.3
});
starGraphics.tint = color;
// Twinkle effect
self.twinkleSpeed = Math.random() * 0.02 + 0.01;
self.twinkleAmount = Math.random() * 0.3 + 0.1;
self.twinkleOffset = Math.random() * Math.PI * 2;
self.update = function () {
// Make stars twinkle
starGraphics.alpha = 0.4 + Math.sin(LK.ticks * self.twinkleSpeed + self.twinkleOffset) * self.twinkleAmount;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000022
});
/****
* Game Code
****/
// Game variables
var ship;
var bullets = []; // Array to track bullets
var asteroids = [];
var stars = [];
var gameActive = true;
var difficultyTimer;
var spawnTimer;
var maxAsteroids = 10;
var score = 0;
var highScore = storage.highScore || 0;
var lastSpawnTime = 0;
var spawnInterval = 1500; // Milliseconds between asteroid spawns
var difficultyInterval = 10000; // Milliseconds between difficulty increases
var controlButtons = {};
// Score text
var scoreTxt = new Text2("SCORE: 0", {
size: 60,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// High score text
var highScoreTxt = new Text2("BEST: " + highScore, {
size: 40,
fill: 0xAAAAAA
});
highScoreTxt.anchor.set(0.5, 0);
highScoreTxt.y = 70; // Position below score text
LK.gui.top.addChild(highScoreTxt);
// Create stars in background
function createStars() {
// Add a large solar system image as the background
var solarSystem = LK.getAsset('Solar_system', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 20,
// Scale to make it big
scaleY: 20,
// Scale to make it big
x: 2048 / 2,
// Center horizontally
y: 2732 / 2 // Center vertically
});
game.addChild(solarSystem);
for (var i = 0; i < 100; i++) {
var star = new Star();
star.x = Math.random() * 2048;
star.y = Math.random() * 2732;
stars.push(star);
game.addChild(star);
}
}
// Create player ship
function createShip() {
ship = new Ship();
ship.x = 2048 / 2;
ship.y = 2732 / 2;
game.addChild(ship);
}
// Create control buttons
function createControls() {
// Left rotation button
controlButtons.left = new ControlButton('left');
controlButtons.left.x = 150;
controlButtons.left.y = 2732 - 150;
game.addChild(controlButtons.left);
// Right rotation button
controlButtons.right = new ControlButton('right');
controlButtons.right.x = 350;
controlButtons.right.y = 2732 - 150;
game.addChild(controlButtons.right);
// Boost button
controlButtons.boost = new ControlButton('boost');
controlButtons.boost.x = 2048 - 150;
controlButtons.boost.y = 2732 - 150;
game.addChild(controlButtons.boost);
// Shoot button
controlButtons.shoot = new ControlButton('shoot');
controlButtons.shoot.x = 2048 - 350;
controlButtons.shoot.y = 2732 - 150;
game.addChild(controlButtons.shoot);
}
// Spawn a new asteroid
function spawnAsteroid() {
if (asteroids.length >= maxAsteroids) {
return;
}
var asteroid = new Asteroid();
// Spawn asteroid off-screen
var side = Math.floor(Math.random() * 4);
switch (side) {
case 0:
// Top
asteroid.x = Math.random() * 2048;
asteroid.y = -asteroid.radius;
asteroid.vy = Math.abs(asteroid.vy);
break;
case 1:
// Right
asteroid.x = 2048 + asteroid.radius;
asteroid.y = Math.random() * 2732;
asteroid.vx = -Math.abs(asteroid.vx);
break;
case 2:
// Bottom
asteroid.x = Math.random() * 2048;
asteroid.y = 2732 + asteroid.radius;
asteroid.vy = -Math.abs(asteroid.vy);
break;
case 3:
// Left
asteroid.x = -asteroid.radius;
asteroid.y = Math.random() * 2732;
asteroid.vx = Math.abs(asteroid.vx);
break;
}
asteroids.push(asteroid);
game.addChild(asteroid);
}
// Check for collisions between ship and asteroids
function checkCollisions() {
if (!ship) {
return;
}
for (var i = 0; i < asteroids.length; i++) {
var asteroid = asteroids[i];
// Calculate distance between ship and asteroid
var dx = ship.x - asteroid.x;
var dy = ship.y - asteroid.y;
var distance = Math.sqrt(dx * dx + dy * dy);
// Check for collision
if (distance < ship.radius + asteroid.radius) {
gameOver();
return;
}
}
}
// Increase game difficulty
function increaseDifficulty() {
maxAsteroids += 3; // Increase more asteroids
spawnInterval = Math.max(200, spawnInterval - 150); // Faster spawn rate
// Increase max speed of ship slightly
if (ship) {
ship.maxSpeed = Math.min(15, ship.maxSpeed + 0.3); // Faster ship
}
}
// Game over
function gameOver() {
gameActive = false;
// Update high score
if (score > highScore) {
highScore = score;
storage.highScore = highScore;
highScoreTxt.setText("BEST: " + highScore);
}
// Play explosion sound
LK.getSound('explosion').play();
// Flash screen
LK.effects.flashScreen(0xff0000, 800);
// Show game over
LK.showGameOver();
}
// Initialize game
function initGame() {
// Reset game state
gameActive = true;
score = 0;
maxAsteroids = 10;
spawnInterval = 1500;
lastSpawnTime = 0;
// Update score display
scoreTxt.setText("SCORE: 0");
highScoreTxt.setText("BEST: " + highScore);
// Clear existing objects
for (var i = 0; i < asteroids.length; i++) {
asteroids[i].destroy();
}
asteroids = [];
// Create game elements
createStars();
createShip();
createControls();
// Start difficulty timer
difficultyTimer = LK.setInterval(function () {
increaseDifficulty();
}, difficultyInterval);
// Play background music
LK.playMusic('spaceAmbience', {
fade: {
start: 0,
end: 0.5,
duration: 1000
}
});
}
// Handle input
game.down = function (x, y, obj) {
// Check if we're touching a control button directly
// No action needed here as the buttons handle their own press states
};
game.up = function (x, y, obj) {
// No action needed here as the buttons handle their own release states
};
// Main game update loop
game.update = function () {
if (!gameActive) {
return;
}
// Update score (based on survival time)
if (LK.ticks % 60 === 0) {
// Once per second
score++;
scoreTxt.setText("SCORE: " + score);
}
// Check control buttons
if (controlButtons.left && controlButtons.left.isPressed) {
ship.rotateLeft();
}
if (controlButtons.right && controlButtons.right.isPressed) {
ship.rotateRight();
}
if (controlButtons.boost && controlButtons.boost.isPressed) {
ship.startBoosting();
} else if (ship) {
ship.stopBoosting();
}
// Shoot bullets
// Shooting is now manual, handled by button press events
// Spawn new asteroids on a timer
var currentTime = Date.now();
if (currentTime - lastSpawnTime > spawnInterval) {
spawnAsteroid();
lastSpawnTime = currentTime;
}
// Check for collisions
checkCollisions();
};
// Initialize game
initGame();
Spaceship. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
Asteroid. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
Spaceship bullet. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows
Solar system. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows