/**** * 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);
}
};