/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1", {
highScore: 0
});
/****
* Classes
****/
var Block = Container.expand(function () {
var self = Container.call(this);
var sprite = self.attachAsset('block', {
anchorX: 0.5,
anchorY: 0.5
});
self.broken = false;
self.checkCollision = function (player) {
if (self.broken || !player.isAlive) return false;
var playerBottom = player.y + 50;
var playerTop = player.y - 50;
var playerLeft = player.x - 40;
var playerRight = player.x + 40;
var blockTop = self.y - 40;
var blockBottom = self.y + 40;
var blockLeft = self.x - 40;
var blockRight = self.x + 40;
// Player hitting block from below
if (player.velocity.y < 0 && playerTop <= blockBottom && playerBottom > blockBottom && playerRight > blockLeft && playerLeft < blockRight) {
player.velocity.y = 0;
self.hit();
return true;
}
// Player landing on block from above
if (player.velocity.y > 0 && playerBottom >= blockTop && playerTop < blockTop && playerRight > blockLeft && playerLeft < blockRight) {
player.y = blockTop - 50;
player.land();
return true;
}
// Side collisions
if (playerRight > blockLeft && playerLeft < blockRight && playerBottom > blockTop && playerTop < blockBottom) {
// Determine which side the collision is from
var overlapRight = playerRight - blockLeft;
var overlapLeft = blockRight - playerLeft;
if (overlapRight < overlapLeft) {
player.x = blockLeft - 40;
} else {
player.x = blockRight + 40;
}
player.velocity.x = 0;
return true;
}
return false;
};
self.hit = function () {
if (!self.broken) {
// Animation for hit effect
tween(self, {
y: self.y - 10
}, {
duration: 100,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(self, {
y: self.y + 10
}, {
duration: 100,
easing: tween.easeIn
});
}
});
}
};
return self;
});
var Coin = Container.expand(function () {
var self = Container.call(this);
var sprite = self.attachAsset('coin', {
anchorX: 0.5,
anchorY: 0.5
});
self.collected = false;
self.update = function () {
if (!self.collected) {
// Simple bobbing animation
sprite.y = Math.sin(LK.ticks / 10) * 5;
}
};
self.collect = function () {
if (!self.collected) {
self.collected = true;
LK.getSound('coin_collect').play();
// Animation for collection
tween(self, {
alpha: 0,
y: self.y - 50
}, {
duration: 500,
easing: tween.easeOut,
onFinish: function onFinish() {
self.destroy();
}
});
return true;
}
return false;
};
self.checkCollision = function (player) {
if (self.collected || !player.isAlive) return false;
var distance = Math.sqrt(Math.pow(player.x - self.x, 2) + Math.pow(player.y - self.y, 2));
if (distance < 60) {
return self.collect();
}
return false;
};
return self;
});
var Enemy = Container.expand(function () {
var self = Container.call(this);
var sprite = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 2;
self.direction = 1; // 1 = right, -1 = left
self.alive = true;
self.update = function () {
if (self.alive) {
self.x += self.speed * self.direction;
// Change direction if at edge of patrol area
if (self.x > self.patrolRight && self.direction > 0 || self.x < self.patrolLeft && self.direction < 0) {
self.direction *= -1;
sprite.scaleX = -sprite.scaleX;
}
}
};
self.setPatrolArea = function (left, right) {
self.patrolLeft = left;
self.patrolRight = right;
};
self.checkCollision = function (player) {
if (!self.alive || !player.isAlive) return false;
var playerBottom = player.y + 50;
var playerTop = player.y - 50;
var playerLeft = player.x - 40;
var playerRight = player.x + 40;
var enemyTop = self.y - 30;
var enemyBottom = self.y + 30;
var enemyLeft = self.x - 35;
var enemyRight = self.x + 35;
// Check if player is stomping on enemy from above
if (player.velocity.y > 0 && playerBottom >= enemyTop && playerTop < enemyTop && playerRight > enemyLeft && playerLeft < enemyRight) {
self.die();
player.velocity.y = player.jumpForce * 0.7; // Bounce effect
return true;
}
// Check if player collides with enemy (not from above)
if (playerRight > enemyLeft && playerLeft < enemyRight && playerBottom > enemyTop && playerTop < enemyBottom) {
player.die();
return false;
}
return false;
};
self.die = function () {
if (self.alive) {
self.alive = false;
LK.getSound('enemy_hit').play();
// Animation for enemy death
tween(self, {
alpha: 0,
y: self.y + 50
}, {
duration: 500,
easing: tween.easeIn,
onFinish: function onFinish() {
self.destroy();
}
});
}
};
return self;
});
var Platform = Container.expand(function () {
var self = Container.call(this);
var sprite = self.attachAsset('ground', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = sprite.width;
self.height = sprite.height;
self.checkCollision = function (player) {
if (!player.isAlive) return false;
var playerBottom = player.y + 50;
var playerTop = player.y - 50;
var playerLeft = player.x - 40;
var playerRight = player.x + 40;
var platformTop = self.y - self.height / 2;
var platformBottom = self.y + self.height / 2;
var platformLeft = self.x - self.width / 2;
var platformRight = self.x + self.width / 2;
// Check if player is above the platform and falling
if (player.velocity.y > 0 && playerBottom >= platformTop && playerTop < platformTop && playerRight > platformLeft && playerLeft < platformRight) {
player.y = platformTop - 50;
player.land();
return true;
}
return false;
};
return self;
});
var Player = Container.expand(function () {
var self = Container.call(this);
var sprite = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
// Player properties
self.velocity = {
x: 0,
y: 0
};
self.speed = 8;
self.jumpForce = -20;
self.gravity = 1;
self.isJumping = false;
self.isAlive = true;
self.direction = 1; // 1 = right, -1 = left
// Control the player's movement and jumping
self.moveLeft = function () {
self.velocity.x = -self.speed;
self.direction = -1;
sprite.scaleX = -1;
};
self.moveRight = function () {
self.velocity.x = self.speed;
self.direction = 1;
sprite.scaleX = 1;
};
self.stopMoving = function () {
self.velocity.x = 0;
};
self.jump = function () {
if (!self.isJumping) {
self.velocity.y = self.jumpForce;
self.isJumping = true;
LK.getSound('jump').play();
}
};
self.update = function () {
// Apply gravity
self.velocity.y += self.gravity;
// Apply velocity
self.x += self.velocity.x;
self.y += self.velocity.y;
// Screen boundaries
if (self.x < 50) {
self.x = 50;
} else if (self.x > 2000) {
self.x = 2000;
}
// Check if fallen off the screen
if (self.y > 2732 && self.isAlive) {
self.die();
}
};
self.land = function () {
self.isJumping = false;
self.velocity.y = 0;
};
self.die = function () {
if (self.isAlive) {
self.isAlive = false;
LK.getSound('player_hit').play();
LK.effects.flashObject(self, 0xFF0000, 1000);
LK.setTimeout(function () {
LK.effects.flashScreen(0xFF0000, 500);
LK.showGameOver();
}, 1000);
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87CEEB
});
/****
* Game Code
****/
// Game variables
var player;
var platforms = [];
var coins = [];
var enemies = [];
var blocks = [];
var score = 0;
var isGameStarted = false;
var cameraPosX = 0;
// Create background
var background = LK.getAsset('background', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0
});
game.addChild(background);
// Create score text
var scoreText = new Text2('SCORE: 0', {
size: 60,
fill: 0xFFFFFF
});
scoreText.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreText);
// Create high score text
var highScoreText = new Text2('HIGH SCORE: ' + storage.highScore, {
size: 40,
fill: 0xFFFFFF
});
highScoreText.anchor.set(0.5, 0);
highScoreText.y = 70;
LK.gui.top.addChild(highScoreText);
// Create instructions text
var instructionsText = new Text2('TAP TO START\nTAP LEFT/RIGHT TO MOVE\nTAP CENTER TO JUMP', {
size: 60,
fill: 0xFFFFFF
});
instructionsText.anchor.set(0.5, 0.5);
LK.gui.center.addChild(instructionsText);
// Initialize level
function initLevel() {
// Create player
player = new Player();
player.x = 200;
player.y = 500;
game.addChild(player);
// Create ground platforms
createPlatform(400, 700, 800, 50);
createPlatform(1200, 700, 800, 50);
createPlatform(2000, 700, 800, 50);
// Create elevated platforms
createPlatform(600, 500, 300, 50);
createPlatform(1100, 400, 300, 50);
createPlatform(1700, 500, 300, 50);
// Create coins
createCoin(600, 400);
createCoin(700, 400);
createCoin(800, 400);
createCoin(1100, 300);
createCoin(1200, 300);
createCoin(1300, 300);
createCoin(1700, 400);
createCoin(1800, 400);
createCoin(1900, 400);
// Create enemies
createEnemy(800, 650, 600, 1000);
createEnemy(1500, 650, 1300, 1700);
// Create blocks
createBlock(900, 500);
createBlock(1400, 500);
createBlock(1950, 350);
// Play music
LK.playMusic('game_music');
}
// Helper functions for creating game elements
function createPlatform(x, y, width, height) {
var platform = new Platform();
platform.x = x;
platform.y = y;
platform.width = width;
platform.height = height;
// Scale the platform to desired size
var sprite = platform.getChildAt(0);
sprite.scaleX = width / sprite.width;
sprite.scaleY = height / sprite.height;
platforms.push(platform);
game.addChild(platform);
return platform;
}
function createCoin(x, y) {
var coin = new Coin();
coin.x = x;
coin.y = y;
coins.push(coin);
game.addChild(coin);
return coin;
}
function createEnemy(x, y, patrolLeft, patrolRight) {
var enemy = new Enemy();
enemy.x = x;
enemy.y = y;
enemy.setPatrolArea(patrolLeft, patrolRight);
enemies.push(enemy);
game.addChild(enemy);
return enemy;
}
function createBlock(x, y) {
var block = new Block();
block.x = x;
block.y = y;
blocks.push(block);
game.addChild(block);
return block;
}
// Update score display
function updateScore(points) {
score += points;
scoreText.setText('SCORE: ' + score);
// Update high score if needed
if (score > storage.highScore) {
storage.highScore = score;
highScoreText.setText('HIGH SCORE: ' + storage.highScore);
}
}
// Handle input events
game.down = function (x, y, obj) {
if (!isGameStarted) {
isGameStarted = true;
instructionsText.visible = false;
initLevel();
return;
}
if (!player || !player.isAlive) return;
// Left third of screen - move left
if (x < 680) {
player.moveLeft();
}
// Right third of screen - move right
else if (x > 1368) {
player.moveRight();
}
// Middle third - jump
else {
player.jump();
}
};
game.up = function (x, y, obj) {
if (!player || !player.isAlive) return;
// Stop horizontal movement on release
if (x < 680 && player.velocity.x < 0 || x > 1368 && player.velocity.x > 0) {
player.stopMoving();
}
};
// Game update loop
game.update = function () {
if (!isGameStarted || !player) return;
// Update player
player.update();
// Camera follow player
if (player.x > 1024 && player.x < 3000) {
cameraPosX = player.x - 1024;
game.x = -cameraPosX;
}
// Check platform collisions
for (var i = 0; i < platforms.length; i++) {
platforms[i].checkCollision(player);
}
// Check block collisions
for (var i = 0; i < blocks.length; i++) {
blocks[i].checkCollision(player);
}
// Check coin collisions
for (var i = coins.length - 1; i >= 0; i--) {
coins[i].update();
if (coins[i].checkCollision(player)) {
updateScore(10);
coins.splice(i, 1);
}
}
// Check enemy collisions
for (var i = enemies.length - 1; i >= 0; i--) {
enemies[i].update();
if (enemies[i].checkCollision(player)) {
updateScore(50);
enemies.splice(i, 1);
}
}
// Check if all coins collected
if (coins.length === 0 && player.isAlive) {
LK.setTimeout(function () {
LK.showYouWin();
}, 1000);
}
}; /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1", {
highScore: 0
});
/****
* Classes
****/
var Block = Container.expand(function () {
var self = Container.call(this);
var sprite = self.attachAsset('block', {
anchorX: 0.5,
anchorY: 0.5
});
self.broken = false;
self.checkCollision = function (player) {
if (self.broken || !player.isAlive) return false;
var playerBottom = player.y + 50;
var playerTop = player.y - 50;
var playerLeft = player.x - 40;
var playerRight = player.x + 40;
var blockTop = self.y - 40;
var blockBottom = self.y + 40;
var blockLeft = self.x - 40;
var blockRight = self.x + 40;
// Player hitting block from below
if (player.velocity.y < 0 && playerTop <= blockBottom && playerBottom > blockBottom && playerRight > blockLeft && playerLeft < blockRight) {
player.velocity.y = 0;
self.hit();
return true;
}
// Player landing on block from above
if (player.velocity.y > 0 && playerBottom >= blockTop && playerTop < blockTop && playerRight > blockLeft && playerLeft < blockRight) {
player.y = blockTop - 50;
player.land();
return true;
}
// Side collisions
if (playerRight > blockLeft && playerLeft < blockRight && playerBottom > blockTop && playerTop < blockBottom) {
// Determine which side the collision is from
var overlapRight = playerRight - blockLeft;
var overlapLeft = blockRight - playerLeft;
if (overlapRight < overlapLeft) {
player.x = blockLeft - 40;
} else {
player.x = blockRight + 40;
}
player.velocity.x = 0;
return true;
}
return false;
};
self.hit = function () {
if (!self.broken) {
// Animation for hit effect
tween(self, {
y: self.y - 10
}, {
duration: 100,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(self, {
y: self.y + 10
}, {
duration: 100,
easing: tween.easeIn
});
}
});
}
};
return self;
});
var Coin = Container.expand(function () {
var self = Container.call(this);
var sprite = self.attachAsset('coin', {
anchorX: 0.5,
anchorY: 0.5
});
self.collected = false;
self.update = function () {
if (!self.collected) {
// Simple bobbing animation
sprite.y = Math.sin(LK.ticks / 10) * 5;
}
};
self.collect = function () {
if (!self.collected) {
self.collected = true;
LK.getSound('coin_collect').play();
// Animation for collection
tween(self, {
alpha: 0,
y: self.y - 50
}, {
duration: 500,
easing: tween.easeOut,
onFinish: function onFinish() {
self.destroy();
}
});
return true;
}
return false;
};
self.checkCollision = function (player) {
if (self.collected || !player.isAlive) return false;
var distance = Math.sqrt(Math.pow(player.x - self.x, 2) + Math.pow(player.y - self.y, 2));
if (distance < 60) {
return self.collect();
}
return false;
};
return self;
});
var Enemy = Container.expand(function () {
var self = Container.call(this);
var sprite = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 2;
self.direction = 1; // 1 = right, -1 = left
self.alive = true;
self.update = function () {
if (self.alive) {
self.x += self.speed * self.direction;
// Change direction if at edge of patrol area
if (self.x > self.patrolRight && self.direction > 0 || self.x < self.patrolLeft && self.direction < 0) {
self.direction *= -1;
sprite.scaleX = -sprite.scaleX;
}
}
};
self.setPatrolArea = function (left, right) {
self.patrolLeft = left;
self.patrolRight = right;
};
self.checkCollision = function (player) {
if (!self.alive || !player.isAlive) return false;
var playerBottom = player.y + 50;
var playerTop = player.y - 50;
var playerLeft = player.x - 40;
var playerRight = player.x + 40;
var enemyTop = self.y - 30;
var enemyBottom = self.y + 30;
var enemyLeft = self.x - 35;
var enemyRight = self.x + 35;
// Check if player is stomping on enemy from above
if (player.velocity.y > 0 && playerBottom >= enemyTop && playerTop < enemyTop && playerRight > enemyLeft && playerLeft < enemyRight) {
self.die();
player.velocity.y = player.jumpForce * 0.7; // Bounce effect
return true;
}
// Check if player collides with enemy (not from above)
if (playerRight > enemyLeft && playerLeft < enemyRight && playerBottom > enemyTop && playerTop < enemyBottom) {
player.die();
return false;
}
return false;
};
self.die = function () {
if (self.alive) {
self.alive = false;
LK.getSound('enemy_hit').play();
// Animation for enemy death
tween(self, {
alpha: 0,
y: self.y + 50
}, {
duration: 500,
easing: tween.easeIn,
onFinish: function onFinish() {
self.destroy();
}
});
}
};
return self;
});
var Platform = Container.expand(function () {
var self = Container.call(this);
var sprite = self.attachAsset('ground', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = sprite.width;
self.height = sprite.height;
self.checkCollision = function (player) {
if (!player.isAlive) return false;
var playerBottom = player.y + 50;
var playerTop = player.y - 50;
var playerLeft = player.x - 40;
var playerRight = player.x + 40;
var platformTop = self.y - self.height / 2;
var platformBottom = self.y + self.height / 2;
var platformLeft = self.x - self.width / 2;
var platformRight = self.x + self.width / 2;
// Check if player is above the platform and falling
if (player.velocity.y > 0 && playerBottom >= platformTop && playerTop < platformTop && playerRight > platformLeft && playerLeft < platformRight) {
player.y = platformTop - 50;
player.land();
return true;
}
return false;
};
return self;
});
var Player = Container.expand(function () {
var self = Container.call(this);
var sprite = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
// Player properties
self.velocity = {
x: 0,
y: 0
};
self.speed = 8;
self.jumpForce = -20;
self.gravity = 1;
self.isJumping = false;
self.isAlive = true;
self.direction = 1; // 1 = right, -1 = left
// Control the player's movement and jumping
self.moveLeft = function () {
self.velocity.x = -self.speed;
self.direction = -1;
sprite.scaleX = -1;
};
self.moveRight = function () {
self.velocity.x = self.speed;
self.direction = 1;
sprite.scaleX = 1;
};
self.stopMoving = function () {
self.velocity.x = 0;
};
self.jump = function () {
if (!self.isJumping) {
self.velocity.y = self.jumpForce;
self.isJumping = true;
LK.getSound('jump').play();
}
};
self.update = function () {
// Apply gravity
self.velocity.y += self.gravity;
// Apply velocity
self.x += self.velocity.x;
self.y += self.velocity.y;
// Screen boundaries
if (self.x < 50) {
self.x = 50;
} else if (self.x > 2000) {
self.x = 2000;
}
// Check if fallen off the screen
if (self.y > 2732 && self.isAlive) {
self.die();
}
};
self.land = function () {
self.isJumping = false;
self.velocity.y = 0;
};
self.die = function () {
if (self.isAlive) {
self.isAlive = false;
LK.getSound('player_hit').play();
LK.effects.flashObject(self, 0xFF0000, 1000);
LK.setTimeout(function () {
LK.effects.flashScreen(0xFF0000, 500);
LK.showGameOver();
}, 1000);
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87CEEB
});
/****
* Game Code
****/
// Game variables
var player;
var platforms = [];
var coins = [];
var enemies = [];
var blocks = [];
var score = 0;
var isGameStarted = false;
var cameraPosX = 0;
// Create background
var background = LK.getAsset('background', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0
});
game.addChild(background);
// Create score text
var scoreText = new Text2('SCORE: 0', {
size: 60,
fill: 0xFFFFFF
});
scoreText.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreText);
// Create high score text
var highScoreText = new Text2('HIGH SCORE: ' + storage.highScore, {
size: 40,
fill: 0xFFFFFF
});
highScoreText.anchor.set(0.5, 0);
highScoreText.y = 70;
LK.gui.top.addChild(highScoreText);
// Create instructions text
var instructionsText = new Text2('TAP TO START\nTAP LEFT/RIGHT TO MOVE\nTAP CENTER TO JUMP', {
size: 60,
fill: 0xFFFFFF
});
instructionsText.anchor.set(0.5, 0.5);
LK.gui.center.addChild(instructionsText);
// Initialize level
function initLevel() {
// Create player
player = new Player();
player.x = 200;
player.y = 500;
game.addChild(player);
// Create ground platforms
createPlatform(400, 700, 800, 50);
createPlatform(1200, 700, 800, 50);
createPlatform(2000, 700, 800, 50);
// Create elevated platforms
createPlatform(600, 500, 300, 50);
createPlatform(1100, 400, 300, 50);
createPlatform(1700, 500, 300, 50);
// Create coins
createCoin(600, 400);
createCoin(700, 400);
createCoin(800, 400);
createCoin(1100, 300);
createCoin(1200, 300);
createCoin(1300, 300);
createCoin(1700, 400);
createCoin(1800, 400);
createCoin(1900, 400);
// Create enemies
createEnemy(800, 650, 600, 1000);
createEnemy(1500, 650, 1300, 1700);
// Create blocks
createBlock(900, 500);
createBlock(1400, 500);
createBlock(1950, 350);
// Play music
LK.playMusic('game_music');
}
// Helper functions for creating game elements
function createPlatform(x, y, width, height) {
var platform = new Platform();
platform.x = x;
platform.y = y;
platform.width = width;
platform.height = height;
// Scale the platform to desired size
var sprite = platform.getChildAt(0);
sprite.scaleX = width / sprite.width;
sprite.scaleY = height / sprite.height;
platforms.push(platform);
game.addChild(platform);
return platform;
}
function createCoin(x, y) {
var coin = new Coin();
coin.x = x;
coin.y = y;
coins.push(coin);
game.addChild(coin);
return coin;
}
function createEnemy(x, y, patrolLeft, patrolRight) {
var enemy = new Enemy();
enemy.x = x;
enemy.y = y;
enemy.setPatrolArea(patrolLeft, patrolRight);
enemies.push(enemy);
game.addChild(enemy);
return enemy;
}
function createBlock(x, y) {
var block = new Block();
block.x = x;
block.y = y;
blocks.push(block);
game.addChild(block);
return block;
}
// Update score display
function updateScore(points) {
score += points;
scoreText.setText('SCORE: ' + score);
// Update high score if needed
if (score > storage.highScore) {
storage.highScore = score;
highScoreText.setText('HIGH SCORE: ' + storage.highScore);
}
}
// Handle input events
game.down = function (x, y, obj) {
if (!isGameStarted) {
isGameStarted = true;
instructionsText.visible = false;
initLevel();
return;
}
if (!player || !player.isAlive) return;
// Left third of screen - move left
if (x < 680) {
player.moveLeft();
}
// Right third of screen - move right
else if (x > 1368) {
player.moveRight();
}
// Middle third - jump
else {
player.jump();
}
};
game.up = function (x, y, obj) {
if (!player || !player.isAlive) return;
// Stop horizontal movement on release
if (x < 680 && player.velocity.x < 0 || x > 1368 && player.velocity.x > 0) {
player.stopMoving();
}
};
// Game update loop
game.update = function () {
if (!isGameStarted || !player) return;
// Update player
player.update();
// Camera follow player
if (player.x > 1024 && player.x < 3000) {
cameraPosX = player.x - 1024;
game.x = -cameraPosX;
}
// Check platform collisions
for (var i = 0; i < platforms.length; i++) {
platforms[i].checkCollision(player);
}
// Check block collisions
for (var i = 0; i < blocks.length; i++) {
blocks[i].checkCollision(player);
}
// Check coin collisions
for (var i = coins.length - 1; i >= 0; i--) {
coins[i].update();
if (coins[i].checkCollision(player)) {
updateScore(10);
coins.splice(i, 1);
}
}
// Check enemy collisions
for (var i = enemies.length - 1; i >= 0; i--) {
enemies[i].update();
if (enemies[i].checkCollision(player)) {
updateScore(50);
enemies.splice(i, 1);
}
}
// Check if all coins collected
if (coins.length === 0 && player.isAlive) {
LK.setTimeout(function () {
LK.showYouWin();
}, 1000);
}
};