/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ var Coin = Container.expand(function () { var self = Container.call(this); var coinGraphics = self.attachAsset('coin', { anchorX: 0.5, anchorY: 0.5 }); self.collected = false; self.bobOffset = Math.random() * Math.PI * 2; self.originalY = 0; self.update = function () { if (!self.collected) { self.y = self.originalY + Math.sin(LK.ticks * 0.1 + self.bobOffset) * 10; self.rotation += 0.05; } }; self.collect = function () { if (!self.collected) { self.collected = true; LK.getSound('coin').play(); tween(self, { scaleX: 1.5, scaleY: 1.5, alpha: 0 }, { duration: 300, onFinish: function onFinish() { self.destroy(); } }); return true; } return false; }; return self; }); var Platform = Container.expand(function (type) { var self = Container.call(this); self.type = type || 'normal'; self.used = false; self.moveDirection = 1; self.moveSpeed = 2; var assetId = 'platform'; if (self.type === 'breakable') assetId = 'breakablePlatform';else if (self.type === 'moving') assetId = 'movingPlatform';else if (self.type === 'spring') assetId = 'springPlatform'; var platformGraphics = self.attachAsset(assetId, { anchorX: 0.5, anchorY: 0.5 }); self.update = function () { if (self.type === 'moving') { self.x += self.moveSpeed * self.moveDirection; if (self.x <= 140 || self.x >= 1908) { self.moveDirection *= -1; } } }; self.onLanded = function () { if (self.type === 'breakable' && !self.used) { self.used = true; tween(self, { alpha: 0, scaleY: 0.1 }, { duration: 200, onFinish: function onFinish() { self.destroy(); } }); LK.getSound('break').play(); return false; // Don't jump } else if (self.type === 'spring') { LK.getSound('spring').play(); return -45; // Extra jump power } return true; // Normal jump }; return self; }); var Player = Container.expand(function () { var self = Container.call(this); var playerGraphics = self.attachAsset('player', { anchorX: 0.5, anchorY: 0.5 }); self.velocityY = 0; self.velocityX = 0; self.gravity = 0.6; self.jumpPower = -35; self.maxVelocityX = 18; self.friction = 0.9; self.isJumping = false; self.update = function () { // Apply gravity self.velocityY += self.gravity; // Apply velocities self.y += self.velocityY; self.x += self.velocityX; // Apply friction to horizontal movement self.velocityX *= self.friction; // Wrap around screen horizontally if (self.x < -40) { self.x = 2048 + 40; } else if (self.x > 2048 + 40) { self.x = -40; } // Check if falling (for jump detection) self.isJumping = self.velocityY > 0; }; self.jump = function (power) { if (!power) power = self.jumpPower; self.velocityY = power; LK.getSound('jump').play(); }; self.moveLeft = function () { self.velocityX = Math.max(self.velocityX - 4.0, -self.maxVelocityX); }; self.moveRight = function () { self.velocityX = Math.min(self.velocityX + 4.0, self.maxVelocityX); }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x87CEEB }); /**** * Game Code ****/ var player; var platforms = []; var coins = []; var camera = { y: 0 }; var maxHeight = 0; var platformSpacing = 200; var lastPlatformY = 2732; var totalCoins = storage.totalCoins || 0; // Initialize score display var scoreTxt = new Text2('0', { size: 80, fill: 0x000000 }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); // Initialize coin display var coinTxt = new Text2('Coins: ' + totalCoins, { size: 60, fill: 0xffd700 }); coinTxt.anchor.set(1, 0); coinTxt.x = -20; coinTxt.y = 20; LK.gui.topRight.addChild(coinTxt); // Create player player = game.addChild(new Player()); player.x = 1024; player.y = 2500; // Create initial platforms function createPlatform(x, y, type) { var platform = new Platform(type); platform.x = x; platform.y = y; platforms.push(platform); game.addChild(platform); return platform; } // Create coin function function createCoin(x, y) { var coin = new Coin(); coin.x = x; coin.y = y; coin.originalY = y; coins.push(coin); game.addChild(coin); return coin; } // Generate initial platforms for (var i = 0; i < 15; i++) { var platformY = 2732 - i * platformSpacing; var platformX = Math.random() * (2048 - 280) + 140; var platformType = 'normal'; if (i > 2) { var rand = Math.random(); if (rand < 0.1) platformType = 'breakable';else if (rand < 0.2) platformType = 'moving';else if (rand < 0.25) platformType = 'spring'; } createPlatform(platformX, platformY, platformType); // Add coins near some platforms if (i > 0 && Math.random() < 0.4) { var coinX = platformX + (Math.random() - 0.5) * 200; coinX = Math.max(40, Math.min(2008, coinX)); createCoin(coinX, platformY - 80); } lastPlatformY = platformY; } // Generate more platforms as needed function generatePlatforms() { while (lastPlatformY > camera.y - 1000) { lastPlatformY -= platformSpacing + (Math.random() * 100 - 50); var platformX = Math.random() * (2048 - 280) + 140; var platformType = 'normal'; var rand = Math.random(); if (rand < 0.15) platformType = 'breakable';else if (rand < 0.3) platformType = 'moving';else if (rand < 0.35) platformType = 'spring'; createPlatform(platformX, lastPlatformY, platformType); // Add coins near some platforms if (Math.random() < 0.4) { var coinX = platformX + (Math.random() - 0.5) * 200; coinX = Math.max(40, Math.min(2008, coinX)); createCoin(coinX, lastPlatformY - 80); } } } // Input handling game.down = function (x, y, obj) { if (x < 1024) { player.moveLeft(); } else { player.moveRight(); } }; game.update = function () { // Update camera to follow player var targetCameraY = player.y - 1800; if (targetCameraY < camera.y) { camera.y = targetCameraY; game.y = -camera.y; } // Update max height and score var currentHeight = Math.max(0, Math.floor((2732 - player.y) / 10)); if (currentHeight > maxHeight) { maxHeight = currentHeight; LK.setScore(maxHeight); scoreTxt.setText(maxHeight.toString()); } // Generate new platforms generatePlatforms(); // Check coin collisions for (var i = coins.length - 1; i >= 0; i--) { var coin = coins[i]; // Remove coins that are too far below if (coin.y > camera.y + 3000) { coin.destroy(); coins.splice(i, 1); continue; } // Check collision with player if (!coin.collected && player.intersects(coin)) { if (coin.collect()) { totalCoins++; storage.totalCoins = totalCoins; coinTxt.setText('Coins: ' + totalCoins); coins.splice(i, 1); } } } // Check platform collisions for (var i = platforms.length - 1; i >= 0; i--) { var platform = platforms[i]; // Remove platforms that are too far below if (platform.y > camera.y + 3000) { platform.destroy(); platforms.splice(i, 1); continue; } // Check collision with player if (player.isJumping && player.intersects(platform)) { var playerBottom = player.y + 40; var platformTop = platform.y - 20; if (playerBottom > platformTop && playerBottom < platformTop + 50) { var jumpResult = platform.onLanded(); if (jumpResult === false) { // Breakable platform - no jump continue; } else if (typeof jumpResult === 'number') { // Spring platform - custom jump power player.jump(jumpResult); } else { // Normal platform - regular jump player.jump(); } } } } // Game over condition if (player.y > camera.y + 2732 + 200) { LK.showGameOver(); } };
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var Coin = Container.expand(function () {
var self = Container.call(this);
var coinGraphics = self.attachAsset('coin', {
anchorX: 0.5,
anchorY: 0.5
});
self.collected = false;
self.bobOffset = Math.random() * Math.PI * 2;
self.originalY = 0;
self.update = function () {
if (!self.collected) {
self.y = self.originalY + Math.sin(LK.ticks * 0.1 + self.bobOffset) * 10;
self.rotation += 0.05;
}
};
self.collect = function () {
if (!self.collected) {
self.collected = true;
LK.getSound('coin').play();
tween(self, {
scaleX: 1.5,
scaleY: 1.5,
alpha: 0
}, {
duration: 300,
onFinish: function onFinish() {
self.destroy();
}
});
return true;
}
return false;
};
return self;
});
var Platform = Container.expand(function (type) {
var self = Container.call(this);
self.type = type || 'normal';
self.used = false;
self.moveDirection = 1;
self.moveSpeed = 2;
var assetId = 'platform';
if (self.type === 'breakable') assetId = 'breakablePlatform';else if (self.type === 'moving') assetId = 'movingPlatform';else if (self.type === 'spring') assetId = 'springPlatform';
var platformGraphics = self.attachAsset(assetId, {
anchorX: 0.5,
anchorY: 0.5
});
self.update = function () {
if (self.type === 'moving') {
self.x += self.moveSpeed * self.moveDirection;
if (self.x <= 140 || self.x >= 1908) {
self.moveDirection *= -1;
}
}
};
self.onLanded = function () {
if (self.type === 'breakable' && !self.used) {
self.used = true;
tween(self, {
alpha: 0,
scaleY: 0.1
}, {
duration: 200,
onFinish: function onFinish() {
self.destroy();
}
});
LK.getSound('break').play();
return false; // Don't jump
} else if (self.type === 'spring') {
LK.getSound('spring').play();
return -45; // Extra jump power
}
return true; // Normal jump
};
return self;
});
var Player = Container.expand(function () {
var self = Container.call(this);
var playerGraphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
self.velocityY = 0;
self.velocityX = 0;
self.gravity = 0.6;
self.jumpPower = -35;
self.maxVelocityX = 18;
self.friction = 0.9;
self.isJumping = false;
self.update = function () {
// Apply gravity
self.velocityY += self.gravity;
// Apply velocities
self.y += self.velocityY;
self.x += self.velocityX;
// Apply friction to horizontal movement
self.velocityX *= self.friction;
// Wrap around screen horizontally
if (self.x < -40) {
self.x = 2048 + 40;
} else if (self.x > 2048 + 40) {
self.x = -40;
}
// Check if falling (for jump detection)
self.isJumping = self.velocityY > 0;
};
self.jump = function (power) {
if (!power) power = self.jumpPower;
self.velocityY = power;
LK.getSound('jump').play();
};
self.moveLeft = function () {
self.velocityX = Math.max(self.velocityX - 4.0, -self.maxVelocityX);
};
self.moveRight = function () {
self.velocityX = Math.min(self.velocityX + 4.0, self.maxVelocityX);
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87CEEB
});
/****
* Game Code
****/
var player;
var platforms = [];
var coins = [];
var camera = {
y: 0
};
var maxHeight = 0;
var platformSpacing = 200;
var lastPlatformY = 2732;
var totalCoins = storage.totalCoins || 0;
// Initialize score display
var scoreTxt = new Text2('0', {
size: 80,
fill: 0x000000
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Initialize coin display
var coinTxt = new Text2('Coins: ' + totalCoins, {
size: 60,
fill: 0xffd700
});
coinTxt.anchor.set(1, 0);
coinTxt.x = -20;
coinTxt.y = 20;
LK.gui.topRight.addChild(coinTxt);
// Create player
player = game.addChild(new Player());
player.x = 1024;
player.y = 2500;
// Create initial platforms
function createPlatform(x, y, type) {
var platform = new Platform(type);
platform.x = x;
platform.y = y;
platforms.push(platform);
game.addChild(platform);
return platform;
}
// Create coin function
function createCoin(x, y) {
var coin = new Coin();
coin.x = x;
coin.y = y;
coin.originalY = y;
coins.push(coin);
game.addChild(coin);
return coin;
}
// Generate initial platforms
for (var i = 0; i < 15; i++) {
var platformY = 2732 - i * platformSpacing;
var platformX = Math.random() * (2048 - 280) + 140;
var platformType = 'normal';
if (i > 2) {
var rand = Math.random();
if (rand < 0.1) platformType = 'breakable';else if (rand < 0.2) platformType = 'moving';else if (rand < 0.25) platformType = 'spring';
}
createPlatform(platformX, platformY, platformType);
// Add coins near some platforms
if (i > 0 && Math.random() < 0.4) {
var coinX = platformX + (Math.random() - 0.5) * 200;
coinX = Math.max(40, Math.min(2008, coinX));
createCoin(coinX, platformY - 80);
}
lastPlatformY = platformY;
}
// Generate more platforms as needed
function generatePlatforms() {
while (lastPlatformY > camera.y - 1000) {
lastPlatformY -= platformSpacing + (Math.random() * 100 - 50);
var platformX = Math.random() * (2048 - 280) + 140;
var platformType = 'normal';
var rand = Math.random();
if (rand < 0.15) platformType = 'breakable';else if (rand < 0.3) platformType = 'moving';else if (rand < 0.35) platformType = 'spring';
createPlatform(platformX, lastPlatformY, platformType);
// Add coins near some platforms
if (Math.random() < 0.4) {
var coinX = platformX + (Math.random() - 0.5) * 200;
coinX = Math.max(40, Math.min(2008, coinX));
createCoin(coinX, lastPlatformY - 80);
}
}
}
// Input handling
game.down = function (x, y, obj) {
if (x < 1024) {
player.moveLeft();
} else {
player.moveRight();
}
};
game.update = function () {
// Update camera to follow player
var targetCameraY = player.y - 1800;
if (targetCameraY < camera.y) {
camera.y = targetCameraY;
game.y = -camera.y;
}
// Update max height and score
var currentHeight = Math.max(0, Math.floor((2732 - player.y) / 10));
if (currentHeight > maxHeight) {
maxHeight = currentHeight;
LK.setScore(maxHeight);
scoreTxt.setText(maxHeight.toString());
}
// Generate new platforms
generatePlatforms();
// Check coin collisions
for (var i = coins.length - 1; i >= 0; i--) {
var coin = coins[i];
// Remove coins that are too far below
if (coin.y > camera.y + 3000) {
coin.destroy();
coins.splice(i, 1);
continue;
}
// Check collision with player
if (!coin.collected && player.intersects(coin)) {
if (coin.collect()) {
totalCoins++;
storage.totalCoins = totalCoins;
coinTxt.setText('Coins: ' + totalCoins);
coins.splice(i, 1);
}
}
}
// Check platform collisions
for (var i = platforms.length - 1; i >= 0; i--) {
var platform = platforms[i];
// Remove platforms that are too far below
if (platform.y > camera.y + 3000) {
platform.destroy();
platforms.splice(i, 1);
continue;
}
// Check collision with player
if (player.isJumping && player.intersects(platform)) {
var playerBottom = player.y + 40;
var platformTop = platform.y - 20;
if (playerBottom > platformTop && playerBottom < platformTop + 50) {
var jumpResult = platform.onLanded();
if (jumpResult === false) {
// Breakable platform - no jump
continue;
} else if (typeof jumpResult === 'number') {
// Spring platform - custom jump power
player.jump(jumpResult);
} else {
// Normal platform - regular jump
player.jump();
}
}
}
}
// Game over condition
if (player.y > camera.y + 2732 + 200) {
LK.showGameOver();
}
};