/****
* 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 asteroidGraphic = self.attachAsset('asteroid', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 3 + Math.random() * 3;
self.rotationSpeed = (Math.random() - 0.5) * 0.05;
self.size = 0.8 + Math.random() * 0.8;
asteroidGraphic.scale.set(self.size);
self.update = function () {
self.x -= self.speed;
asteroidGraphic.rotation += self.rotationSpeed;
// Remove if off screen
if (self.x < -200) {
self.toRemove = true;
}
};
return self;
});
var Astronaut = Container.expand(function () {
var self = Container.call(this);
var astronautBody = self.attachAsset('astronaut', {
anchorX: 0.5,
anchorY: 0.5
});
var jetpackFlame = self.attachAsset('jetpackFlame', {
anchorX: 0.5,
anchorY: 0,
x: 0,
y: 50,
alpha: 0
});
self.vx = 0;
self.vy = 0;
self.thrust = 0;
self.fuel = 100;
self.isDead = false;
self.activateJetpack = function (strength) {
if (self.fuel <= 0 || self.isDead) {
jetpackFlame.alpha = 0;
return;
}
self.thrust = strength;
jetpackFlame.alpha = strength;
// Consume fuel when jetpack is active
self.fuel -= 0.3 * strength;
if (self.fuel < 0) {
self.fuel = 0;
}
};
self.deactivateJetpack = function () {
self.thrust = 0;
jetpackFlame.alpha = 0;
};
self.update = function () {
if (self.isDead) {
return;
}
// Apply gravity
self.vy += 0.2;
// Apply thrust
self.vy -= self.thrust * 0.4;
// Apply velocity
self.y += self.vy;
self.x += self.vx;
// Tilt astronaut based on vertical movement
var targetRotation = self.vy * 0.05;
astronautBody.rotation = astronautBody.rotation * 0.8 + targetRotation * 0.2;
// Screen boundaries
if (self.y < 100) {
self.y = 100;
self.vy = 0;
}
if (self.y > 2732 - 100) {
self.y = 2732 - 100;
self.vy = 0;
}
};
return self;
});
var FuelCell = Container.expand(function () {
var self = Container.call(this);
var fuelGraphic = self.attachAsset('fuelCell', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 2 + Math.random() * 2;
self.collected = false;
// Add subtle floating animation
self.baseY = 0;
self.floatOffset = 0;
self.floatSpeed = 0.02 + Math.random() * 0.01;
self.update = function () {
self.x -= self.speed;
// Floating animation
self.floatOffset += self.floatSpeed;
fuelGraphic.y = self.baseY + Math.sin(self.floatOffset) * 10;
// Remove if off screen
if (self.x < -200) {
self.toRemove = true;
}
};
self.collect = function () {
if (self.collected) {
return;
}
self.collected = true;
LK.getSound('collect').play();
// Flash and scale animation
tween(fuelGraphic, {
alpha: 0,
scaleX: 2,
scaleY: 2
}, {
duration: 300,
easing: tween.easeOut
});
};
return self;
});
var Star = Container.expand(function () {
var self = Container.call(this);
var starGraphic = self.attachAsset('star', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 0.2 + Math.random() * 1;
self.size = 0.3 + Math.random() * 0.7;
starGraphic.scale.set(self.size);
starGraphic.alpha = 0.3 + Math.random() * 0.7;
self.update = function () {
self.x -= self.speed;
// Reset position if off screen
if (self.x < -50) {
self.x = 2048 + 50;
self.y = Math.random() * 2732;
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000011
});
/****
* Game Code
****/
// Game state variables
var astronaut;
var asteroids = [];
var fuelCells = [];
var stars = [];
var isJetpackActive = false;
var score = 0;
var gameOver = false;
var asteroidSpawnTimer = 0;
var asteroidSpawnRate = 120;
var fuelCellSpawnTimer = 0;
var fuelCellSpawnRate = 180;
var highScore = storage.highScore || 0;
// UI elements
var scoreText = new Text2('0', {
size: 80,
fill: 0xFFFFFF
});
scoreText.anchor.set(1.0, 0);
LK.gui.topRight.addChild(scoreText);
var highScoreText = new Text2('BEST: 0', {
size: 50,
fill: 0xAAAAAA
});
highScoreText.anchor.set(1.0, 0);
highScoreText.y = 90;
LK.gui.topRight.addChild(highScoreText);
highScoreText.setText('BEST: ' + highScore);
var fuelBarBg = LK.getAsset('fuelBarBg', {
anchorX: 0.5,
anchorY: 0.5
});
var fuelBar = LK.getAsset('fuelBar', {
anchorX: 0,
anchorY: 0.5,
x: -400
});
var fuelBarContainer = new Container();
fuelBarContainer.addChild(fuelBarBg);
fuelBarContainer.addChild(fuelBar);
fuelBarContainer.y = 50;
LK.gui.top.addChild(fuelBarContainer);
// Create background stars
function createStars() {
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);
}
}
// Initialize game elements
function initGame() {
// Reset game state
score = 0;
gameOver = false;
// Clear existing game objects
if (astronaut) {
astronaut.destroy();
}
for (var i = asteroids.length - 1; i >= 0; i--) {
asteroids[i].destroy();
}
asteroids = [];
for (var i = fuelCells.length - 1; i >= 0; i--) {
fuelCells[i].destroy();
}
fuelCells = [];
for (var i = stars.length - 1; i >= 0; i--) {
stars[i].destroy();
}
stars = [];
// Create background stars
createStars();
// Create astronaut
astronaut = new Astronaut();
astronaut.x = 300;
astronaut.y = 2732 / 2;
game.addChild(astronaut);
// Reset UI
scoreText.setText('0');
LK.setScore(0);
// Play background music
LK.playMusic('spaceBgm', {
fade: {
start: 0,
end: 0.4,
duration: 1000
}
});
}
// Spawn a new asteroid
function spawnAsteroid() {
var asteroid = new Asteroid();
asteroid.x = 2048 + 200;
asteroid.y = 200 + Math.random() * (2732 - 400);
asteroids.push(asteroid);
game.addChild(asteroid);
}
// Spawn a new fuel cell
function spawnFuelCell() {
var fuelCell = new FuelCell();
fuelCell.x = 2048 + 200;
fuelCell.y = 200 + Math.random() * (2732 - 400);
fuelCells.push(fuelCell);
game.addChild(fuelCell);
}
// Handle input for astronaut jetpack
game.down = function (x, y) {
if (gameOver) {
return;
}
isJetpackActive = true;
astronaut.activateJetpack(1.0);
LK.getSound('jetpack').play();
};
game.up = function () {
isJetpackActive = false;
astronaut.deactivateJetpack();
};
game.move = function (x, y) {
if (isJetpackActive && !gameOver) {
astronaut.activateJetpack(1.0);
}
};
// Main game update function
game.update = function () {
if (!astronaut) {
initGame();
return;
}
// Increment score
if (!gameOver) {
score += 0.1;
LK.setScore(Math.floor(score));
scoreText.setText(Math.floor(score));
}
// Update fuel bar
var fuelPercent = astronaut.fuel / 100;
fuelBar.width = 800 * fuelPercent;
// Change fuel bar color based on amount
if (fuelPercent < 0.3) {
fuelBar.tint = 0xff0000;
} else if (fuelPercent < 0.6) {
fuelBar.tint = 0xffff00;
} else {
fuelBar.tint = 0x00ff00;
}
// Spawn asteroids
asteroidSpawnTimer++;
if (asteroidSpawnTimer >= asteroidSpawnRate && !gameOver) {
spawnAsteroid();
asteroidSpawnTimer = 0;
// Gradually increase difficulty
if (asteroidSpawnRate > 40) {
asteroidSpawnRate -= 0.2;
}
}
// Spawn fuel cells
fuelCellSpawnTimer++;
if (fuelCellSpawnTimer >= fuelCellSpawnRate && !gameOver) {
spawnFuelCell();
fuelCellSpawnTimer = 0;
}
// Update game objects
for (var i = asteroids.length - 1; i >= 0; i--) {
var asteroid = asteroids[i];
asteroid.update();
// Check collision with astronaut
if (!gameOver && !astronaut.isDead && asteroid.intersects(astronaut)) {
// Collision with asteroid - game over
LK.getSound('explosion').play();
astronaut.isDead = true;
gameOver = true;
// Flash screen red
LK.effects.flashScreen(0xff0000, 800);
// Update high score
if (score > highScore) {
highScore = Math.floor(score);
storage.highScore = highScore;
highScoreText.setText('BEST: ' + highScore);
}
// Show game over after a short delay
LK.setTimeout(function () {
LK.showGameOver();
}, 1500);
// Stop music
LK.stopMusic();
// Visual effect for asteroid collision
tween(asteroid, {
alpha: 0,
scaleX: 2,
scaleY: 2
}, {
duration: 500,
easing: tween.easeOut
});
}
// Remove asteroids that are marked for removal
if (asteroid.toRemove) {
asteroid.destroy();
asteroids.splice(i, 1);
}
}
// Update fuel cells
for (var i = fuelCells.length - 1; i >= 0; i--) {
var fuelCell = fuelCells[i];
fuelCell.update();
// Check collision with astronaut
if (!gameOver && !fuelCell.collected && fuelCell.intersects(astronaut)) {
// Collect fuel cell
fuelCell.collect();
// Add fuel
astronaut.fuel += 30;
if (astronaut.fuel > 100) {
astronaut.fuel = 100;
}
// Remove fuel cell after animation
LK.setTimeout(function () {
var index = fuelCells.indexOf(fuelCell);
if (index !== -1) {
fuelCell.destroy();
fuelCells.splice(index, 1);
}
}, 300);
}
// Remove fuel cells that are marked for removal
if (fuelCell.toRemove) {
fuelCell.destroy();
fuelCells.splice(i, 1);
}
}
// Update stars
for (var i = 0; i < stars.length; i++) {
stars[i].update();
}
// Check for out of fuel condition
if (!gameOver && astronaut.fuel <= 0 && astronaut.y > 2732 - 200) {
// Out of fuel and hitting the bottom - game over
astronaut.isDead = true;
gameOver = true;
// Flash screen
LK.effects.flashScreen(0xff0000, 800);
// Update high score
if (score > highScore) {
highScore = Math.floor(score);
storage.highScore = highScore;
highScoreText.setText('BEST: ' + highScore);
}
// Show game over after a short delay
LK.setTimeout(function () {
LK.showGameOver();
}, 1500);
// Stop music
LK.stopMusic();
}
}; ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,419 @@
-/****
+/****
+* 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 asteroidGraphic = self.attachAsset('asteroid', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 3 + Math.random() * 3;
+ self.rotationSpeed = (Math.random() - 0.5) * 0.05;
+ self.size = 0.8 + Math.random() * 0.8;
+ asteroidGraphic.scale.set(self.size);
+ self.update = function () {
+ self.x -= self.speed;
+ asteroidGraphic.rotation += self.rotationSpeed;
+ // Remove if off screen
+ if (self.x < -200) {
+ self.toRemove = true;
+ }
+ };
+ return self;
+});
+var Astronaut = Container.expand(function () {
+ var self = Container.call(this);
+ var astronautBody = self.attachAsset('astronaut', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ var jetpackFlame = self.attachAsset('jetpackFlame', {
+ anchorX: 0.5,
+ anchorY: 0,
+ x: 0,
+ y: 50,
+ alpha: 0
+ });
+ self.vx = 0;
+ self.vy = 0;
+ self.thrust = 0;
+ self.fuel = 100;
+ self.isDead = false;
+ self.activateJetpack = function (strength) {
+ if (self.fuel <= 0 || self.isDead) {
+ jetpackFlame.alpha = 0;
+ return;
+ }
+ self.thrust = strength;
+ jetpackFlame.alpha = strength;
+ // Consume fuel when jetpack is active
+ self.fuel -= 0.3 * strength;
+ if (self.fuel < 0) {
+ self.fuel = 0;
+ }
+ };
+ self.deactivateJetpack = function () {
+ self.thrust = 0;
+ jetpackFlame.alpha = 0;
+ };
+ self.update = function () {
+ if (self.isDead) {
+ return;
+ }
+ // Apply gravity
+ self.vy += 0.2;
+ // Apply thrust
+ self.vy -= self.thrust * 0.4;
+ // Apply velocity
+ self.y += self.vy;
+ self.x += self.vx;
+ // Tilt astronaut based on vertical movement
+ var targetRotation = self.vy * 0.05;
+ astronautBody.rotation = astronautBody.rotation * 0.8 + targetRotation * 0.2;
+ // Screen boundaries
+ if (self.y < 100) {
+ self.y = 100;
+ self.vy = 0;
+ }
+ if (self.y > 2732 - 100) {
+ self.y = 2732 - 100;
+ self.vy = 0;
+ }
+ };
+ return self;
+});
+var FuelCell = Container.expand(function () {
+ var self = Container.call(this);
+ var fuelGraphic = self.attachAsset('fuelCell', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 2 + Math.random() * 2;
+ self.collected = false;
+ // Add subtle floating animation
+ self.baseY = 0;
+ self.floatOffset = 0;
+ self.floatSpeed = 0.02 + Math.random() * 0.01;
+ self.update = function () {
+ self.x -= self.speed;
+ // Floating animation
+ self.floatOffset += self.floatSpeed;
+ fuelGraphic.y = self.baseY + Math.sin(self.floatOffset) * 10;
+ // Remove if off screen
+ if (self.x < -200) {
+ self.toRemove = true;
+ }
+ };
+ self.collect = function () {
+ if (self.collected) {
+ return;
+ }
+ self.collected = true;
+ LK.getSound('collect').play();
+ // Flash and scale animation
+ tween(fuelGraphic, {
+ alpha: 0,
+ scaleX: 2,
+ scaleY: 2
+ }, {
+ duration: 300,
+ easing: tween.easeOut
+ });
+ };
+ return self;
+});
+var Star = Container.expand(function () {
+ var self = Container.call(this);
+ var starGraphic = self.attachAsset('star', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 0.2 + Math.random() * 1;
+ self.size = 0.3 + Math.random() * 0.7;
+ starGraphic.scale.set(self.size);
+ starGraphic.alpha = 0.3 + Math.random() * 0.7;
+ self.update = function () {
+ self.x -= self.speed;
+ // Reset position if off screen
+ if (self.x < -50) {
+ self.x = 2048 + 50;
+ self.y = Math.random() * 2732;
+ }
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x000011
+});
+
+/****
+* Game Code
+****/
+// Game state variables
+var astronaut;
+var asteroids = [];
+var fuelCells = [];
+var stars = [];
+var isJetpackActive = false;
+var score = 0;
+var gameOver = false;
+var asteroidSpawnTimer = 0;
+var asteroidSpawnRate = 120;
+var fuelCellSpawnTimer = 0;
+var fuelCellSpawnRate = 180;
+var highScore = storage.highScore || 0;
+// UI elements
+var scoreText = new Text2('0', {
+ size: 80,
+ fill: 0xFFFFFF
+});
+scoreText.anchor.set(1.0, 0);
+LK.gui.topRight.addChild(scoreText);
+var highScoreText = new Text2('BEST: 0', {
+ size: 50,
+ fill: 0xAAAAAA
+});
+highScoreText.anchor.set(1.0, 0);
+highScoreText.y = 90;
+LK.gui.topRight.addChild(highScoreText);
+highScoreText.setText('BEST: ' + highScore);
+var fuelBarBg = LK.getAsset('fuelBarBg', {
+ anchorX: 0.5,
+ anchorY: 0.5
+});
+var fuelBar = LK.getAsset('fuelBar', {
+ anchorX: 0,
+ anchorY: 0.5,
+ x: -400
+});
+var fuelBarContainer = new Container();
+fuelBarContainer.addChild(fuelBarBg);
+fuelBarContainer.addChild(fuelBar);
+fuelBarContainer.y = 50;
+LK.gui.top.addChild(fuelBarContainer);
+// Create background stars
+function createStars() {
+ 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);
+ }
+}
+// Initialize game elements
+function initGame() {
+ // Reset game state
+ score = 0;
+ gameOver = false;
+ // Clear existing game objects
+ if (astronaut) {
+ astronaut.destroy();
+ }
+ for (var i = asteroids.length - 1; i >= 0; i--) {
+ asteroids[i].destroy();
+ }
+ asteroids = [];
+ for (var i = fuelCells.length - 1; i >= 0; i--) {
+ fuelCells[i].destroy();
+ }
+ fuelCells = [];
+ for (var i = stars.length - 1; i >= 0; i--) {
+ stars[i].destroy();
+ }
+ stars = [];
+ // Create background stars
+ createStars();
+ // Create astronaut
+ astronaut = new Astronaut();
+ astronaut.x = 300;
+ astronaut.y = 2732 / 2;
+ game.addChild(astronaut);
+ // Reset UI
+ scoreText.setText('0');
+ LK.setScore(0);
+ // Play background music
+ LK.playMusic('spaceBgm', {
+ fade: {
+ start: 0,
+ end: 0.4,
+ duration: 1000
+ }
+ });
+}
+// Spawn a new asteroid
+function spawnAsteroid() {
+ var asteroid = new Asteroid();
+ asteroid.x = 2048 + 200;
+ asteroid.y = 200 + Math.random() * (2732 - 400);
+ asteroids.push(asteroid);
+ game.addChild(asteroid);
+}
+// Spawn a new fuel cell
+function spawnFuelCell() {
+ var fuelCell = new FuelCell();
+ fuelCell.x = 2048 + 200;
+ fuelCell.y = 200 + Math.random() * (2732 - 400);
+ fuelCells.push(fuelCell);
+ game.addChild(fuelCell);
+}
+// Handle input for astronaut jetpack
+game.down = function (x, y) {
+ if (gameOver) {
+ return;
+ }
+ isJetpackActive = true;
+ astronaut.activateJetpack(1.0);
+ LK.getSound('jetpack').play();
+};
+game.up = function () {
+ isJetpackActive = false;
+ astronaut.deactivateJetpack();
+};
+game.move = function (x, y) {
+ if (isJetpackActive && !gameOver) {
+ astronaut.activateJetpack(1.0);
+ }
+};
+// Main game update function
+game.update = function () {
+ if (!astronaut) {
+ initGame();
+ return;
+ }
+ // Increment score
+ if (!gameOver) {
+ score += 0.1;
+ LK.setScore(Math.floor(score));
+ scoreText.setText(Math.floor(score));
+ }
+ // Update fuel bar
+ var fuelPercent = astronaut.fuel / 100;
+ fuelBar.width = 800 * fuelPercent;
+ // Change fuel bar color based on amount
+ if (fuelPercent < 0.3) {
+ fuelBar.tint = 0xff0000;
+ } else if (fuelPercent < 0.6) {
+ fuelBar.tint = 0xffff00;
+ } else {
+ fuelBar.tint = 0x00ff00;
+ }
+ // Spawn asteroids
+ asteroidSpawnTimer++;
+ if (asteroidSpawnTimer >= asteroidSpawnRate && !gameOver) {
+ spawnAsteroid();
+ asteroidSpawnTimer = 0;
+ // Gradually increase difficulty
+ if (asteroidSpawnRate > 40) {
+ asteroidSpawnRate -= 0.2;
+ }
+ }
+ // Spawn fuel cells
+ fuelCellSpawnTimer++;
+ if (fuelCellSpawnTimer >= fuelCellSpawnRate && !gameOver) {
+ spawnFuelCell();
+ fuelCellSpawnTimer = 0;
+ }
+ // Update game objects
+ for (var i = asteroids.length - 1; i >= 0; i--) {
+ var asteroid = asteroids[i];
+ asteroid.update();
+ // Check collision with astronaut
+ if (!gameOver && !astronaut.isDead && asteroid.intersects(astronaut)) {
+ // Collision with asteroid - game over
+ LK.getSound('explosion').play();
+ astronaut.isDead = true;
+ gameOver = true;
+ // Flash screen red
+ LK.effects.flashScreen(0xff0000, 800);
+ // Update high score
+ if (score > highScore) {
+ highScore = Math.floor(score);
+ storage.highScore = highScore;
+ highScoreText.setText('BEST: ' + highScore);
+ }
+ // Show game over after a short delay
+ LK.setTimeout(function () {
+ LK.showGameOver();
+ }, 1500);
+ // Stop music
+ LK.stopMusic();
+ // Visual effect for asteroid collision
+ tween(asteroid, {
+ alpha: 0,
+ scaleX: 2,
+ scaleY: 2
+ }, {
+ duration: 500,
+ easing: tween.easeOut
+ });
+ }
+ // Remove asteroids that are marked for removal
+ if (asteroid.toRemove) {
+ asteroid.destroy();
+ asteroids.splice(i, 1);
+ }
+ }
+ // Update fuel cells
+ for (var i = fuelCells.length - 1; i >= 0; i--) {
+ var fuelCell = fuelCells[i];
+ fuelCell.update();
+ // Check collision with astronaut
+ if (!gameOver && !fuelCell.collected && fuelCell.intersects(astronaut)) {
+ // Collect fuel cell
+ fuelCell.collect();
+ // Add fuel
+ astronaut.fuel += 30;
+ if (astronaut.fuel > 100) {
+ astronaut.fuel = 100;
+ }
+ // Remove fuel cell after animation
+ LK.setTimeout(function () {
+ var index = fuelCells.indexOf(fuelCell);
+ if (index !== -1) {
+ fuelCell.destroy();
+ fuelCells.splice(index, 1);
+ }
+ }, 300);
+ }
+ // Remove fuel cells that are marked for removal
+ if (fuelCell.toRemove) {
+ fuelCell.destroy();
+ fuelCells.splice(i, 1);
+ }
+ }
+ // Update stars
+ for (var i = 0; i < stars.length; i++) {
+ stars[i].update();
+ }
+ // Check for out of fuel condition
+ if (!gameOver && astronaut.fuel <= 0 && astronaut.y > 2732 - 200) {
+ // Out of fuel and hitting the bottom - game over
+ astronaut.isDead = true;
+ gameOver = true;
+ // Flash screen
+ LK.effects.flashScreen(0xff0000, 800);
+ // Update high score
+ if (score > highScore) {
+ highScore = Math.floor(score);
+ storage.highScore = highScore;
+ highScoreText.setText('BEST: ' + highScore);
+ }
+ // Show game over after a short delay
+ LK.setTimeout(function () {
+ LK.showGameOver();
+ }, 1500);
+ // Stop music
+ LK.stopMusic();
+ }
+};
\ No newline at end of file