/****
* 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