User prompt
Add solar system in background BIG
User prompt
add a explosion effect when destroyed and make asteroid can be destroyed
User prompt
Please fix the bug: 'ReferenceError: bullets is not defined' in or related to this line: 'for (var i = bullets.length - 1; i >= 0; i--) {' Line Number: 535
User prompt
Please fix the bug: 'TypeError: Graphics is not a constructor' in or related to this line: 'var healthBarBackground = new Graphics();' Line Number: 59
User prompt
Add hp bar to asteroid, and add a explosion effect when destroyed
User prompt
Make asset rotate like the bullet rotation
User prompt
So many bullets, make click manual
User prompt
Please fix the bug: 'ReferenceError: Bullet is not defined' in or related to this line: 'var bullet = new Bullet();' Line Number: 201
User prompt
Add a shoot button And make the game HARDER!!!!!
Code edit (1 edits merged)
Please save this source code
User prompt
AsteVoid: Space Survival
Initial prompt
Astevoid a game of a ship dodging asteroids, press left to turn left, and right to turn right. hold boost to move the ship in rotation. scenario: solar system.
/**** 
* 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(); ===================================================================
--- original.js
+++ change.js
@@ -299,8 +299,21 @@
 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;
 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