/**** * 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 asteroidGraphics = self.attachAsset('asteroid', { anchorX: 0.5, anchorY: 0.5 }); // Movement properties self.speedX = 0; self.speedY = 0; self.rotationSpeed = 0; self.setup = function (speedX, speedY, rotSpeed) { self.speedX = speedX || Math.random() * 4 - 2; self.speedY = speedY || Math.random() * 4 - 2; self.rotationSpeed = rotSpeed || Math.random() * 0.1 - 0.05; }; self.update = function () { self.x += self.speedX; self.y += self.speedY; asteroidGraphics.rotation += self.rotationSpeed; // Wrap around screen if (self.x < -50) { self.x = 2048 + 50; } if (self.x > 2048 + 50) { self.x = -50; } if (self.y < -50) { self.y = 2732 + 50; } if (self.y > 2732 + 50) { self.y = -50; } }; return self; }); var Astronaut = Container.expand(function () { var self = Container.call(this); // Astronaut graphics var astronautGraphics = self.attachAsset('astronaut', { anchorX: 0.5, anchorY: 0.5 }); // Physics properties self.velocityX = 0; self.velocityY = 0; self.gravity = 0.2; self.bounce = 0.8; self.isOnPlanet = false; self.jumpStrength = -10; self.maxVelocity = 15; // Jump when touching a planet self.jump = function () { if (self.isOnPlanet) { self.velocityY = self.jumpStrength; self.isOnPlanet = false; LK.getSound('bounce').play(); // Visual feedback tween(astronautGraphics, { scaleX: 1.3, scaleY: 0.7 }, { duration: 100, onFinish: function onFinish() { tween(astronautGraphics, { scaleX: 1, scaleY: 1 }, { duration: 200, easing: tween.easeOut }); } }); } }; // Update physics self.update = function () { // Apply gravity if (!self.isOnPlanet) { self.velocityY += self.gravity; } // Limit velocity if (self.velocityY > self.maxVelocity) { self.velocityY = self.maxVelocity; } if (self.velocityY < -self.maxVelocity) { self.velocityY = -self.maxVelocity; } if (self.velocityX > self.maxVelocity) { self.velocityX = self.maxVelocity; } if (self.velocityX < -self.maxVelocity) { self.velocityX = -self.maxVelocity; } // Apply movement self.x += self.velocityX; self.y += self.velocityY; // Screen boundaries if (self.x < 50) { self.x = 50; self.velocityX *= -self.bounce; } else if (self.x > 2048 - 50) { self.x = 2048 - 50; self.velocityX *= -self.bounce; } if (self.y < 50) { self.y = 50; self.velocityY *= -self.bounce; } else if (self.y > 2732 - 50) { self.y = 2732 - 50; self.velocityY *= -self.bounce; self.isOnPlanet = true; // Touching bottom of screen counts as being on a surface } // Visual rotation based on movement astronautGraphics.rotation += self.velocityX * 0.01; }; return self; }); var Planet = Container.expand(function () { var self = Container.call(this); var planetGraphics = self.attachAsset('planet', { anchorX: 0.5, anchorY: 0.5 }); self.radius = 100; // Default radius self.setSize = function (size) { self.radius = size / 2; planetGraphics.scale.set(size / 200); }; 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 = "jump"; // Default type self.setType = function (powerupType) { self.type = powerupType; // Different colors for different power-ups switch (powerupType) { case "jump": powerupGraphics.tint = 0x00FF00; // Green break; case "slow": powerupGraphics.tint = 0x0000FF; // Blue break; case "shield": powerupGraphics.tint = 0xFF0000; // Red break; } }; self.update = function () { // Float effect self.y += Math.sin(LK.ticks * 0.05) * 0.5; // Rotate slowly powerupGraphics.rotation += 0.01; }; return self; }); var SpaceStation = Container.expand(function () { var self = Container.call(this); var stationGraphics = self.attachAsset('spaceStation', { anchorX: 0.5, anchorY: 0.5 }); self.update = function () { // Subtle hover effect self.y += Math.sin(LK.ticks * 0.02) * 0.3; }; return self; }); var Stardust = Container.expand(function () { var self = Container.call(this); var stardustGraphics = self.attachAsset('stardust', { anchorX: 0.5, anchorY: 0.5 }); // Animate stardust to make it sparkle self.update = function () { stardustGraphics.rotation += 0.01; // Pulsating effect if (!self.pulseDirection) { self.pulseDirection = 1; } stardustGraphics.alpha += 0.01 * self.pulseDirection; if (stardustGraphics.alpha >= 1) { stardustGraphics.alpha = 1; self.pulseDirection = -1; } else if (stardustGraphics.alpha <= 0.6) { stardustGraphics.alpha = 0.6; self.pulseDirection = 1; } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000022 // Dark space background }); /**** * Game Code ****/ // Game state variables var level = 1; var stardustCollected = 0; var totalStardustNeeded = 10; var gameActive = true; var playerHasShield = false; // Game objects var astronaut; var planets = []; var stardusts = []; var asteroids = []; var powerups = []; var spaceStation; // UI elements var scoreTxt; var levelTxt; var instructionsTxt; // Initialize game entities function initGame() { // Reset game state gameActive = true; stardustCollected = 0; playerHasShield = false; // Clear previous objects clearGameObjects(); // Create astronaut astronaut = new Astronaut(); astronaut.x = 1024; astronaut.y = 2300; game.addChild(astronaut); // Create planets based on level createPlanets(); // Create stardust createStardust(); // Create asteroids createAsteroids(); // Create power-ups createPowerUps(); // Create space station (goal) spaceStation = new SpaceStation(); spaceStation.x = 1024; spaceStation.y = 200; game.addChild(spaceStation); // Create UI createUI(); // Play background music LK.playMusic('spaceBgm'); } // Clear all game objects function clearGameObjects() { // Remove all existing objects for (var i = game.children.length - 1; i >= 0; i--) { game.removeChild(game.children[i]); } planets = []; stardusts = []; asteroids = []; powerups = []; } // Create planets based on current level function createPlanets() { // Basic level layouts var layouts = [ // Level 1: Simple layout [{ x: 500, y: 1300, size: 300 }, { x: 1500, y: 1800, size: 250 }, { x: 1200, y: 800, size: 200 }], // Level 2: More complex [{ x: 400, y: 1400, size: 200 }, { x: 1600, y: 1600, size: 200 }, { x: 1000, y: 1000, size: 180 }, { x: 600, y: 600, size: 150 }], // Level 3: Advanced [{ x: 300, y: 1500, size: 150 }, { x: 800, y: 1800, size: 150 }, { x: 1300, y: 1600, size: 150 }, { x: 1700, y: 1200, size: 150 }, { x: 500, y: 900, size: 150 }, { x: 1200, y: 700, size: 150 }]]; // Use appropriate layout or generate random one for higher levels var planetData = level <= layouts.length ? layouts[level - 1] : generateRandomPlanets(); // Create planets for (var i = 0; i < planetData.length; i++) { var planet = new Planet(); planet.x = planetData[i].x; planet.y = planetData[i].y; planet.setSize(planetData[i].size); planets.push(planet); game.addChild(planet); } } // Generate random planets for higher levels function generateRandomPlanets() { var planetData = []; var numPlanets = Math.min(5 + level, 10); // More planets for higher levels, max 10 for (var i = 0; i < numPlanets; i++) { planetData.push({ x: 200 + Math.random() * 1648, // Keep away from edges y: 400 + Math.random() * 1932, // Keep away from top/bottom size: 120 + Math.random() * 150 }); } return planetData; } // Create stardust items function createStardust() { // Increase total stardust needed for higher levels totalStardustNeeded = 10 + (level - 1) * 5; for (var i = 0; i < totalStardustNeeded; i++) { var stardust = new Stardust(); // Place stardust in a random position, but not too close to start or goal var validPosition = false; while (!validPosition) { stardust.x = 100 + Math.random() * 1848; stardust.y = 300 + Math.random() * 2132; // Make sure it's not too close to astronaut start position or space station var distToAstronaut = Math.sqrt(Math.pow(stardust.x - 1024, 2) + Math.pow(stardust.y - 2300, 2)); var distToStation = Math.sqrt(Math.pow(stardust.x - 1024, 2) + Math.pow(stardust.y - 200, 2)); if (distToAstronaut > 300 && distToStation > 400) { validPosition = true; } } stardusts.push(stardust); game.addChild(stardust); } } // Create asteroids based on level function createAsteroids() { var numAsteroids = Math.min(level * 2, 10); // More asteroids for higher levels, max 10 for (var i = 0; i < numAsteroids; i++) { var asteroid = new Asteroid(); asteroid.x = Math.random() * 2048; asteroid.y = Math.random() * 2732; // Make sure asteroids don't start too close to the astronaut var distToAstronaut = Math.sqrt(Math.pow(asteroid.x - 1024, 2) + Math.pow(asteroid.y - 2300, 2)); if (distToAstronaut < 400) { asteroid.x = (asteroid.x + 1024) % 2048; asteroid.y = (asteroid.y + 1366) % 2732; } // Faster asteroids for higher levels var speedMultiplier = 1 + level * 0.2; asteroid.setup((Math.random() * 4 - 2) * speedMultiplier, (Math.random() * 4 - 2) * speedMultiplier, (Math.random() * 0.1 - 0.05) * speedMultiplier); asteroids.push(asteroid); game.addChild(asteroid); } } // Create power-ups function createPowerUps() { var powerupTypes = ["jump", "slow", "shield"]; var numPowerups = Math.min(level, 3); // More power-ups for higher levels, max 3 for (var i = 0; i < numPowerups; i++) { var powerup = new PowerUp(); powerup.x = 200 + Math.random() * 1648; powerup.y = 400 + Math.random() * 1932; powerup.setType(powerupTypes[i % powerupTypes.length]); powerups.push(powerup); game.addChild(powerup); } } // Create UI elements function createUI() { // Score text scoreTxt = new Text2('Stardust: 0/' + totalStardustNeeded, { size: 80, fill: 0xFFD700 }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); // Level text levelTxt = new Text2('Level: ' + level, { size: 80, fill: 0xFFFFFF }); levelTxt.anchor.set(0, 0); levelTxt.x = 120; // Keep away from top-left corner levelTxt.y = 80; LK.gui.topLeft.addChild(levelTxt); // Instructions text instructionsTxt = new Text2('Tap to make the astronaut jump off planets!', { size: 60, fill: 0xCCCCCC }); instructionsTxt.anchor.set(0.5, 0); instructionsTxt.y = 100; LK.gui.top.addChild(instructionsTxt); // Hide instructions after 3 seconds LK.setTimeout(function () { tween(instructionsTxt, { alpha: 0 }, { duration: 1000, easing: tween.easeOut }); }, 3000); } // Update score display function updateScore() { scoreTxt.setText('Stardust: ' + stardustCollected + '/' + totalStardustNeeded); } // Apply power-up effects function applyPowerUp(type) { LK.getSound('powerup').play(); switch (type) { case "jump": // Temporary boost to jump strength var originalJumpStrength = astronaut.jumpStrength; astronaut.jumpStrength *= 1.5; // Flash effect on astronaut LK.effects.flashObject(astronaut, 0x00FF00, 500); // Restore after 5 seconds LK.setTimeout(function () { astronaut.jumpStrength = originalJumpStrength; }, 5000); break; case "slow": // Slow down all asteroids asteroids.forEach(function (asteroid) { asteroid.speedX *= 0.5; asteroid.speedY *= 0.5; asteroid.rotationSpeed *= 0.5; }); // Visual effect LK.effects.flashScreen(0x0000FF, 300); // Reset after 8 seconds LK.setTimeout(function () { asteroids.forEach(function (asteroid) { asteroid.speedX *= 2; asteroid.speedY *= 2; asteroid.rotationSpeed *= 2; }); }, 8000); break; case "shield": // Give player shield for 10 seconds playerHasShield = true; // Visual effect - surround astronaut with a shield var shield = LK.getAsset('astronaut', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.3, scaleY: 1.3, alpha: 0.5, tint: 0xFF0000 }); astronaut.addChild(shield); // Remove shield after 10 seconds LK.setTimeout(function () { playerHasShield = false; astronaut.removeChild(shield); }, 10000); break; } } // Check if astronaut can bounce off a planet function checkPlanetBounce() { astronaut.isOnPlanet = false; for (var i = 0; i < planets.length; i++) { var planet = planets[i]; var dx = astronaut.x - planet.x; var dy = astronaut.y - planet.y; var distance = Math.sqrt(dx * dx + dy * dy); // Check if astronaut is touching planet surface if (distance <= planet.radius + 50) { // 50 is astronaut radius // Calculate bounce direction (normal to planet surface) var nx = dx / distance; var ny = dy / distance; // Project velocity onto normal var dot = astronaut.velocityX * nx + astronaut.velocityY * ny; // Only bounce if moving toward planet if (dot < 0) { // Reflect velocity around normal with dampening (bounce factor) astronaut.velocityX = (astronaut.velocityX - 2 * dot * nx) * astronaut.bounce; astronaut.velocityY = (astronaut.velocityY - 2 * dot * ny) * astronaut.bounce; // Position astronaut just outside planet to prevent sticking astronaut.x = planet.x + nx * (planet.radius + 50); astronaut.y = planet.y + ny * (planet.radius + 50); // Mark as on planet for jumping astronaut.isOnPlanet = true; // Play bounce sound LK.getSound('bounce').play(); // Visual feedback LK.effects.flashObject(planet, 0xFFFFFF, 200); } } } } // Check collisions with stardust function checkStardustCollision() { for (var i = stardusts.length - 1; i >= 0; i--) { if (astronaut.intersects(stardusts[i])) { // Collect stardust stardustCollected++; updateScore(); // Remove stardust game.removeChild(stardusts[i]); stardusts.splice(i, 1); // Play collect sound LK.getSound('collect').play(); // Visual feedback LK.effects.flashObject(astronaut, 0xFFD700, 200); // Check if all stardust collected if (stardustCollected >= totalStardustNeeded) { // Make space station flash to show it's active tween(spaceStation, { alpha: 0.5 }, { duration: 500, easing: tween.easeInOut, onFinish: function onFinish() { tween(spaceStation, { alpha: 1 }, { duration: 500, easing: tween.easeInOut }); } }); } } } } // Check collisions with asteroids function checkAsteroidCollision() { for (var i = 0; i < asteroids.length; i++) { if (astronaut.intersects(asteroids[i])) { if (playerHasShield) { // Shield absorbs hit playerHasShield = false; // Remove shield visual for (var j = 0; j < astronaut.children.length; j++) { if (astronaut.children[j].alpha === 0.5) { astronaut.removeChild(astronaut.children[j]); break; } } // Visual feedback LK.effects.flashObject(astronaut, 0xFF0000, 500); // Push astronaut away astronaut.velocityX = asteroids[i].speedX * 3; astronaut.velocityY = asteroids[i].speedY * 3; } else { // Hit by asteroid - game over LK.getSound('hit').play(); LK.effects.flashScreen(0xFF0000, 1000); gameActive = false; // Show game over after a brief delay LK.setTimeout(function () { LK.showGameOver(); }, 1000); } } } } // Check collisions with power-ups function checkPowerUpCollision() { for (var i = powerups.length - 1; i >= 0; i--) { if (astronaut.intersects(powerups[i])) { var type = powerups[i].type; // Remove power-up game.removeChild(powerups[i]); powerups.splice(i, 1); // Apply power-up effect applyPowerUp(type); } } } // Check if level completed function checkLevelCompletion() { if (stardustCollected >= totalStardustNeeded && astronaut.intersects(spaceStation)) { // Complete level LK.getSound('win').play(); // Visual feedback LK.effects.flashScreen(0x00FF00, 1000); // Level up level++; // Save progress storage.level = level; // Restart with next level LK.setTimeout(function () { if (level > 3) { // Player completed all 3 levels - win the game LK.showYouWin(); } else { // Start next level initGame(); } }, 1500); } } // Handle game input game.down = function (x, y, obj) { if (gameActive) { astronaut.jump(); } }; // Game update loop game.update = function () { if (!gameActive) { return; } // Update game objects if (astronaut) { // Check planet collisions and bouncing checkPlanetBounce(); // Update astronaut physics astronaut.update(); // Check collisions checkStardustCollision(); checkAsteroidCollision(); checkPowerUpCollision(); // Check level completion checkLevelCompletion(); } // Update all objects for (var i = 0; i < stardusts.length; i++) { stardusts[i].update(); } for (var i = 0; i < asteroids.length; i++) { asteroids[i].update(); } for (var i = 0; i < powerups.length; i++) { powerups[i].update(); } if (spaceStation) { spaceStation.update(); } }; // Initialize the game initGame();
===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,690 @@
-/****
+/****
+* 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 asteroidGraphics = self.attachAsset('asteroid', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ // Movement properties
+ self.speedX = 0;
+ self.speedY = 0;
+ self.rotationSpeed = 0;
+ self.setup = function (speedX, speedY, rotSpeed) {
+ self.speedX = speedX || Math.random() * 4 - 2;
+ self.speedY = speedY || Math.random() * 4 - 2;
+ self.rotationSpeed = rotSpeed || Math.random() * 0.1 - 0.05;
+ };
+ self.update = function () {
+ self.x += self.speedX;
+ self.y += self.speedY;
+ asteroidGraphics.rotation += self.rotationSpeed;
+ // Wrap around screen
+ if (self.x < -50) {
+ self.x = 2048 + 50;
+ }
+ if (self.x > 2048 + 50) {
+ self.x = -50;
+ }
+ if (self.y < -50) {
+ self.y = 2732 + 50;
+ }
+ if (self.y > 2732 + 50) {
+ self.y = -50;
+ }
+ };
+ return self;
+});
+var Astronaut = Container.expand(function () {
+ var self = Container.call(this);
+ // Astronaut graphics
+ var astronautGraphics = self.attachAsset('astronaut', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ // Physics properties
+ self.velocityX = 0;
+ self.velocityY = 0;
+ self.gravity = 0.2;
+ self.bounce = 0.8;
+ self.isOnPlanet = false;
+ self.jumpStrength = -10;
+ self.maxVelocity = 15;
+ // Jump when touching a planet
+ self.jump = function () {
+ if (self.isOnPlanet) {
+ self.velocityY = self.jumpStrength;
+ self.isOnPlanet = false;
+ LK.getSound('bounce').play();
+ // Visual feedback
+ tween(astronautGraphics, {
+ scaleX: 1.3,
+ scaleY: 0.7
+ }, {
+ duration: 100,
+ onFinish: function onFinish() {
+ tween(astronautGraphics, {
+ scaleX: 1,
+ scaleY: 1
+ }, {
+ duration: 200,
+ easing: tween.easeOut
+ });
+ }
+ });
+ }
+ };
+ // Update physics
+ self.update = function () {
+ // Apply gravity
+ if (!self.isOnPlanet) {
+ self.velocityY += self.gravity;
+ }
+ // Limit velocity
+ if (self.velocityY > self.maxVelocity) {
+ self.velocityY = self.maxVelocity;
+ }
+ if (self.velocityY < -self.maxVelocity) {
+ self.velocityY = -self.maxVelocity;
+ }
+ if (self.velocityX > self.maxVelocity) {
+ self.velocityX = self.maxVelocity;
+ }
+ if (self.velocityX < -self.maxVelocity) {
+ self.velocityX = -self.maxVelocity;
+ }
+ // Apply movement
+ self.x += self.velocityX;
+ self.y += self.velocityY;
+ // Screen boundaries
+ if (self.x < 50) {
+ self.x = 50;
+ self.velocityX *= -self.bounce;
+ } else if (self.x > 2048 - 50) {
+ self.x = 2048 - 50;
+ self.velocityX *= -self.bounce;
+ }
+ if (self.y < 50) {
+ self.y = 50;
+ self.velocityY *= -self.bounce;
+ } else if (self.y > 2732 - 50) {
+ self.y = 2732 - 50;
+ self.velocityY *= -self.bounce;
+ self.isOnPlanet = true; // Touching bottom of screen counts as being on a surface
+ }
+ // Visual rotation based on movement
+ astronautGraphics.rotation += self.velocityX * 0.01;
+ };
+ return self;
+});
+var Planet = Container.expand(function () {
+ var self = Container.call(this);
+ var planetGraphics = self.attachAsset('planet', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.radius = 100; // Default radius
+ self.setSize = function (size) {
+ self.radius = size / 2;
+ planetGraphics.scale.set(size / 200);
+ };
+ 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 = "jump"; // Default type
+ self.setType = function (powerupType) {
+ self.type = powerupType;
+ // Different colors for different power-ups
+ switch (powerupType) {
+ case "jump":
+ powerupGraphics.tint = 0x00FF00; // Green
+ break;
+ case "slow":
+ powerupGraphics.tint = 0x0000FF; // Blue
+ break;
+ case "shield":
+ powerupGraphics.tint = 0xFF0000; // Red
+ break;
+ }
+ };
+ self.update = function () {
+ // Float effect
+ self.y += Math.sin(LK.ticks * 0.05) * 0.5;
+ // Rotate slowly
+ powerupGraphics.rotation += 0.01;
+ };
+ return self;
+});
+var SpaceStation = Container.expand(function () {
+ var self = Container.call(this);
+ var stationGraphics = self.attachAsset('spaceStation', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.update = function () {
+ // Subtle hover effect
+ self.y += Math.sin(LK.ticks * 0.02) * 0.3;
+ };
+ return self;
+});
+var Stardust = Container.expand(function () {
+ var self = Container.call(this);
+ var stardustGraphics = self.attachAsset('stardust', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ // Animate stardust to make it sparkle
+ self.update = function () {
+ stardustGraphics.rotation += 0.01;
+ // Pulsating effect
+ if (!self.pulseDirection) {
+ self.pulseDirection = 1;
+ }
+ stardustGraphics.alpha += 0.01 * self.pulseDirection;
+ if (stardustGraphics.alpha >= 1) {
+ stardustGraphics.alpha = 1;
+ self.pulseDirection = -1;
+ } else if (stardustGraphics.alpha <= 0.6) {
+ stardustGraphics.alpha = 0.6;
+ self.pulseDirection = 1;
+ }
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x000022 // Dark space background
+});
+
+/****
+* Game Code
+****/
+// Game state variables
+var level = 1;
+var stardustCollected = 0;
+var totalStardustNeeded = 10;
+var gameActive = true;
+var playerHasShield = false;
+// Game objects
+var astronaut;
+var planets = [];
+var stardusts = [];
+var asteroids = [];
+var powerups = [];
+var spaceStation;
+// UI elements
+var scoreTxt;
+var levelTxt;
+var instructionsTxt;
+// Initialize game entities
+function initGame() {
+ // Reset game state
+ gameActive = true;
+ stardustCollected = 0;
+ playerHasShield = false;
+ // Clear previous objects
+ clearGameObjects();
+ // Create astronaut
+ astronaut = new Astronaut();
+ astronaut.x = 1024;
+ astronaut.y = 2300;
+ game.addChild(astronaut);
+ // Create planets based on level
+ createPlanets();
+ // Create stardust
+ createStardust();
+ // Create asteroids
+ createAsteroids();
+ // Create power-ups
+ createPowerUps();
+ // Create space station (goal)
+ spaceStation = new SpaceStation();
+ spaceStation.x = 1024;
+ spaceStation.y = 200;
+ game.addChild(spaceStation);
+ // Create UI
+ createUI();
+ // Play background music
+ LK.playMusic('spaceBgm');
+}
+// Clear all game objects
+function clearGameObjects() {
+ // Remove all existing objects
+ for (var i = game.children.length - 1; i >= 0; i--) {
+ game.removeChild(game.children[i]);
+ }
+ planets = [];
+ stardusts = [];
+ asteroids = [];
+ powerups = [];
+}
+// Create planets based on current level
+function createPlanets() {
+ // Basic level layouts
+ var layouts = [
+ // Level 1: Simple layout
+ [{
+ x: 500,
+ y: 1300,
+ size: 300
+ }, {
+ x: 1500,
+ y: 1800,
+ size: 250
+ }, {
+ x: 1200,
+ y: 800,
+ size: 200
+ }],
+ // Level 2: More complex
+ [{
+ x: 400,
+ y: 1400,
+ size: 200
+ }, {
+ x: 1600,
+ y: 1600,
+ size: 200
+ }, {
+ x: 1000,
+ y: 1000,
+ size: 180
+ }, {
+ x: 600,
+ y: 600,
+ size: 150
+ }],
+ // Level 3: Advanced
+ [{
+ x: 300,
+ y: 1500,
+ size: 150
+ }, {
+ x: 800,
+ y: 1800,
+ size: 150
+ }, {
+ x: 1300,
+ y: 1600,
+ size: 150
+ }, {
+ x: 1700,
+ y: 1200,
+ size: 150
+ }, {
+ x: 500,
+ y: 900,
+ size: 150
+ }, {
+ x: 1200,
+ y: 700,
+ size: 150
+ }]];
+ // Use appropriate layout or generate random one for higher levels
+ var planetData = level <= layouts.length ? layouts[level - 1] : generateRandomPlanets();
+ // Create planets
+ for (var i = 0; i < planetData.length; i++) {
+ var planet = new Planet();
+ planet.x = planetData[i].x;
+ planet.y = planetData[i].y;
+ planet.setSize(planetData[i].size);
+ planets.push(planet);
+ game.addChild(planet);
+ }
+}
+// Generate random planets for higher levels
+function generateRandomPlanets() {
+ var planetData = [];
+ var numPlanets = Math.min(5 + level, 10); // More planets for higher levels, max 10
+ for (var i = 0; i < numPlanets; i++) {
+ planetData.push({
+ x: 200 + Math.random() * 1648,
+ // Keep away from edges
+ y: 400 + Math.random() * 1932,
+ // Keep away from top/bottom
+ size: 120 + Math.random() * 150
+ });
+ }
+ return planetData;
+}
+// Create stardust items
+function createStardust() {
+ // Increase total stardust needed for higher levels
+ totalStardustNeeded = 10 + (level - 1) * 5;
+ for (var i = 0; i < totalStardustNeeded; i++) {
+ var stardust = new Stardust();
+ // Place stardust in a random position, but not too close to start or goal
+ var validPosition = false;
+ while (!validPosition) {
+ stardust.x = 100 + Math.random() * 1848;
+ stardust.y = 300 + Math.random() * 2132;
+ // Make sure it's not too close to astronaut start position or space station
+ var distToAstronaut = Math.sqrt(Math.pow(stardust.x - 1024, 2) + Math.pow(stardust.y - 2300, 2));
+ var distToStation = Math.sqrt(Math.pow(stardust.x - 1024, 2) + Math.pow(stardust.y - 200, 2));
+ if (distToAstronaut > 300 && distToStation > 400) {
+ validPosition = true;
+ }
+ }
+ stardusts.push(stardust);
+ game.addChild(stardust);
+ }
+}
+// Create asteroids based on level
+function createAsteroids() {
+ var numAsteroids = Math.min(level * 2, 10); // More asteroids for higher levels, max 10
+ for (var i = 0; i < numAsteroids; i++) {
+ var asteroid = new Asteroid();
+ asteroid.x = Math.random() * 2048;
+ asteroid.y = Math.random() * 2732;
+ // Make sure asteroids don't start too close to the astronaut
+ var distToAstronaut = Math.sqrt(Math.pow(asteroid.x - 1024, 2) + Math.pow(asteroid.y - 2300, 2));
+ if (distToAstronaut < 400) {
+ asteroid.x = (asteroid.x + 1024) % 2048;
+ asteroid.y = (asteroid.y + 1366) % 2732;
+ }
+ // Faster asteroids for higher levels
+ var speedMultiplier = 1 + level * 0.2;
+ asteroid.setup((Math.random() * 4 - 2) * speedMultiplier, (Math.random() * 4 - 2) * speedMultiplier, (Math.random() * 0.1 - 0.05) * speedMultiplier);
+ asteroids.push(asteroid);
+ game.addChild(asteroid);
+ }
+}
+// Create power-ups
+function createPowerUps() {
+ var powerupTypes = ["jump", "slow", "shield"];
+ var numPowerups = Math.min(level, 3); // More power-ups for higher levels, max 3
+ for (var i = 0; i < numPowerups; i++) {
+ var powerup = new PowerUp();
+ powerup.x = 200 + Math.random() * 1648;
+ powerup.y = 400 + Math.random() * 1932;
+ powerup.setType(powerupTypes[i % powerupTypes.length]);
+ powerups.push(powerup);
+ game.addChild(powerup);
+ }
+}
+// Create UI elements
+function createUI() {
+ // Score text
+ scoreTxt = new Text2('Stardust: 0/' + totalStardustNeeded, {
+ size: 80,
+ fill: 0xFFD700
+ });
+ scoreTxt.anchor.set(0.5, 0);
+ LK.gui.top.addChild(scoreTxt);
+ // Level text
+ levelTxt = new Text2('Level: ' + level, {
+ size: 80,
+ fill: 0xFFFFFF
+ });
+ levelTxt.anchor.set(0, 0);
+ levelTxt.x = 120; // Keep away from top-left corner
+ levelTxt.y = 80;
+ LK.gui.topLeft.addChild(levelTxt);
+ // Instructions text
+ instructionsTxt = new Text2('Tap to make the astronaut jump off planets!', {
+ size: 60,
+ fill: 0xCCCCCC
+ });
+ instructionsTxt.anchor.set(0.5, 0);
+ instructionsTxt.y = 100;
+ LK.gui.top.addChild(instructionsTxt);
+ // Hide instructions after 3 seconds
+ LK.setTimeout(function () {
+ tween(instructionsTxt, {
+ alpha: 0
+ }, {
+ duration: 1000,
+ easing: tween.easeOut
+ });
+ }, 3000);
+}
+// Update score display
+function updateScore() {
+ scoreTxt.setText('Stardust: ' + stardustCollected + '/' + totalStardustNeeded);
+}
+// Apply power-up effects
+function applyPowerUp(type) {
+ LK.getSound('powerup').play();
+ switch (type) {
+ case "jump":
+ // Temporary boost to jump strength
+ var originalJumpStrength = astronaut.jumpStrength;
+ astronaut.jumpStrength *= 1.5;
+ // Flash effect on astronaut
+ LK.effects.flashObject(astronaut, 0x00FF00, 500);
+ // Restore after 5 seconds
+ LK.setTimeout(function () {
+ astronaut.jumpStrength = originalJumpStrength;
+ }, 5000);
+ break;
+ case "slow":
+ // Slow down all asteroids
+ asteroids.forEach(function (asteroid) {
+ asteroid.speedX *= 0.5;
+ asteroid.speedY *= 0.5;
+ asteroid.rotationSpeed *= 0.5;
+ });
+ // Visual effect
+ LK.effects.flashScreen(0x0000FF, 300);
+ // Reset after 8 seconds
+ LK.setTimeout(function () {
+ asteroids.forEach(function (asteroid) {
+ asteroid.speedX *= 2;
+ asteroid.speedY *= 2;
+ asteroid.rotationSpeed *= 2;
+ });
+ }, 8000);
+ break;
+ case "shield":
+ // Give player shield for 10 seconds
+ playerHasShield = true;
+ // Visual effect - surround astronaut with a shield
+ var shield = LK.getAsset('astronaut', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 1.3,
+ scaleY: 1.3,
+ alpha: 0.5,
+ tint: 0xFF0000
+ });
+ astronaut.addChild(shield);
+ // Remove shield after 10 seconds
+ LK.setTimeout(function () {
+ playerHasShield = false;
+ astronaut.removeChild(shield);
+ }, 10000);
+ break;
+ }
+}
+// Check if astronaut can bounce off a planet
+function checkPlanetBounce() {
+ astronaut.isOnPlanet = false;
+ for (var i = 0; i < planets.length; i++) {
+ var planet = planets[i];
+ var dx = astronaut.x - planet.x;
+ var dy = astronaut.y - planet.y;
+ var distance = Math.sqrt(dx * dx + dy * dy);
+ // Check if astronaut is touching planet surface
+ if (distance <= planet.radius + 50) {
+ // 50 is astronaut radius
+ // Calculate bounce direction (normal to planet surface)
+ var nx = dx / distance;
+ var ny = dy / distance;
+ // Project velocity onto normal
+ var dot = astronaut.velocityX * nx + astronaut.velocityY * ny;
+ // Only bounce if moving toward planet
+ if (dot < 0) {
+ // Reflect velocity around normal with dampening (bounce factor)
+ astronaut.velocityX = (astronaut.velocityX - 2 * dot * nx) * astronaut.bounce;
+ astronaut.velocityY = (astronaut.velocityY - 2 * dot * ny) * astronaut.bounce;
+ // Position astronaut just outside planet to prevent sticking
+ astronaut.x = planet.x + nx * (planet.radius + 50);
+ astronaut.y = planet.y + ny * (planet.radius + 50);
+ // Mark as on planet for jumping
+ astronaut.isOnPlanet = true;
+ // Play bounce sound
+ LK.getSound('bounce').play();
+ // Visual feedback
+ LK.effects.flashObject(planet, 0xFFFFFF, 200);
+ }
+ }
+ }
+}
+// Check collisions with stardust
+function checkStardustCollision() {
+ for (var i = stardusts.length - 1; i >= 0; i--) {
+ if (astronaut.intersects(stardusts[i])) {
+ // Collect stardust
+ stardustCollected++;
+ updateScore();
+ // Remove stardust
+ game.removeChild(stardusts[i]);
+ stardusts.splice(i, 1);
+ // Play collect sound
+ LK.getSound('collect').play();
+ // Visual feedback
+ LK.effects.flashObject(astronaut, 0xFFD700, 200);
+ // Check if all stardust collected
+ if (stardustCollected >= totalStardustNeeded) {
+ // Make space station flash to show it's active
+ tween(spaceStation, {
+ alpha: 0.5
+ }, {
+ duration: 500,
+ easing: tween.easeInOut,
+ onFinish: function onFinish() {
+ tween(spaceStation, {
+ alpha: 1
+ }, {
+ duration: 500,
+ easing: tween.easeInOut
+ });
+ }
+ });
+ }
+ }
+ }
+}
+// Check collisions with asteroids
+function checkAsteroidCollision() {
+ for (var i = 0; i < asteroids.length; i++) {
+ if (astronaut.intersects(asteroids[i])) {
+ if (playerHasShield) {
+ // Shield absorbs hit
+ playerHasShield = false;
+ // Remove shield visual
+ for (var j = 0; j < astronaut.children.length; j++) {
+ if (astronaut.children[j].alpha === 0.5) {
+ astronaut.removeChild(astronaut.children[j]);
+ break;
+ }
+ }
+ // Visual feedback
+ LK.effects.flashObject(astronaut, 0xFF0000, 500);
+ // Push astronaut away
+ astronaut.velocityX = asteroids[i].speedX * 3;
+ astronaut.velocityY = asteroids[i].speedY * 3;
+ } else {
+ // Hit by asteroid - game over
+ LK.getSound('hit').play();
+ LK.effects.flashScreen(0xFF0000, 1000);
+ gameActive = false;
+ // Show game over after a brief delay
+ LK.setTimeout(function () {
+ LK.showGameOver();
+ }, 1000);
+ }
+ }
+ }
+}
+// Check collisions with power-ups
+function checkPowerUpCollision() {
+ for (var i = powerups.length - 1; i >= 0; i--) {
+ if (astronaut.intersects(powerups[i])) {
+ var type = powerups[i].type;
+ // Remove power-up
+ game.removeChild(powerups[i]);
+ powerups.splice(i, 1);
+ // Apply power-up effect
+ applyPowerUp(type);
+ }
+ }
+}
+// Check if level completed
+function checkLevelCompletion() {
+ if (stardustCollected >= totalStardustNeeded && astronaut.intersects(spaceStation)) {
+ // Complete level
+ LK.getSound('win').play();
+ // Visual feedback
+ LK.effects.flashScreen(0x00FF00, 1000);
+ // Level up
+ level++;
+ // Save progress
+ storage.level = level;
+ // Restart with next level
+ LK.setTimeout(function () {
+ if (level > 3) {
+ // Player completed all 3 levels - win the game
+ LK.showYouWin();
+ } else {
+ // Start next level
+ initGame();
+ }
+ }, 1500);
+ }
+}
+// Handle game input
+game.down = function (x, y, obj) {
+ if (gameActive) {
+ astronaut.jump();
+ }
+};
+// Game update loop
+game.update = function () {
+ if (!gameActive) {
+ return;
+ }
+ // Update game objects
+ if (astronaut) {
+ // Check planet collisions and bouncing
+ checkPlanetBounce();
+ // Update astronaut physics
+ astronaut.update();
+ // Check collisions
+ checkStardustCollision();
+ checkAsteroidCollision();
+ checkPowerUpCollision();
+ // Check level completion
+ checkLevelCompletion();
+ }
+ // Update all objects
+ for (var i = 0; i < stardusts.length; i++) {
+ stardusts[i].update();
+ }
+ for (var i = 0; i < asteroids.length; i++) {
+ asteroids[i].update();
+ }
+ for (var i = 0; i < powerups.length; i++) {
+ powerups[i].update();
+ }
+ if (spaceStation) {
+ spaceStation.update();
+ }
+};
+// Initialize the game
+initGame();
\ No newline at end of file