/****
* 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
}
}); ===================================================================
--- original.js
+++ change.js
@@ -139,9 +139,9 @@
/****
* Initialize Game
****/
var game = new LK.Game({
- backgroundColor: 0x87CEEB
+ backgroundColor: 0x000000
});
/****
* Game Code