/**** * Classes ****/ // Asteroid class var Asteroid = Container.expand(function () { var self = Container.call(this); var asteroidGraphics = self.attachAsset('asteroid', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 5; self.update = function () { self.y += self.speed; }; }); //<Assets used in the game will automatically appear here> // Slow Motion Power-Up class var SlowMotionPowerUp = Container.expand(function () { var self = Container.call(this); var powerupGraphics = self.attachAsset('slowmo', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 6; self.update = function () { self.y += self.speed; }; return self; }); // Spaceship class var Spaceship = Container.expand(function () { var self = Container.call(this); var spaceshipGraphics = self.attachAsset('spaceship', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 10; self.update = function () { // Spaceship update logic if needed }; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000000 //Init game with black background }); /**** * Game Code ****/ // Decorative star (pixelated, small) // Decorative planet (different from moon, pixelated style) // Title screen state and UI var gameState = "title"; var titleContainer = new Container(); var startButton = null; var titleText = null; // Decorative asteroid (left) var decoAsteroidL = LK.getAsset('asteroid', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.2, scaleY: 1.2 }); decoAsteroidL.x = 2048 * 0.25; decoAsteroidL.y = 650; titleContainer.addChild(decoAsteroidL); // Decorative asteroid (right) var decoAsteroidR = LK.getAsset('asteroid', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.2, scaleY: 1.2 }); decoAsteroidR.x = 2048 * 0.75; decoAsteroidR.y = 650; titleContainer.addChild(decoAsteroidR); // Decorative slowmo powerup (left) var decoPowerupL = LK.getAsset('slowmo', { anchorX: 0.5, anchorY: 0.5, scaleX: 1, scaleY: 1 }); decoPowerupL.x = 2048 * 0.18; decoPowerupL.y = 1100; titleContainer.addChild(decoPowerupL); // Decorative slowmo powerup (right) var decoPowerupR = LK.getAsset('slowmo', { anchorX: 0.5, anchorY: 0.5, scaleX: 1, scaleY: 1 }); decoPowerupR.x = 2048 * 0.82; decoPowerupR.y = 1100; titleContainer.addChild(decoPowerupR); // Decorative spaceship (center, above title) var decoShip = LK.getAsset('spaceship', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.3, scaleY: 1.3 }); decoShip.x = 2048 / 2; decoShip.y = 600; titleContainer.addChild(decoShip); // Decorative pixelated moon at the bottom center // Use a placeholder moon asset (add to Assets if not present) var decoMoon = LK.getAsset('moon', { anchorX: 0.5, anchorY: 1, scaleX: 1.5, scaleY: 1.5 }); decoMoon.x = 2048 / 2; decoMoon.y = 2732 - 40; titleContainer.addChild(decoMoon); // Title text titleText = new Text2("ASTEROID DODGE", { size: 180, fill: 0xffffff }); titleText.anchor.set(0.5, 0.5); titleText.x = 2048 / 2; titleText.y = 900; titleContainer.addChild(titleText); // Decorative subtitle var subtitleText = new Text2("Dodge asteroids, grab power-ups, survive!", { size: 80, fill: 0xccccff }); subtitleText.anchor.set(0.5, 0.5); subtitleText.x = 2048 / 2; subtitleText.y = 1080; titleContainer.addChild(subtitleText); // Start button startButton = new Container(); var btnBg = LK.getAsset('centerCircle', { anchorX: 0.5, anchorY: 0.5, scaleX: 3, scaleY: 1.2, tint: 0x3399ff }); btnBg.x = 0; btnBg.y = 0; startButton.addChild(btnBg); var btnText = new Text2("START", { size: 120, fill: 0xffffff }); btnText.anchor.set(0.5, 0.5); btnText.x = 0; btnText.y = 0; startButton.addChild(btnText); startButton.x = 2048 / 2; startButton.y = 1400; titleContainer.addChild(startButton); // Add titleContainer to game game.addChild(titleContainer); // Spaceship and asteroids (initialized after pressing start) var spaceship = null; var asteroids = []; // Decorative gameplay background elements var decorStars = []; var decorPlanet = null; // Slow motion power-up variables var slowMotionActive = false; var slowMotionTimer = 0; var SLOW_MOTION_DURATION = 180; // 3 seconds at 60fps var SLOW_MOTION_FACTOR = 0.3; // Asteroids move at 30% speed // Score text (initialized after pressing start) var scoreTxt = null; // --- Decorative assets for gameplay background --- // (Removed decorative moon/planet from top right) // Add several stars (using centerCircle asset, different tints/sizes) for (var i = 0; i < 8; i++) { var star = LK.getAsset('centerCircle', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.18 + Math.random() * 0.12, scaleY: 0.18 + Math.random() * 0.12, tint: [0xffffff, 0xfffbe0, 0xbbeeff, 0xffeedd][Math.floor(Math.random() * 4)] }); // Randomly position stars, avoid top left 100x100 var sx = 120 + Math.random() * (2048 - 240); var sy = 120 + Math.random() * (2732 - 240); star.x = sx; star.y = sy; game.addChild(star); decorStars.push(star); } // Start button event startButton.down = function (x, y, obj) { if (gameState !== "title") { return; } // Remove title UI titleContainer.visible = false; // Start game gameState = "playing"; // Initialize spaceship spaceship = game.addChild(new Spaceship()); spaceship.x = 2048 / 2; spaceship.y = 2732 - 200; // Initialize asteroids array asteroids = []; // Reset slow motion slowMotionActive = false; slowMotionTimer = 0; // Initialize score LK.setScore(0); // Score display if (scoreTxt) { scoreTxt.setText("0"); scoreTxt.visible = true; } else { scoreTxt = new Text2('0', { size: 150, fill: 0xFFFFFF }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); } }; // Function to handle spaceship movement function handleMove(x, y, obj) { if (gameState !== "playing" || !spaceship) { return; } spaceship.x = x; // spaceship.y = y; // Commented out to restrict vertical movement } // Game move event game.move = function (x, y, obj) { if (gameState === "title") { return; } handleMove(x, y, obj); }; // Game update function game.update = function () { // Title screen logic if (gameState === "title") { // Show title UI, hide gameplay UI if (titleContainer) { titleContainer.visible = true; } if (scoreTxt) { scoreTxt.visible = false; } // Hide gameplay decor if (decorPlanet) { decorPlanet.visible = false; } for (var ds = 0; ds < decorStars.length; ds++) { decorStars[ds].visible = false; } return; } // Show gameplay UI, hide title UI if (titleContainer) { titleContainer.visible = false; } if (scoreTxt) { scoreTxt.visible = true; } // Show gameplay decor if (decorPlanet) { decorPlanet.visible = true; } for (var ds = 0; ds < decorStars.length; ds++) { decorStars[ds].visible = true; } // Dynamic difficulty variables if (typeof asteroidSpawnInterval === "undefined") { var asteroidSpawnInterval = 60; // Initial spawn interval (frames) var asteroidBaseSpeed = 5; // Initial asteroid speed var asteroidMaxSpeed = 30; // Cap asteroid speed var asteroidMinInterval = 15; // Minimum interval between spawns var asteroidDifficultyStep = 10; // Score step for difficulty increase var asteroidLastDifficultyScore = 0; } // Increase difficulty based on score var currentScore = LK.getScore(); if (currentScore - asteroidLastDifficultyScore >= asteroidDifficultyStep) { asteroidLastDifficultyScore = currentScore; // Increase speed, decrease interval asteroidBaseSpeed = Math.min(asteroidBaseSpeed + 1, asteroidMaxSpeed); asteroidSpawnInterval = Math.max(asteroidSpawnInterval - 5, asteroidMinInterval); } // Create new asteroids if (LK.ticks % asteroidSpawnInterval == 0) { var newAsteroid = new Asteroid(); newAsteroid.x = Math.random() * 2048; newAsteroid.y = -50; newAsteroid.speed = asteroidBaseSpeed; asteroids.push(newAsteroid); game.addChild(newAsteroid); // 1 in 10 chance to spawn a slow motion power-up (but not if one is already active or present) if (!slowMotionActive && Math.random() < 0.1 && typeof slowMotionPowerUp === "undefined") { slowMotionPowerUp = new SlowMotionPowerUp(); slowMotionPowerUp.x = Math.random() * 2048; slowMotionPowerUp.y = -100; game.addChild(slowMotionPowerUp); } } // Update asteroids for (var i = asteroids.length - 1; i >= 0; i--) { var asteroid = asteroids[i]; // Apply slow motion if active if (slowMotionActive) { asteroid.y += asteroid.speed * SLOW_MOTION_FACTOR; } else { asteroid.update(); } // Check for collision with spaceship if (spaceship && spaceship.intersects(asteroid)) { LK.effects.flashScreen(0xff0000, 1000); // Play collision sound if available if (LK.getSound && LK.getSound('crash')) { LK.getSound('crash').play(); } // Show game over LK.showGameOver(); // Reset to title screen after game over gameState = "title"; // Remove spaceship and asteroids if (spaceship) { spaceship.destroy(); spaceship = null; } for (var j = 0; j < asteroids.length; j++) { if (asteroids[j]) { asteroids[j].destroy(); } } asteroids = []; // Remove powerup if present if (typeof slowMotionPowerUp !== "undefined" && slowMotionPowerUp) { slowMotionPowerUp.destroy(); slowMotionPowerUp = undefined; } // Hide score if (scoreTxt) { scoreTxt.visible = false; } // Show title UI if (titleContainer) { titleContainer.visible = true; } return; } // Remove off-screen asteroids and increment score if (asteroid.y > 2732 + 50) { // Near miss visual/audio effect if asteroid was close to spaceship horizontally var dx = spaceship ? Math.abs(asteroid.x - spaceship.x) : 9999; if (dx < 200) { LK.effects.flashScreen(0xffff00, 200); // Quick yellow flash for near miss // Play near miss sound if available if (LK.getSound && LK.getSound('nearMiss')) { LK.getSound('nearMiss').play(); } } asteroid.destroy(); asteroids.splice(i, 1); LK.setScore(LK.getScore() + 1); // Increment score for each asteroid dodged if (scoreTxt) { scoreTxt.setText(LK.getScore()); } // Update score display // Play score up sound if available if (LK.getSound && LK.getSound('scoreUp')) { LK.getSound('scoreUp').play(); } // Play asteroid whoosh sound if available if (LK.getSound && LK.getSound('whoosh')) { LK.getSound('whoosh').play(); } } } // Handle slow motion power-up logic if (typeof slowMotionPowerUp !== "undefined" && slowMotionPowerUp) { // Move power-up slowMotionPowerUp.y += slowMotionPowerUp.speed; // Check for collision with spaceship if (spaceship && spaceship.intersects(slowMotionPowerUp)) { slowMotionActive = true; slowMotionTimer = SLOW_MOTION_DURATION; // Visual feedback for slow motion activation LK.effects.flashScreen(0x3399ff, 400); slowMotionPowerUp.destroy(); slowMotionPowerUp = undefined; } else if (slowMotionPowerUp.y > 2732 + 100) { // Remove if off screen slowMotionPowerUp.destroy(); slowMotionPowerUp = undefined; } } // Handle slow motion timer if (slowMotionActive) { slowMotionTimer--; if (slowMotionTimer <= 0) { slowMotionActive = false; } } };
/****
* Classes
****/
// Asteroid class
var Asteroid = Container.expand(function () {
var self = Container.call(this);
var asteroidGraphics = self.attachAsset('asteroid', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 5;
self.update = function () {
self.y += self.speed;
};
});
//<Assets used in the game will automatically appear here>
// Slow Motion Power-Up class
var SlowMotionPowerUp = Container.expand(function () {
var self = Container.call(this);
var powerupGraphics = self.attachAsset('slowmo', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 6;
self.update = function () {
self.y += self.speed;
};
return self;
});
// Spaceship class
var Spaceship = Container.expand(function () {
var self = Container.call(this);
var spaceshipGraphics = self.attachAsset('spaceship', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 10;
self.update = function () {
// Spaceship update logic if needed
};
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000000 //Init game with black background
});
/****
* Game Code
****/
// Decorative star (pixelated, small)
// Decorative planet (different from moon, pixelated style)
// Title screen state and UI
var gameState = "title";
var titleContainer = new Container();
var startButton = null;
var titleText = null;
// Decorative asteroid (left)
var decoAsteroidL = LK.getAsset('asteroid', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.2,
scaleY: 1.2
});
decoAsteroidL.x = 2048 * 0.25;
decoAsteroidL.y = 650;
titleContainer.addChild(decoAsteroidL);
// Decorative asteroid (right)
var decoAsteroidR = LK.getAsset('asteroid', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.2,
scaleY: 1.2
});
decoAsteroidR.x = 2048 * 0.75;
decoAsteroidR.y = 650;
titleContainer.addChild(decoAsteroidR);
// Decorative slowmo powerup (left)
var decoPowerupL = LK.getAsset('slowmo', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1,
scaleY: 1
});
decoPowerupL.x = 2048 * 0.18;
decoPowerupL.y = 1100;
titleContainer.addChild(decoPowerupL);
// Decorative slowmo powerup (right)
var decoPowerupR = LK.getAsset('slowmo', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1,
scaleY: 1
});
decoPowerupR.x = 2048 * 0.82;
decoPowerupR.y = 1100;
titleContainer.addChild(decoPowerupR);
// Decorative spaceship (center, above title)
var decoShip = LK.getAsset('spaceship', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.3,
scaleY: 1.3
});
decoShip.x = 2048 / 2;
decoShip.y = 600;
titleContainer.addChild(decoShip);
// Decorative pixelated moon at the bottom center
// Use a placeholder moon asset (add to Assets if not present)
var decoMoon = LK.getAsset('moon', {
anchorX: 0.5,
anchorY: 1,
scaleX: 1.5,
scaleY: 1.5
});
decoMoon.x = 2048 / 2;
decoMoon.y = 2732 - 40;
titleContainer.addChild(decoMoon);
// Title text
titleText = new Text2("ASTEROID DODGE", {
size: 180,
fill: 0xffffff
});
titleText.anchor.set(0.5, 0.5);
titleText.x = 2048 / 2;
titleText.y = 900;
titleContainer.addChild(titleText);
// Decorative subtitle
var subtitleText = new Text2("Dodge asteroids, grab power-ups, survive!", {
size: 80,
fill: 0xccccff
});
subtitleText.anchor.set(0.5, 0.5);
subtitleText.x = 2048 / 2;
subtitleText.y = 1080;
titleContainer.addChild(subtitleText);
// Start button
startButton = new Container();
var btnBg = LK.getAsset('centerCircle', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 3,
scaleY: 1.2,
tint: 0x3399ff
});
btnBg.x = 0;
btnBg.y = 0;
startButton.addChild(btnBg);
var btnText = new Text2("START", {
size: 120,
fill: 0xffffff
});
btnText.anchor.set(0.5, 0.5);
btnText.x = 0;
btnText.y = 0;
startButton.addChild(btnText);
startButton.x = 2048 / 2;
startButton.y = 1400;
titleContainer.addChild(startButton);
// Add titleContainer to game
game.addChild(titleContainer);
// Spaceship and asteroids (initialized after pressing start)
var spaceship = null;
var asteroids = [];
// Decorative gameplay background elements
var decorStars = [];
var decorPlanet = null;
// Slow motion power-up variables
var slowMotionActive = false;
var slowMotionTimer = 0;
var SLOW_MOTION_DURATION = 180; // 3 seconds at 60fps
var SLOW_MOTION_FACTOR = 0.3; // Asteroids move at 30% speed
// Score text (initialized after pressing start)
var scoreTxt = null;
// --- Decorative assets for gameplay background ---
// (Removed decorative moon/planet from top right)
// Add several stars (using centerCircle asset, different tints/sizes)
for (var i = 0; i < 8; i++) {
var star = LK.getAsset('centerCircle', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.18 + Math.random() * 0.12,
scaleY: 0.18 + Math.random() * 0.12,
tint: [0xffffff, 0xfffbe0, 0xbbeeff, 0xffeedd][Math.floor(Math.random() * 4)]
});
// Randomly position stars, avoid top left 100x100
var sx = 120 + Math.random() * (2048 - 240);
var sy = 120 + Math.random() * (2732 - 240);
star.x = sx;
star.y = sy;
game.addChild(star);
decorStars.push(star);
}
// Start button event
startButton.down = function (x, y, obj) {
if (gameState !== "title") {
return;
}
// Remove title UI
titleContainer.visible = false;
// Start game
gameState = "playing";
// Initialize spaceship
spaceship = game.addChild(new Spaceship());
spaceship.x = 2048 / 2;
spaceship.y = 2732 - 200;
// Initialize asteroids array
asteroids = [];
// Reset slow motion
slowMotionActive = false;
slowMotionTimer = 0;
// Initialize score
LK.setScore(0);
// Score display
if (scoreTxt) {
scoreTxt.setText("0");
scoreTxt.visible = true;
} else {
scoreTxt = new Text2('0', {
size: 150,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
}
};
// Function to handle spaceship movement
function handleMove(x, y, obj) {
if (gameState !== "playing" || !spaceship) {
return;
}
spaceship.x = x;
// spaceship.y = y; // Commented out to restrict vertical movement
}
// Game move event
game.move = function (x, y, obj) {
if (gameState === "title") {
return;
}
handleMove(x, y, obj);
};
// Game update function
game.update = function () {
// Title screen logic
if (gameState === "title") {
// Show title UI, hide gameplay UI
if (titleContainer) {
titleContainer.visible = true;
}
if (scoreTxt) {
scoreTxt.visible = false;
}
// Hide gameplay decor
if (decorPlanet) {
decorPlanet.visible = false;
}
for (var ds = 0; ds < decorStars.length; ds++) {
decorStars[ds].visible = false;
}
return;
}
// Show gameplay UI, hide title UI
if (titleContainer) {
titleContainer.visible = false;
}
if (scoreTxt) {
scoreTxt.visible = true;
}
// Show gameplay decor
if (decorPlanet) {
decorPlanet.visible = true;
}
for (var ds = 0; ds < decorStars.length; ds++) {
decorStars[ds].visible = true;
}
// Dynamic difficulty variables
if (typeof asteroidSpawnInterval === "undefined") {
var asteroidSpawnInterval = 60; // Initial spawn interval (frames)
var asteroidBaseSpeed = 5; // Initial asteroid speed
var asteroidMaxSpeed = 30; // Cap asteroid speed
var asteroidMinInterval = 15; // Minimum interval between spawns
var asteroidDifficultyStep = 10; // Score step for difficulty increase
var asteroidLastDifficultyScore = 0;
}
// Increase difficulty based on score
var currentScore = LK.getScore();
if (currentScore - asteroidLastDifficultyScore >= asteroidDifficultyStep) {
asteroidLastDifficultyScore = currentScore;
// Increase speed, decrease interval
asteroidBaseSpeed = Math.min(asteroidBaseSpeed + 1, asteroidMaxSpeed);
asteroidSpawnInterval = Math.max(asteroidSpawnInterval - 5, asteroidMinInterval);
}
// Create new asteroids
if (LK.ticks % asteroidSpawnInterval == 0) {
var newAsteroid = new Asteroid();
newAsteroid.x = Math.random() * 2048;
newAsteroid.y = -50;
newAsteroid.speed = asteroidBaseSpeed;
asteroids.push(newAsteroid);
game.addChild(newAsteroid);
// 1 in 10 chance to spawn a slow motion power-up (but not if one is already active or present)
if (!slowMotionActive && Math.random() < 0.1 && typeof slowMotionPowerUp === "undefined") {
slowMotionPowerUp = new SlowMotionPowerUp();
slowMotionPowerUp.x = Math.random() * 2048;
slowMotionPowerUp.y = -100;
game.addChild(slowMotionPowerUp);
}
}
// Update asteroids
for (var i = asteroids.length - 1; i >= 0; i--) {
var asteroid = asteroids[i];
// Apply slow motion if active
if (slowMotionActive) {
asteroid.y += asteroid.speed * SLOW_MOTION_FACTOR;
} else {
asteroid.update();
}
// Check for collision with spaceship
if (spaceship && spaceship.intersects(asteroid)) {
LK.effects.flashScreen(0xff0000, 1000);
// Play collision sound if available
if (LK.getSound && LK.getSound('crash')) {
LK.getSound('crash').play();
}
// Show game over
LK.showGameOver();
// Reset to title screen after game over
gameState = "title";
// Remove spaceship and asteroids
if (spaceship) {
spaceship.destroy();
spaceship = null;
}
for (var j = 0; j < asteroids.length; j++) {
if (asteroids[j]) {
asteroids[j].destroy();
}
}
asteroids = [];
// Remove powerup if present
if (typeof slowMotionPowerUp !== "undefined" && slowMotionPowerUp) {
slowMotionPowerUp.destroy();
slowMotionPowerUp = undefined;
}
// Hide score
if (scoreTxt) {
scoreTxt.visible = false;
}
// Show title UI
if (titleContainer) {
titleContainer.visible = true;
}
return;
}
// Remove off-screen asteroids and increment score
if (asteroid.y > 2732 + 50) {
// Near miss visual/audio effect if asteroid was close to spaceship horizontally
var dx = spaceship ? Math.abs(asteroid.x - spaceship.x) : 9999;
if (dx < 200) {
LK.effects.flashScreen(0xffff00, 200); // Quick yellow flash for near miss
// Play near miss sound if available
if (LK.getSound && LK.getSound('nearMiss')) {
LK.getSound('nearMiss').play();
}
}
asteroid.destroy();
asteroids.splice(i, 1);
LK.setScore(LK.getScore() + 1); // Increment score for each asteroid dodged
if (scoreTxt) {
scoreTxt.setText(LK.getScore());
} // Update score display
// Play score up sound if available
if (LK.getSound && LK.getSound('scoreUp')) {
LK.getSound('scoreUp').play();
}
// Play asteroid whoosh sound if available
if (LK.getSound && LK.getSound('whoosh')) {
LK.getSound('whoosh').play();
}
}
}
// Handle slow motion power-up logic
if (typeof slowMotionPowerUp !== "undefined" && slowMotionPowerUp) {
// Move power-up
slowMotionPowerUp.y += slowMotionPowerUp.speed;
// Check for collision with spaceship
if (spaceship && spaceship.intersects(slowMotionPowerUp)) {
slowMotionActive = true;
slowMotionTimer = SLOW_MOTION_DURATION;
// Visual feedback for slow motion activation
LK.effects.flashScreen(0x3399ff, 400);
slowMotionPowerUp.destroy();
slowMotionPowerUp = undefined;
} else if (slowMotionPowerUp.y > 2732 + 100) {
// Remove if off screen
slowMotionPowerUp.destroy();
slowMotionPowerUp = undefined;
}
}
// Handle slow motion timer
if (slowMotionActive) {
slowMotionTimer--;
if (slowMotionTimer <= 0) {
slowMotionActive = false;
}
}
};