/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1", { highScore: 0 }); /**** * Classes ****/ var Cloud = Container.expand(function () { var self = Container.call(this); var cloudGraphics = self.attachAsset('cloud', { anchorX: 0.5, anchorY: 0.5, alpha: 0.7 + Math.random() * 0.3 // Varied transparency }); self.speed = 0.5 + Math.random() * 1.5; // Varied speed self.update = function () { self.x -= self.speed; // Reset cloud position when it goes off screen if (self.x < -cloudGraphics.width) { self.x = 2048 + cloudGraphics.width; self.y = 200 + Math.random() * 300; } }; return self; }); var Coin = Container.expand(function () { var self = Container.call(this); var coinGraphics = self.attachAsset('coin', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 0; self.type = 'coin'; // Bobbing animation tween(coinGraphics, { y: 10 }, { duration: 800, easing: tween.easeInOut, onFinish: function onFinish() { tween(coinGraphics, { y: -10 }, { duration: 800, easing: tween.easeInOut, onFinish: function onFinish() { // Reset position and restart animation coinGraphics.y = 0; self.update(); } }); } }); self.update = function () { self.x -= self.speed; }; return self; }); var Obstacle = Container.expand(function () { var self = Container.call(this); var obstacleGraphics = self.attachAsset('obstacle', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 0; self.type = 'obstacle'; self.update = function () { self.x -= self.speed; }; return self; }); var Player = Container.expand(function () { var self = Container.call(this); var playerGraphics = self.attachAsset('player', { anchorX: 0.5, anchorY: 0.5 }); self.velocity = 0; self.gravity = 0.8; self.jumpForce = -18; self.isJumping = false; self.isInvincible = false; self.update = function () { // Apply gravity self.velocity += self.gravity; self.y += self.velocity; // Ground collision if (self.y > GROUND_LEVEL - playerGraphics.height / 2) { self.y = GROUND_LEVEL - playerGraphics.height / 2; self.velocity = 0; self.isJumping = false; } }; self.jump = function () { if (!self.isJumping) { self.velocity = self.jumpForce; self.isJumping = true; LK.getSound('jump').play(); } }; self.makeInvincible = function (duration) { if (self.invincibleTimeout) { LK.clearTimeout(self.invincibleTimeout); } self.isInvincible = true; // Flash effect var flashInterval = LK.setInterval(function () { playerGraphics.alpha = playerGraphics.alpha === 1 ? 0.4 : 1; }, 150); self.invincibleTimeout = LK.setTimeout(function () { self.isInvincible = false; playerGraphics.alpha = 1; LK.clearInterval(flashInterval); }, duration); }; 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 = 0; self.type = 'powerup'; // Rotate animation self.rotationSpeed = 0.02; self.update = function () { self.x -= self.speed; powerupGraphics.rotation += self.rotationSpeed; }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000000 }); /**** * Game Code ****/ // Constants var GROUND_LEVEL = 2500; var BASE_SPEED = 8; var SCORE_MULTIPLIER = 0.1; var DIFFICULTY_INCREASE_RATE = 0.0001; // Game variables var player; var ground; var obstacles = []; var coins = []; var powerups = []; var clouds = []; var gameSpeed = BASE_SPEED; var distanceCounter = 0; var lastObstacleSpawn = 0; var lastCoinSpawn = 0; var lastPowerupSpawn = 0; var obstacleSpawnDistance = 300; var isGameActive = true; var highScore = storage.highScore || 0; // Setup UI var scoreTxt = new Text2('0', { size: 100, fill: 0xFFFFFF }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); var highScoreTxt = new Text2('HIGH: 0', { size: 60, fill: 0xFFFFFF }); highScoreTxt.anchor.set(0.5, 0); highScoreTxt.y = 110; LK.gui.top.addChild(highScoreTxt); highScoreTxt.setText('HIGH: ' + highScore); // Initialize ground ground = LK.getAsset('ground', { anchorX: 0, anchorY: 0, x: 0, y: GROUND_LEVEL }); game.addChild(ground); // Initialize player player = new Player(); player.x = 300; player.y = GROUND_LEVEL - 100; game.addChild(player); // Initialize clouds function createInitialClouds() { for (var i = 0; i < 5; i++) { var cloud = new Cloud(); cloud.x = Math.random() * 2048; cloud.y = 200 + Math.random() * 300; clouds.push(cloud); game.addChild(cloud); } } createInitialClouds(); // Game mechanics functions function spawnObstacle() { var obstacle = new Obstacle(); obstacle.x = 2100; obstacle.y = GROUND_LEVEL - obstacle.height / 2; obstacle.speed = gameSpeed; obstacles.push(obstacle); game.addChild(obstacle); } function spawnCoin() { var coin = new Coin(); coin.x = 2100; coin.y = GROUND_LEVEL - 150 - Math.random() * 200; // Random height coin.speed = gameSpeed; coins.push(coin); game.addChild(coin); } function spawnPowerUp() { var powerup = new PowerUp(); powerup.x = 2100; powerup.y = GROUND_LEVEL - 150 - Math.random() * 100; powerup.speed = gameSpeed; powerups.push(powerup); game.addChild(powerup); } function checkCollisions() { // Check obstacle collisions for (var i = obstacles.length - 1; i >= 0; i--) { if (player.intersects(obstacles[i]) && !player.isInvincible) { LK.getSound('hit').play(); LK.effects.flashScreen(0xff0000, 500); // Game over handling if (LK.getScore() > highScore) { highScore = LK.getScore(); storage.highScore = highScore; highScoreTxt.setText('HIGH: ' + Math.floor(highScore)); } LK.showGameOver(); isGameActive = false; return; } } // Check coin collisions for (var j = coins.length - 1; j >= 0; j--) { if (player.intersects(coins[j])) { LK.getSound('collect').play(); LK.setScore(LK.getScore() + 10); scoreTxt.setText(Math.floor(LK.getScore())); // Remove coin coins[j].destroy(); coins.splice(j, 1); } } // Check powerup collisions for (var k = powerups.length - 1; k >= 0; k--) { if (player.intersects(powerups[k])) { LK.getSound('powerup').play(); // Apply powerup effect (invincibility) player.makeInvincible(5000); // Remove powerup powerups[k].destroy(); powerups.splice(k, 1); } } } function updateObjects() { // Update game elements for (var i = obstacles.length - 1; i >= 0; i--) { obstacles[i].speed = gameSpeed; if (obstacles[i].x < -obstacles[i].width) { obstacles[i].destroy(); obstacles.splice(i, 1); } } for (var j = coins.length - 1; j >= 0; j--) { coins[j].speed = gameSpeed; if (coins[j].x < -coins[j].width) { coins[j].destroy(); coins.splice(j, 1); } } for (var k = powerups.length - 1; k >= 0; k--) { powerups[k].speed = gameSpeed; if (powerups[k].x < -powerups[k].width) { powerups[k].destroy(); powerups.splice(k, 1); } } } // Input handlers game.down = function (x, y, obj) { player.jump(); }; // Main game loop game.update = function () { if (!isGameActive) return; // Update distance and score distanceCounter += gameSpeed; LK.setScore(LK.getScore() + SCORE_MULTIPLIER); if (LK.ticks % 10 === 0) { scoreTxt.setText(Math.floor(LK.getScore())); } // Increase difficulty gameSpeed = BASE_SPEED + distanceCounter * DIFFICULTY_INCREASE_RATE; // Spawn obstacles if (distanceCounter - lastObstacleSpawn > obstacleSpawnDistance) { spawnObstacle(); lastObstacleSpawn = distanceCounter; // Make obstacles appear more frequently as game progresses obstacleSpawnDistance = 300 - Math.min(150, Math.floor(distanceCounter / 500)); } // Spawn coins if (distanceCounter - lastCoinSpawn > 500) { spawnCoin(); lastCoinSpawn = distanceCounter; } // Spawn powerups (less frequently) if (distanceCounter - lastPowerupSpawn > 2000) { spawnPowerUp(); lastPowerupSpawn = distanceCounter; } // Update all game objects updateObjects(); // Check for collisions checkCollisions(); }; // Start background music LK.playMusic('bgmusic', { fade: { start: 0, end: 0.4, duration: 1000 } });
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1", {
highScore: 0
});
/****
* Classes
****/
var Cloud = Container.expand(function () {
var self = Container.call(this);
var cloudGraphics = self.attachAsset('cloud', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.7 + Math.random() * 0.3 // Varied transparency
});
self.speed = 0.5 + Math.random() * 1.5; // Varied speed
self.update = function () {
self.x -= self.speed;
// Reset cloud position when it goes off screen
if (self.x < -cloudGraphics.width) {
self.x = 2048 + cloudGraphics.width;
self.y = 200 + Math.random() * 300;
}
};
return self;
});
var Coin = Container.expand(function () {
var self = Container.call(this);
var coinGraphics = self.attachAsset('coin', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 0;
self.type = 'coin';
// Bobbing animation
tween(coinGraphics, {
y: 10
}, {
duration: 800,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(coinGraphics, {
y: -10
}, {
duration: 800,
easing: tween.easeInOut,
onFinish: function onFinish() {
// Reset position and restart animation
coinGraphics.y = 0;
self.update();
}
});
}
});
self.update = function () {
self.x -= self.speed;
};
return self;
});
var Obstacle = Container.expand(function () {
var self = Container.call(this);
var obstacleGraphics = self.attachAsset('obstacle', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 0;
self.type = 'obstacle';
self.update = function () {
self.x -= self.speed;
};
return self;
});
var Player = Container.expand(function () {
var self = Container.call(this);
var playerGraphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
self.velocity = 0;
self.gravity = 0.8;
self.jumpForce = -18;
self.isJumping = false;
self.isInvincible = false;
self.update = function () {
// Apply gravity
self.velocity += self.gravity;
self.y += self.velocity;
// Ground collision
if (self.y > GROUND_LEVEL - playerGraphics.height / 2) {
self.y = GROUND_LEVEL - playerGraphics.height / 2;
self.velocity = 0;
self.isJumping = false;
}
};
self.jump = function () {
if (!self.isJumping) {
self.velocity = self.jumpForce;
self.isJumping = true;
LK.getSound('jump').play();
}
};
self.makeInvincible = function (duration) {
if (self.invincibleTimeout) {
LK.clearTimeout(self.invincibleTimeout);
}
self.isInvincible = true;
// Flash effect
var flashInterval = LK.setInterval(function () {
playerGraphics.alpha = playerGraphics.alpha === 1 ? 0.4 : 1;
}, 150);
self.invincibleTimeout = LK.setTimeout(function () {
self.isInvincible = false;
playerGraphics.alpha = 1;
LK.clearInterval(flashInterval);
}, duration);
};
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 = 0;
self.type = 'powerup';
// Rotate animation
self.rotationSpeed = 0.02;
self.update = function () {
self.x -= self.speed;
powerupGraphics.rotation += self.rotationSpeed;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000000
});
/****
* Game Code
****/
// Constants
var GROUND_LEVEL = 2500;
var BASE_SPEED = 8;
var SCORE_MULTIPLIER = 0.1;
var DIFFICULTY_INCREASE_RATE = 0.0001;
// Game variables
var player;
var ground;
var obstacles = [];
var coins = [];
var powerups = [];
var clouds = [];
var gameSpeed = BASE_SPEED;
var distanceCounter = 0;
var lastObstacleSpawn = 0;
var lastCoinSpawn = 0;
var lastPowerupSpawn = 0;
var obstacleSpawnDistance = 300;
var isGameActive = true;
var highScore = storage.highScore || 0;
// Setup UI
var scoreTxt = new Text2('0', {
size: 100,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
var highScoreTxt = new Text2('HIGH: 0', {
size: 60,
fill: 0xFFFFFF
});
highScoreTxt.anchor.set(0.5, 0);
highScoreTxt.y = 110;
LK.gui.top.addChild(highScoreTxt);
highScoreTxt.setText('HIGH: ' + highScore);
// Initialize ground
ground = LK.getAsset('ground', {
anchorX: 0,
anchorY: 0,
x: 0,
y: GROUND_LEVEL
});
game.addChild(ground);
// Initialize player
player = new Player();
player.x = 300;
player.y = GROUND_LEVEL - 100;
game.addChild(player);
// Initialize clouds
function createInitialClouds() {
for (var i = 0; i < 5; i++) {
var cloud = new Cloud();
cloud.x = Math.random() * 2048;
cloud.y = 200 + Math.random() * 300;
clouds.push(cloud);
game.addChild(cloud);
}
}
createInitialClouds();
// Game mechanics functions
function spawnObstacle() {
var obstacle = new Obstacle();
obstacle.x = 2100;
obstacle.y = GROUND_LEVEL - obstacle.height / 2;
obstacle.speed = gameSpeed;
obstacles.push(obstacle);
game.addChild(obstacle);
}
function spawnCoin() {
var coin = new Coin();
coin.x = 2100;
coin.y = GROUND_LEVEL - 150 - Math.random() * 200; // Random height
coin.speed = gameSpeed;
coins.push(coin);
game.addChild(coin);
}
function spawnPowerUp() {
var powerup = new PowerUp();
powerup.x = 2100;
powerup.y = GROUND_LEVEL - 150 - Math.random() * 100;
powerup.speed = gameSpeed;
powerups.push(powerup);
game.addChild(powerup);
}
function checkCollisions() {
// Check obstacle collisions
for (var i = obstacles.length - 1; i >= 0; i--) {
if (player.intersects(obstacles[i]) && !player.isInvincible) {
LK.getSound('hit').play();
LK.effects.flashScreen(0xff0000, 500);
// Game over handling
if (LK.getScore() > highScore) {
highScore = LK.getScore();
storage.highScore = highScore;
highScoreTxt.setText('HIGH: ' + Math.floor(highScore));
}
LK.showGameOver();
isGameActive = false;
return;
}
}
// Check coin collisions
for (var j = coins.length - 1; j >= 0; j--) {
if (player.intersects(coins[j])) {
LK.getSound('collect').play();
LK.setScore(LK.getScore() + 10);
scoreTxt.setText(Math.floor(LK.getScore()));
// Remove coin
coins[j].destroy();
coins.splice(j, 1);
}
}
// Check powerup collisions
for (var k = powerups.length - 1; k >= 0; k--) {
if (player.intersects(powerups[k])) {
LK.getSound('powerup').play();
// Apply powerup effect (invincibility)
player.makeInvincible(5000);
// Remove powerup
powerups[k].destroy();
powerups.splice(k, 1);
}
}
}
function updateObjects() {
// Update game elements
for (var i = obstacles.length - 1; i >= 0; i--) {
obstacles[i].speed = gameSpeed;
if (obstacles[i].x < -obstacles[i].width) {
obstacles[i].destroy();
obstacles.splice(i, 1);
}
}
for (var j = coins.length - 1; j >= 0; j--) {
coins[j].speed = gameSpeed;
if (coins[j].x < -coins[j].width) {
coins[j].destroy();
coins.splice(j, 1);
}
}
for (var k = powerups.length - 1; k >= 0; k--) {
powerups[k].speed = gameSpeed;
if (powerups[k].x < -powerups[k].width) {
powerups[k].destroy();
powerups.splice(k, 1);
}
}
}
// Input handlers
game.down = function (x, y, obj) {
player.jump();
};
// Main game loop
game.update = function () {
if (!isGameActive) return;
// Update distance and score
distanceCounter += gameSpeed;
LK.setScore(LK.getScore() + SCORE_MULTIPLIER);
if (LK.ticks % 10 === 0) {
scoreTxt.setText(Math.floor(LK.getScore()));
}
// Increase difficulty
gameSpeed = BASE_SPEED + distanceCounter * DIFFICULTY_INCREASE_RATE;
// Spawn obstacles
if (distanceCounter - lastObstacleSpawn > obstacleSpawnDistance) {
spawnObstacle();
lastObstacleSpawn = distanceCounter;
// Make obstacles appear more frequently as game progresses
obstacleSpawnDistance = 300 - Math.min(150, Math.floor(distanceCounter / 500));
}
// Spawn coins
if (distanceCounter - lastCoinSpawn > 500) {
spawnCoin();
lastCoinSpawn = distanceCounter;
}
// Spawn powerups (less frequently)
if (distanceCounter - lastPowerupSpawn > 2000) {
spawnPowerUp();
lastPowerupSpawn = distanceCounter;
}
// Update all game objects
updateObjects();
// Check for collisions
checkCollisions();
};
// Start background music
LK.playMusic('bgmusic', {
fade: {
start: 0,
end: 0.4,
duration: 1000
}
});