/**** * Classes ****/ var Character = Container.expand(function () { var self = Container.call(this); var characterGraphics = self.attachAsset('character', { anchorX: 0.5, anchorY: 0.5 }); self.velocityY = 0; self.gravity = 0.8; self.jumpPower = -25.5; self.horizontalSpeed = 0; self.maxHorizontalSpeed = 12; self.onGround = false; self.jump = function () { self.velocityY = self.jumpPower; self.onGround = false; }; self.moveLeft = function () { self.horizontalSpeed = Math.max(self.horizontalSpeed - 2, -self.maxHorizontalSpeed); }; self.moveRight = function () { self.horizontalSpeed = Math.min(self.horizontalSpeed + 2, self.maxHorizontalSpeed); }; self.update = function () { // Only apply gravity if not on ground if (!self.onGround) { self.velocityY += self.gravity; } // Update position self.y += self.velocityY; self.x += self.horizontalSpeed; // Apply horizontal friction self.horizontalSpeed *= 0.85; // Screen wrapping if (self.x < 0) { self.x = 2048; } else if (self.x > 2048) { self.x = 0; } }; return self; }); var Coin = Container.expand(function () { var self = Container.call(this); var coinGraphics = self.attachAsset('coin', { anchorX: 0.5, anchorY: 0.5 }); self.hasBeenCollected = false; // Add rotation animation self.update = function () { coinGraphics.rotation += 0.1; }; return self; }); var ControlButton = Container.expand(function (direction) { var self = Container.call(this); var buttonAsset = direction === 'left' ? 'leftButton' : 'rightButton'; var buttonGraphics = self.attachAsset(buttonAsset, { anchorX: 0.5, anchorY: 0.5 }); self.direction = direction; self.alpha = 0.7; self.down = function (x, y, obj) { self.alpha = 1.0; if (self.direction === 'left') { isLeftPressed = true; } else { isRightPressed = true; } }; self.up = function (x, y, obj) { self.alpha = 0.7; if (self.direction === 'left') { isLeftPressed = false; } else { isRightPressed = false; } }; return self; }); var FragilePlatform = Container.expand(function () { var self = Container.call(this); var platformGraphics = self.attachAsset('fragilePlatform', { anchorX: 0.5, anchorY: 0.5 }); self.hasBeenLandedOn = false; self.isBroken = false; self.breakPlatform = function () { self.isBroken = true; platformGraphics.alpha = 0.3; // Platform will be removed after a short delay LK.setTimeout(function () { if (self.parent) { self.destroy(); } }, 200); }; return self; }); var Platform = Container.expand(function () { var self = Container.call(this); var platformGraphics = self.attachAsset('platform', { anchorX: 0.5, anchorY: 0.5 }); self.hasBeenLandedOn = false; return self; }); var SpawnPlatform = Container.expand(function () { var self = Container.call(this); var spawnPlatformGraphics = self.attachAsset('spawnPlatform', { anchorX: 0.5, anchorY: 0.5 }); return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x87CEEB }); /**** * Game Code ****/ var character; var platforms = []; var coins = []; var spawnPlatform; var leftButton; var rightButton; var cameraOffsetY = 0; var isLeftPressed = false; var isRightPressed = false; var gameSpeed = 1; // Create score display var scoreTxt = new Text2('0', { size: 80, fill: 0xFFFFFF }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); // Create spawn platform spawnPlatform = game.addChild(new SpawnPlatform()); spawnPlatform.x = 1024; spawnPlatform.y = 2500; // Create character character = game.addChild(new Character()); character.x = 1024; character.y = 2400; // Generate initial platforms function generatePlatform(y) { var platform; // 30% chance to create fragile platform if (Math.random() < 0.3) { platform = new FragilePlatform(); } else { platform = new Platform(); } platform.x = Math.random() * 1500 + 124; // Keep platforms within screen bounds platform.y = y; platforms.push(platform); game.addChild(platform); } function generateCoin(y) { var coin = new Coin(); coin.x = Math.random() * 1500 + 124; // Keep coins within screen bounds coin.y = y - 100; // Position coins above platforms coins.push(coin); game.addChild(coin); } // Generate initial platforms with closer spacing for (var i = 0; i < 20; i++) { generatePlatform(2200 - i * 80); // Reduced to 80 for much closer spacing // 15% chance to generate a coin near this platform if (Math.random() < 0.15) { generateCoin(2200 - i * 80); } } // Create control buttons leftButton = new ControlButton('left'); leftButton.x = 200; leftButton.y = 2600; LK.gui.bottomLeft.addChild(leftButton); rightButton = new ControlButton('right'); rightButton.x = 200; rightButton.y = 2600; LK.gui.bottomRight.addChild(rightButton); // Position buttons correctly leftButton.x = 150; leftButton.y = -100; rightButton.x = -150; rightButton.y = -100; function checkPlatformCollisions() { var wasOnGround = character.onGround; character.onGround = false; // Check collision with spawn platform first if (character.velocityY >= 0 && character.y + 40 >= spawnPlatform.y - 15 && character.y - 40 <= spawnPlatform.y + 15 && character.x >= spawnPlatform.x - 150 && character.x <= spawnPlatform.x + 150) { character.y = spawnPlatform.y - 40; character.velocityY = 0; character.onGround = true; // Only jump if we just landed (not if we were already on ground) if (!wasOnGround) { character.jump(); } return; } // Check regular platforms for (var i = platforms.length - 1; i >= 0; i--) { var platform = platforms[i]; // Skip broken fragile platforms if (platform.isBroken) { continue; } if (character.velocityY >= 0 && character.y + 40 >= platform.y - 10 && character.y - 40 <= platform.y + 10 && character.x >= platform.x - 100 && character.x <= platform.x + 100) { character.y = platform.y - 40; character.velocityY = 0; character.onGround = true; // Only jump and score if we just landed (not if we were already on ground) if (!wasOnGround) { character.jump(); if (!platform.hasBeenLandedOn) { platform.hasBeenLandedOn = true; LK.setScore(LK.getScore() + 1); scoreTxt.setText(LK.getScore()); // Increase game speed gradually gameSpeed = 1 + LK.getScore() * 0.02; // Break fragile platforms after landing if (platform.breakPlatform) { platform.breakPlatform(); // Remove from platforms array platforms.splice(i, 1); } } } break; } } } function updateCamera() { var targetY = character.y - 1366; // Keep character in middle-upper area var newCameraOffsetY = targetY; var cameraDiff = newCameraOffsetY - cameraOffsetY; cameraOffsetY = newCameraOffsetY; // Apply camera offset to all game objects game.y -= cameraDiff; } function checkCoinCollisions() { for (var i = coins.length - 1; i >= 0; i--) { var coin = coins[i]; if (!coin.hasBeenCollected && character.x >= coin.x - 50 && character.x <= coin.x + 50 && character.y >= coin.y - 50 && character.y <= coin.y + 50) { coin.hasBeenCollected = true; LK.setScore(LK.getScore() + 3); scoreTxt.setText(LK.getScore()); // Remove coin coin.destroy(); coins.splice(i, 1); } } } function managePlatforms() { // Remove platforms that are too far below for (var i = platforms.length - 1; i >= 0; i--) { if (platforms[i].y > character.y + 1500) { platforms[i].destroy(); platforms.splice(i, 1); } } // Remove coins that are too far below for (var i = coins.length - 1; i >= 0; i--) { if (coins[i].y > character.y + 1500) { coins[i].destroy(); coins.splice(i, 1); } } // Add new platforms above with better spacing var highestPlatform = Math.min.apply(Math, platforms.map(function (p) { return p.y; })); while (highestPlatform > character.y - 1500) { highestPlatform -= 60 + Math.random() * 20; // Much closer spacing: 60-80 pixels generatePlatform(highestPlatform); // 15% chance to generate a coin near new platform if (Math.random() < 0.15) { generateCoin(highestPlatform); } } } game.update = function () { // Handle input if (isLeftPressed) { character.moveLeft(); } if (isRightPressed) { character.moveRight(); } // Check platform collisions checkPlatformCollisions(); // Check coin collisions checkCoinCollisions(); // Update camera updateCamera(); // Manage platforms managePlatforms(); // Check game over - character falls below spawn platform if (character.y > spawnPlatform.y + 500) { LK.showGameOver(); } }; // Handle global touch controls for mobile game.down = function (x, y, obj) { if (x < 1024) { isLeftPressed = true; leftButton.alpha = 1.0; } else { isRightPressed = true; rightButton.alpha = 1.0; } }; game.up = function (x, y, obj) { isLeftPressed = false; isRightPressed = false; leftButton.alpha = 0.7; rightButton.alpha = 0.7; };
/****
* Classes
****/
var Character = Container.expand(function () {
var self = Container.call(this);
var characterGraphics = self.attachAsset('character', {
anchorX: 0.5,
anchorY: 0.5
});
self.velocityY = 0;
self.gravity = 0.8;
self.jumpPower = -25.5;
self.horizontalSpeed = 0;
self.maxHorizontalSpeed = 12;
self.onGround = false;
self.jump = function () {
self.velocityY = self.jumpPower;
self.onGround = false;
};
self.moveLeft = function () {
self.horizontalSpeed = Math.max(self.horizontalSpeed - 2, -self.maxHorizontalSpeed);
};
self.moveRight = function () {
self.horizontalSpeed = Math.min(self.horizontalSpeed + 2, self.maxHorizontalSpeed);
};
self.update = function () {
// Only apply gravity if not on ground
if (!self.onGround) {
self.velocityY += self.gravity;
}
// Update position
self.y += self.velocityY;
self.x += self.horizontalSpeed;
// Apply horizontal friction
self.horizontalSpeed *= 0.85;
// Screen wrapping
if (self.x < 0) {
self.x = 2048;
} else if (self.x > 2048) {
self.x = 0;
}
};
return self;
});
var Coin = Container.expand(function () {
var self = Container.call(this);
var coinGraphics = self.attachAsset('coin', {
anchorX: 0.5,
anchorY: 0.5
});
self.hasBeenCollected = false;
// Add rotation animation
self.update = function () {
coinGraphics.rotation += 0.1;
};
return self;
});
var ControlButton = Container.expand(function (direction) {
var self = Container.call(this);
var buttonAsset = direction === 'left' ? 'leftButton' : 'rightButton';
var buttonGraphics = self.attachAsset(buttonAsset, {
anchorX: 0.5,
anchorY: 0.5
});
self.direction = direction;
self.alpha = 0.7;
self.down = function (x, y, obj) {
self.alpha = 1.0;
if (self.direction === 'left') {
isLeftPressed = true;
} else {
isRightPressed = true;
}
};
self.up = function (x, y, obj) {
self.alpha = 0.7;
if (self.direction === 'left') {
isLeftPressed = false;
} else {
isRightPressed = false;
}
};
return self;
});
var FragilePlatform = Container.expand(function () {
var self = Container.call(this);
var platformGraphics = self.attachAsset('fragilePlatform', {
anchorX: 0.5,
anchorY: 0.5
});
self.hasBeenLandedOn = false;
self.isBroken = false;
self.breakPlatform = function () {
self.isBroken = true;
platformGraphics.alpha = 0.3;
// Platform will be removed after a short delay
LK.setTimeout(function () {
if (self.parent) {
self.destroy();
}
}, 200);
};
return self;
});
var Platform = Container.expand(function () {
var self = Container.call(this);
var platformGraphics = self.attachAsset('platform', {
anchorX: 0.5,
anchorY: 0.5
});
self.hasBeenLandedOn = false;
return self;
});
var SpawnPlatform = Container.expand(function () {
var self = Container.call(this);
var spawnPlatformGraphics = self.attachAsset('spawnPlatform', {
anchorX: 0.5,
anchorY: 0.5
});
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87CEEB
});
/****
* Game Code
****/
var character;
var platforms = [];
var coins = [];
var spawnPlatform;
var leftButton;
var rightButton;
var cameraOffsetY = 0;
var isLeftPressed = false;
var isRightPressed = false;
var gameSpeed = 1;
// Create score display
var scoreTxt = new Text2('0', {
size: 80,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Create spawn platform
spawnPlatform = game.addChild(new SpawnPlatform());
spawnPlatform.x = 1024;
spawnPlatform.y = 2500;
// Create character
character = game.addChild(new Character());
character.x = 1024;
character.y = 2400;
// Generate initial platforms
function generatePlatform(y) {
var platform;
// 30% chance to create fragile platform
if (Math.random() < 0.3) {
platform = new FragilePlatform();
} else {
platform = new Platform();
}
platform.x = Math.random() * 1500 + 124; // Keep platforms within screen bounds
platform.y = y;
platforms.push(platform);
game.addChild(platform);
}
function generateCoin(y) {
var coin = new Coin();
coin.x = Math.random() * 1500 + 124; // Keep coins within screen bounds
coin.y = y - 100; // Position coins above platforms
coins.push(coin);
game.addChild(coin);
}
// Generate initial platforms with closer spacing
for (var i = 0; i < 20; i++) {
generatePlatform(2200 - i * 80); // Reduced to 80 for much closer spacing
// 15% chance to generate a coin near this platform
if (Math.random() < 0.15) {
generateCoin(2200 - i * 80);
}
}
// Create control buttons
leftButton = new ControlButton('left');
leftButton.x = 200;
leftButton.y = 2600;
LK.gui.bottomLeft.addChild(leftButton);
rightButton = new ControlButton('right');
rightButton.x = 200;
rightButton.y = 2600;
LK.gui.bottomRight.addChild(rightButton);
// Position buttons correctly
leftButton.x = 150;
leftButton.y = -100;
rightButton.x = -150;
rightButton.y = -100;
function checkPlatformCollisions() {
var wasOnGround = character.onGround;
character.onGround = false;
// Check collision with spawn platform first
if (character.velocityY >= 0 && character.y + 40 >= spawnPlatform.y - 15 && character.y - 40 <= spawnPlatform.y + 15 && character.x >= spawnPlatform.x - 150 && character.x <= spawnPlatform.x + 150) {
character.y = spawnPlatform.y - 40;
character.velocityY = 0;
character.onGround = true;
// Only jump if we just landed (not if we were already on ground)
if (!wasOnGround) {
character.jump();
}
return;
}
// Check regular platforms
for (var i = platforms.length - 1; i >= 0; i--) {
var platform = platforms[i];
// Skip broken fragile platforms
if (platform.isBroken) {
continue;
}
if (character.velocityY >= 0 && character.y + 40 >= platform.y - 10 && character.y - 40 <= platform.y + 10 && character.x >= platform.x - 100 && character.x <= platform.x + 100) {
character.y = platform.y - 40;
character.velocityY = 0;
character.onGround = true;
// Only jump and score if we just landed (not if we were already on ground)
if (!wasOnGround) {
character.jump();
if (!platform.hasBeenLandedOn) {
platform.hasBeenLandedOn = true;
LK.setScore(LK.getScore() + 1);
scoreTxt.setText(LK.getScore());
// Increase game speed gradually
gameSpeed = 1 + LK.getScore() * 0.02;
// Break fragile platforms after landing
if (platform.breakPlatform) {
platform.breakPlatform();
// Remove from platforms array
platforms.splice(i, 1);
}
}
}
break;
}
}
}
function updateCamera() {
var targetY = character.y - 1366; // Keep character in middle-upper area
var newCameraOffsetY = targetY;
var cameraDiff = newCameraOffsetY - cameraOffsetY;
cameraOffsetY = newCameraOffsetY;
// Apply camera offset to all game objects
game.y -= cameraDiff;
}
function checkCoinCollisions() {
for (var i = coins.length - 1; i >= 0; i--) {
var coin = coins[i];
if (!coin.hasBeenCollected && character.x >= coin.x - 50 && character.x <= coin.x + 50 && character.y >= coin.y - 50 && character.y <= coin.y + 50) {
coin.hasBeenCollected = true;
LK.setScore(LK.getScore() + 3);
scoreTxt.setText(LK.getScore());
// Remove coin
coin.destroy();
coins.splice(i, 1);
}
}
}
function managePlatforms() {
// Remove platforms that are too far below
for (var i = platforms.length - 1; i >= 0; i--) {
if (platforms[i].y > character.y + 1500) {
platforms[i].destroy();
platforms.splice(i, 1);
}
}
// Remove coins that are too far below
for (var i = coins.length - 1; i >= 0; i--) {
if (coins[i].y > character.y + 1500) {
coins[i].destroy();
coins.splice(i, 1);
}
}
// Add new platforms above with better spacing
var highestPlatform = Math.min.apply(Math, platforms.map(function (p) {
return p.y;
}));
while (highestPlatform > character.y - 1500) {
highestPlatform -= 60 + Math.random() * 20; // Much closer spacing: 60-80 pixels
generatePlatform(highestPlatform);
// 15% chance to generate a coin near new platform
if (Math.random() < 0.15) {
generateCoin(highestPlatform);
}
}
}
game.update = function () {
// Handle input
if (isLeftPressed) {
character.moveLeft();
}
if (isRightPressed) {
character.moveRight();
}
// Check platform collisions
checkPlatformCollisions();
// Check coin collisions
checkCoinCollisions();
// Update camera
updateCamera();
// Manage platforms
managePlatforms();
// Check game over - character falls below spawn platform
if (character.y > spawnPlatform.y + 500) {
LK.showGameOver();
}
};
// Handle global touch controls for mobile
game.down = function (x, y, obj) {
if (x < 1024) {
isLeftPressed = true;
leftButton.alpha = 1.0;
} else {
isRightPressed = true;
rightButton.alpha = 1.0;
}
};
game.up = function (x, y, obj) {
isLeftPressed = false;
isRightPressed = false;
leftButton.alpha = 0.7;
rightButton.alpha = 0.7;
};