/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var BackgroundElement = Container.expand(function (type) { var self = Container.call(this); var bgGraphics = self.attachAsset(type, { anchorX: 0.5, anchorY: 0.5 }); self.speed = -2; self.update = function () { self.x += self.speed; }; return self; }); var Obstacle = Container.expand(function (type) { var self = Container.call(this); var obstacleGraphics = self.attachAsset(type, { anchorX: 0.5, anchorY: 0.5 }); self.speed = -5; self.update = function () { self.x += self.speed; }; return self; }); var PowerUp = Container.expand(function () { var self = Container.call(this); var powerUpGraphics = self.attachAsset('powerUp', { anchorX: 0.5, anchorY: 0.5 }); self.speed = -5; self.update = function () { self.x += self.speed; // Gentle floating animation self.y += Math.sin(LK.ticks * 0.1) * 0.5; }; return self; }); var Rocket = Container.expand(function () { var self = Container.call(this); var rocketGraphics = self.attachAsset('rocket', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 3; self.verticalSpeed = 0; self.maxVerticalSpeed = 8; self.acceleration = 0.3; self.deceleration = 0.2; self.update = function () { // Continuous forward movement self.x += self.speed; // Apply vertical movement with deceleration if (self.verticalSpeed > 0) { self.verticalSpeed -= self.deceleration; if (self.verticalSpeed < 0) self.verticalSpeed = 0; } else if (self.verticalSpeed < 0) { self.verticalSpeed += self.deceleration; if (self.verticalSpeed > 0) self.verticalSpeed = 0; } self.y += self.verticalSpeed; // Keep rocket within screen bounds if (self.y < 100) self.y = 100; if (self.y > 2632) self.y = 2632; }; self.moveUp = function () { self.verticalSpeed = -self.maxVerticalSpeed; }; self.moveDown = function () { self.verticalSpeed = self.maxVerticalSpeed; }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000033 }); /**** * Game Code ****/ // Sound effects // Level selection buttons // UI elements // Background elements // Power-ups // Obstacles for different environments // Rocket ship // Game state variables var gameState = 'levelSelect'; // 'levelSelect', 'countdown', 'playing', 'gameOver' var currentLevel = ''; var countdownTimer = 0; var countdownValue = 5; var spawnTimer = 0; var backgroundTimer = 0; var distance = 0; // Game objects var rocket = null; var obstacles = []; var powerUps = []; var backgroundElements = []; // UI elements var upButton = null; var downButton = null; var spaceButton = null; var saturnButton = null; var earthButton = null; // Score and UI text var scoreText = new Text2('Score: 0', { size: 60, fill: '#FFFFFF' }); scoreText.anchor.set(0.5, 0); LK.gui.top.addChild(scoreText); var countdownText = new Text2('', { size: 200, fill: '#FFFF00' }); countdownText.anchor.set(0.5, 0.5); LK.gui.center.addChild(countdownText); var levelText = new Text2('Select Level', { size: 80, fill: '#FFFFFF' }); levelText.anchor.set(0.5, 0.5); LK.gui.center.addChild(levelText); // Initialize level selection function initLevelSelect() { gameState = 'levelSelect'; // Create level selection buttons spaceButton = game.addChild(LK.getAsset('spaceButton', { anchorX: 0.5, anchorY: 0.5 })); spaceButton.x = 1024; spaceButton.y = 1200; saturnButton = game.addChild(LK.getAsset('saturnButton', { anchorX: 0.5, anchorY: 0.5 })); saturnButton.x = 1024; saturnButton.y = 1400; earthButton = game.addChild(LK.getAsset('earthButton', { anchorX: 0.5, anchorY: 0.5 })); earthButton.x = 1024; earthButton.y = 1600; // Add button labels var spaceText = new Text2('SPACE', { size: 50, fill: '#FFFFFF' }); spaceText.anchor.set(0.5, 0.5); spaceButton.addChild(spaceText); var saturnText = new Text2('SATURN', { size: 50, fill: '#FFFFFF' }); saturnText.anchor.set(0.5, 0.5); saturnButton.addChild(saturnText); var earthText = new Text2('EARTH', { size: 50, fill: '#FFFFFF' }); earthText.anchor.set(0.5, 0.5); earthButton.addChild(earthText); levelText.setText('Select Level'); } // Start countdown sequence function startCountdown(level) { currentLevel = level; gameState = 'countdown'; countdownTimer = 0; countdownValue = 5; // Clear level selection if (spaceButton) { spaceButton.destroy(); spaceButton = null; } if (saturnButton) { saturnButton.destroy(); saturnButton = null; } if (earthButton) { earthButton.destroy(); earthButton = null; } levelText.setText(''); // Set background color based on level switch (level) { case 'space': game.setBackgroundColor(0x000033); break; case 'saturn': game.setBackgroundColor(0x4B0082); break; case 'earth': game.setBackgroundColor(0x87CEEB); break; } } // Initialize gameplay function initGameplay() { gameState = 'playing'; countdownText.setText(''); // Create rocket rocket = game.addChild(new Rocket()); rocket.x = 300; rocket.y = 1366; // Create control buttons upButton = game.addChild(LK.getAsset('upButton', { anchorX: 0.5, anchorY: 0.5 })); upButton.x = 1800; upButton.y = 1000; downButton = game.addChild(LK.getAsset('downButton', { anchorX: 0.5, anchorY: 0.5 })); downButton.x = 1800; downButton.y = 1600; // Add button labels var upText = new Text2('UP', { size: 40, fill: '#FFFFFF' }); upText.anchor.set(0.5, 0.5); upButton.addChild(upText); var downText = new Text2('DOWN', { size: 40, fill: '#FFFFFF' }); downText.anchor.set(0.5, 0.5); downButton.addChild(downText); // Reset game variables distance = 0; spawnTimer = 0; backgroundTimer = 0; obstacles = []; powerUps = []; backgroundElements = []; LK.setScore(0); scoreText.setText('Score: 0'); LK.getSound('rocket').play(); } // Spawn obstacles based on current level function spawnObstacle() { var obstacleType = ''; var yPosition = Math.random() * (2632 - 200) + 100; switch (currentLevel) { case 'space': obstacleType = 'spaceObstacle'; break; case 'saturn': obstacleType = 'saturnObstacle'; break; case 'earth': obstacleType = 'earthObstacle'; break; } var obstacle = game.addChild(new Obstacle(obstacleType)); obstacle.x = 2148; obstacle.y = yPosition; obstacles.push(obstacle); } // Spawn power-ups function spawnPowerUp() { var powerUp = game.addChild(new PowerUp()); powerUp.x = 2148; powerUp.y = Math.random() * (2632 - 200) + 100; powerUps.push(powerUp); } // Spawn background elements function spawnBackground() { var bgType = ''; var yPosition = Math.random() * 2732; switch (currentLevel) { case 'space': bgType = 'star'; break; case 'saturn': bgType = 'saturnRing'; break; case 'earth': bgType = 'cloud'; break; } var bgElement = game.addChild(new BackgroundElement(bgType)); bgElement.x = 2148; bgElement.y = yPosition; backgroundElements.push(bgElement); } // Button event handlers game.down = function (x, y, obj) { if (gameState === 'levelSelect') { var gamePos = game.toLocal(obj.parent.toGlobal(obj.position)); if (spaceButton && spaceButton.intersects({ x: gamePos.x, y: gamePos.y, width: 1, height: 1 })) { startCountdown('space'); } else if (saturnButton && saturnButton.intersects({ x: gamePos.x, y: gamePos.y, width: 1, height: 1 })) { startCountdown('saturn'); } else if (earthButton && earthButton.intersects({ x: gamePos.x, y: gamePos.y, width: 1, height: 1 })) { startCountdown('earth'); } } else if (gameState === 'playing') { var gamePos = game.toLocal(obj.parent.toGlobal(obj.position)); if (upButton && upButton.intersects({ x: gamePos.x, y: gamePos.y, width: 1, height: 1 })) { rocket.moveUp(); } else if (downButton && downButton.intersects({ x: gamePos.x, y: gamePos.y, width: 1, height: 1 })) { rocket.moveDown(); } } }; // Main game update loop game.update = function () { if (gameState === 'countdown') { countdownTimer++; if (countdownTimer % 60 === 0) { // Every second if (countdownValue > 0) { countdownText.setText(countdownValue.toString()); LK.getSound('countdown').play(); countdownValue--; } else { countdownText.setText('BLAST OFF!'); LK.setTimeout(function () { initGameplay(); }, 1000); } } } else if (gameState === 'playing') { distance++; // Update score based on distance if (distance % 60 === 0) { LK.setScore(LK.getScore() + 10); scoreText.setText('Score: ' + LK.getScore()); } // Spawn obstacles var spawnRate = 180; // Base spawn rate if (currentLevel === 'saturn') spawnRate = 150; if (currentLevel === 'earth') spawnRate = 120; spawnTimer++; if (spawnTimer >= spawnRate) { spawnObstacle(); spawnTimer = 0; } // Spawn power-ups occasionally if (LK.ticks % 300 === 0) { spawnPowerUp(); } // Spawn background elements backgroundTimer++; if (backgroundTimer >= 120) { spawnBackground(); backgroundTimer = 0; } // Check obstacle collisions for (var i = obstacles.length - 1; i >= 0; i--) { var obstacle = obstacles[i]; if (obstacle.x < -100) { obstacle.destroy(); obstacles.splice(i, 1); continue; } if (rocket && rocket.intersects(obstacle)) { LK.showGameOver(); return; } } // Check power-up collisions for (var i = powerUps.length - 1; i >= 0; i--) { var powerUp = powerUps[i]; if (powerUp.x < -100) { powerUp.destroy(); powerUps.splice(i, 1); continue; } if (rocket && rocket.intersects(powerUp)) { LK.setScore(LK.getScore() + 50); scoreText.setText('Score: ' + LK.getScore()); LK.getSound('collect').play(); powerUp.destroy(); powerUps.splice(i, 1); } } // Clean up background elements for (var i = backgroundElements.length - 1; i >= 0; i--) { var bgElement = backgroundElements[i]; if (bgElement.x < -200) { bgElement.destroy(); backgroundElements.splice(i, 1); } } // Check if rocket went off screen if (rocket && rocket.x < -100) { LK.showGameOver(); } } }; // Initialize level selection on start initLevelSelect();
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var BackgroundElement = Container.expand(function (type) {
var self = Container.call(this);
var bgGraphics = self.attachAsset(type, {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = -2;
self.update = function () {
self.x += self.speed;
};
return self;
});
var Obstacle = Container.expand(function (type) {
var self = Container.call(this);
var obstacleGraphics = self.attachAsset(type, {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = -5;
self.update = function () {
self.x += self.speed;
};
return self;
});
var PowerUp = Container.expand(function () {
var self = Container.call(this);
var powerUpGraphics = self.attachAsset('powerUp', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = -5;
self.update = function () {
self.x += self.speed;
// Gentle floating animation
self.y += Math.sin(LK.ticks * 0.1) * 0.5;
};
return self;
});
var Rocket = Container.expand(function () {
var self = Container.call(this);
var rocketGraphics = self.attachAsset('rocket', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 3;
self.verticalSpeed = 0;
self.maxVerticalSpeed = 8;
self.acceleration = 0.3;
self.deceleration = 0.2;
self.update = function () {
// Continuous forward movement
self.x += self.speed;
// Apply vertical movement with deceleration
if (self.verticalSpeed > 0) {
self.verticalSpeed -= self.deceleration;
if (self.verticalSpeed < 0) self.verticalSpeed = 0;
} else if (self.verticalSpeed < 0) {
self.verticalSpeed += self.deceleration;
if (self.verticalSpeed > 0) self.verticalSpeed = 0;
}
self.y += self.verticalSpeed;
// Keep rocket within screen bounds
if (self.y < 100) self.y = 100;
if (self.y > 2632) self.y = 2632;
};
self.moveUp = function () {
self.verticalSpeed = -self.maxVerticalSpeed;
};
self.moveDown = function () {
self.verticalSpeed = self.maxVerticalSpeed;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000033
});
/****
* Game Code
****/
// Sound effects
// Level selection buttons
// UI elements
// Background elements
// Power-ups
// Obstacles for different environments
// Rocket ship
// Game state variables
var gameState = 'levelSelect'; // 'levelSelect', 'countdown', 'playing', 'gameOver'
var currentLevel = '';
var countdownTimer = 0;
var countdownValue = 5;
var spawnTimer = 0;
var backgroundTimer = 0;
var distance = 0;
// Game objects
var rocket = null;
var obstacles = [];
var powerUps = [];
var backgroundElements = [];
// UI elements
var upButton = null;
var downButton = null;
var spaceButton = null;
var saturnButton = null;
var earthButton = null;
// Score and UI text
var scoreText = new Text2('Score: 0', {
size: 60,
fill: '#FFFFFF'
});
scoreText.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreText);
var countdownText = new Text2('', {
size: 200,
fill: '#FFFF00'
});
countdownText.anchor.set(0.5, 0.5);
LK.gui.center.addChild(countdownText);
var levelText = new Text2('Select Level', {
size: 80,
fill: '#FFFFFF'
});
levelText.anchor.set(0.5, 0.5);
LK.gui.center.addChild(levelText);
// Initialize level selection
function initLevelSelect() {
gameState = 'levelSelect';
// Create level selection buttons
spaceButton = game.addChild(LK.getAsset('spaceButton', {
anchorX: 0.5,
anchorY: 0.5
}));
spaceButton.x = 1024;
spaceButton.y = 1200;
saturnButton = game.addChild(LK.getAsset('saturnButton', {
anchorX: 0.5,
anchorY: 0.5
}));
saturnButton.x = 1024;
saturnButton.y = 1400;
earthButton = game.addChild(LK.getAsset('earthButton', {
anchorX: 0.5,
anchorY: 0.5
}));
earthButton.x = 1024;
earthButton.y = 1600;
// Add button labels
var spaceText = new Text2('SPACE', {
size: 50,
fill: '#FFFFFF'
});
spaceText.anchor.set(0.5, 0.5);
spaceButton.addChild(spaceText);
var saturnText = new Text2('SATURN', {
size: 50,
fill: '#FFFFFF'
});
saturnText.anchor.set(0.5, 0.5);
saturnButton.addChild(saturnText);
var earthText = new Text2('EARTH', {
size: 50,
fill: '#FFFFFF'
});
earthText.anchor.set(0.5, 0.5);
earthButton.addChild(earthText);
levelText.setText('Select Level');
}
// Start countdown sequence
function startCountdown(level) {
currentLevel = level;
gameState = 'countdown';
countdownTimer = 0;
countdownValue = 5;
// Clear level selection
if (spaceButton) {
spaceButton.destroy();
spaceButton = null;
}
if (saturnButton) {
saturnButton.destroy();
saturnButton = null;
}
if (earthButton) {
earthButton.destroy();
earthButton = null;
}
levelText.setText('');
// Set background color based on level
switch (level) {
case 'space':
game.setBackgroundColor(0x000033);
break;
case 'saturn':
game.setBackgroundColor(0x4B0082);
break;
case 'earth':
game.setBackgroundColor(0x87CEEB);
break;
}
}
// Initialize gameplay
function initGameplay() {
gameState = 'playing';
countdownText.setText('');
// Create rocket
rocket = game.addChild(new Rocket());
rocket.x = 300;
rocket.y = 1366;
// Create control buttons
upButton = game.addChild(LK.getAsset('upButton', {
anchorX: 0.5,
anchorY: 0.5
}));
upButton.x = 1800;
upButton.y = 1000;
downButton = game.addChild(LK.getAsset('downButton', {
anchorX: 0.5,
anchorY: 0.5
}));
downButton.x = 1800;
downButton.y = 1600;
// Add button labels
var upText = new Text2('UP', {
size: 40,
fill: '#FFFFFF'
});
upText.anchor.set(0.5, 0.5);
upButton.addChild(upText);
var downText = new Text2('DOWN', {
size: 40,
fill: '#FFFFFF'
});
downText.anchor.set(0.5, 0.5);
downButton.addChild(downText);
// Reset game variables
distance = 0;
spawnTimer = 0;
backgroundTimer = 0;
obstacles = [];
powerUps = [];
backgroundElements = [];
LK.setScore(0);
scoreText.setText('Score: 0');
LK.getSound('rocket').play();
}
// Spawn obstacles based on current level
function spawnObstacle() {
var obstacleType = '';
var yPosition = Math.random() * (2632 - 200) + 100;
switch (currentLevel) {
case 'space':
obstacleType = 'spaceObstacle';
break;
case 'saturn':
obstacleType = 'saturnObstacle';
break;
case 'earth':
obstacleType = 'earthObstacle';
break;
}
var obstacle = game.addChild(new Obstacle(obstacleType));
obstacle.x = 2148;
obstacle.y = yPosition;
obstacles.push(obstacle);
}
// Spawn power-ups
function spawnPowerUp() {
var powerUp = game.addChild(new PowerUp());
powerUp.x = 2148;
powerUp.y = Math.random() * (2632 - 200) + 100;
powerUps.push(powerUp);
}
// Spawn background elements
function spawnBackground() {
var bgType = '';
var yPosition = Math.random() * 2732;
switch (currentLevel) {
case 'space':
bgType = 'star';
break;
case 'saturn':
bgType = 'saturnRing';
break;
case 'earth':
bgType = 'cloud';
break;
}
var bgElement = game.addChild(new BackgroundElement(bgType));
bgElement.x = 2148;
bgElement.y = yPosition;
backgroundElements.push(bgElement);
}
// Button event handlers
game.down = function (x, y, obj) {
if (gameState === 'levelSelect') {
var gamePos = game.toLocal(obj.parent.toGlobal(obj.position));
if (spaceButton && spaceButton.intersects({
x: gamePos.x,
y: gamePos.y,
width: 1,
height: 1
})) {
startCountdown('space');
} else if (saturnButton && saturnButton.intersects({
x: gamePos.x,
y: gamePos.y,
width: 1,
height: 1
})) {
startCountdown('saturn');
} else if (earthButton && earthButton.intersects({
x: gamePos.x,
y: gamePos.y,
width: 1,
height: 1
})) {
startCountdown('earth');
}
} else if (gameState === 'playing') {
var gamePos = game.toLocal(obj.parent.toGlobal(obj.position));
if (upButton && upButton.intersects({
x: gamePos.x,
y: gamePos.y,
width: 1,
height: 1
})) {
rocket.moveUp();
} else if (downButton && downButton.intersects({
x: gamePos.x,
y: gamePos.y,
width: 1,
height: 1
})) {
rocket.moveDown();
}
}
};
// Main game update loop
game.update = function () {
if (gameState === 'countdown') {
countdownTimer++;
if (countdownTimer % 60 === 0) {
// Every second
if (countdownValue > 0) {
countdownText.setText(countdownValue.toString());
LK.getSound('countdown').play();
countdownValue--;
} else {
countdownText.setText('BLAST OFF!');
LK.setTimeout(function () {
initGameplay();
}, 1000);
}
}
} else if (gameState === 'playing') {
distance++;
// Update score based on distance
if (distance % 60 === 0) {
LK.setScore(LK.getScore() + 10);
scoreText.setText('Score: ' + LK.getScore());
}
// Spawn obstacles
var spawnRate = 180; // Base spawn rate
if (currentLevel === 'saturn') spawnRate = 150;
if (currentLevel === 'earth') spawnRate = 120;
spawnTimer++;
if (spawnTimer >= spawnRate) {
spawnObstacle();
spawnTimer = 0;
}
// Spawn power-ups occasionally
if (LK.ticks % 300 === 0) {
spawnPowerUp();
}
// Spawn background elements
backgroundTimer++;
if (backgroundTimer >= 120) {
spawnBackground();
backgroundTimer = 0;
}
// Check obstacle collisions
for (var i = obstacles.length - 1; i >= 0; i--) {
var obstacle = obstacles[i];
if (obstacle.x < -100) {
obstacle.destroy();
obstacles.splice(i, 1);
continue;
}
if (rocket && rocket.intersects(obstacle)) {
LK.showGameOver();
return;
}
}
// Check power-up collisions
for (var i = powerUps.length - 1; i >= 0; i--) {
var powerUp = powerUps[i];
if (powerUp.x < -100) {
powerUp.destroy();
powerUps.splice(i, 1);
continue;
}
if (rocket && rocket.intersects(powerUp)) {
LK.setScore(LK.getScore() + 50);
scoreText.setText('Score: ' + LK.getScore());
LK.getSound('collect').play();
powerUp.destroy();
powerUps.splice(i, 1);
}
}
// Clean up background elements
for (var i = backgroundElements.length - 1; i >= 0; i--) {
var bgElement = backgroundElements[i];
if (bgElement.x < -200) {
bgElement.destroy();
backgroundElements.splice(i, 1);
}
}
// Check if rocket went off screen
if (rocket && rocket.x < -100) {
LK.showGameOver();
}
}
};
// Initialize level selection on start
initLevelSelect();