/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ // Collectible class var Collectible = Container.expand(function () { var self = Container.call(this); var colSprite = self.attachAsset('collectible', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 10; // Will be set dynamically self.update = function () { self.y += self.speed; }; return self; }); // Obstacle class var Obstacle = Container.expand(function () { var self = Container.call(this); var obsSprite = self.attachAsset('obstacle', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 12; // Will be set dynamically self.update = function () { self.y += self.speed; }; return self; }); // Player class var Player = Container.expand(function () { var self = Container.call(this); var playerSprite = self.attachAsset('player', { anchorX: 0.5, anchorY: 0.5 }); // For collision, use the container itself return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x181818 }); /**** * Game Code ****/ // Collectible: gold ellipse // Obstacle: red ellipse // Player character: blue box // Game area: 2048x2732 // Player start position: bottom center var player = new Player(); player.x = 2048 / 2; player.y = 2732 - 220; game.addChild(player); // Score display var scoreTxt = new Text2('0', { size: 120, fill: 0xFFFFFF }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); // Arrays for obstacles and collectibles var obstacles = []; var collectibles = []; // Difficulty variables var obstacleInterval = 60; // ticks between obstacles var collectibleInterval = 180; // ticks between collectibles var minObstacleInterval = 20; var minCollectibleInterval = 80; var obstacleSpeed = 12; var collectibleSpeed = 10; var maxObstacleSpeed = 32; var maxCollectibleSpeed = 24; var ticksSinceLastObstacle = 0; var ticksSinceLastCollectible = 0; var difficultyTimer = 0; // Dragging var dragNode = null; // For collision detection var lastPlayerHit = false; // Move handler for dragging player function handleMove(x, y, obj) { if (dragNode) { // Clamp player within game area var px = Math.max(player.width / 2, Math.min(2048 - player.width / 2, x)); var py = Math.max(player.height / 2 + 100, Math.min(2732 - player.height / 2, y)); player.x = px; player.y = py; } } game.move = handleMove; game.down = function (x, y, obj) { // Only start drag if touch is on player var local = player.toLocal(game.toGlobal({ x: x, y: y })); if (Math.abs(local.x) <= player.width / 2 && Math.abs(local.y) <= player.height / 2) { dragNode = player; handleMove(x, y, obj); } }; game.up = function (x, y, obj) { dragNode = null; }; // Main game update loop game.update = function () { // Difficulty increases over time difficultyTimer++; if (difficultyTimer % 300 === 0) { // every 5 seconds if (obstacleInterval > minObstacleInterval) obstacleInterval -= 4; if (collectibleInterval > minCollectibleInterval) collectibleInterval -= 4; if (obstacleSpeed < maxObstacleSpeed) obstacleSpeed += 1.5; if (collectibleSpeed < maxCollectibleSpeed) collectibleSpeed += 1; } // Spawn obstacles ticksSinceLastObstacle++; if (ticksSinceLastObstacle >= obstacleInterval) { ticksSinceLastObstacle = 0; var obs = new Obstacle(); obs.x = Math.random() * (2048 - 180) + 90; obs.y = -80; obs.speed = obstacleSpeed + Math.random() * 2; obstacles.push(obs); game.addChild(obs); } // Spawn collectibles ticksSinceLastCollectible++; if (ticksSinceLastCollectible >= collectibleInterval) { ticksSinceLastCollectible = 0; var col = new Collectible(); col.x = Math.random() * (2048 - 140) + 70; col.y = -60; col.speed = collectibleSpeed + Math.random() * 2; collectibles.push(col); game.addChild(col); } // Update obstacles for (var i = obstacles.length - 1; i >= 0; i--) { var obs = obstacles[i]; obs.update(); // Remove if off screen if (obs.y - obs.height / 2 > 2732 + 40) { obs.destroy(); obstacles.splice(i, 1); continue; } // Collision with player var hit = player.intersects(obs); if (!lastPlayerHit && hit) { // Flash screen red LK.effects.flashScreen(0xff0000, 800); // Game over LK.showGameOver(); return; } lastPlayerHit = hit; } // Update collectibles for (var j = collectibles.length - 1; j >= 0; j--) { var col = collectibles[j]; col.update(); // Remove if off screen if (col.y - col.height / 2 > 2732 + 40) { col.destroy(); collectibles.splice(j, 1); continue; } // Collision with player if (player.intersects(col)) { // Add score LK.setScore(LK.getScore() + 5); scoreTxt.setText(LK.getScore()); // Flash collectible LK.effects.flashObject(col, 0xffffff, 200); col.destroy(); collectibles.splice(j, 1); continue; } } // Update score display scoreTxt.setText(LK.getScore()); }; // Reset score on game start LK.setScore(0); scoreTxt.setText('0');
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// Collectible class
var Collectible = Container.expand(function () {
var self = Container.call(this);
var colSprite = self.attachAsset('collectible', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 10; // Will be set dynamically
self.update = function () {
self.y += self.speed;
};
return self;
});
// Obstacle class
var Obstacle = Container.expand(function () {
var self = Container.call(this);
var obsSprite = self.attachAsset('obstacle', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 12; // Will be set dynamically
self.update = function () {
self.y += self.speed;
};
return self;
});
// Player class
var Player = Container.expand(function () {
var self = Container.call(this);
var playerSprite = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
// For collision, use the container itself
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x181818
});
/****
* Game Code
****/
// Collectible: gold ellipse
// Obstacle: red ellipse
// Player character: blue box
// Game area: 2048x2732
// Player start position: bottom center
var player = new Player();
player.x = 2048 / 2;
player.y = 2732 - 220;
game.addChild(player);
// Score display
var scoreTxt = new Text2('0', {
size: 120,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Arrays for obstacles and collectibles
var obstacles = [];
var collectibles = [];
// Difficulty variables
var obstacleInterval = 60; // ticks between obstacles
var collectibleInterval = 180; // ticks between collectibles
var minObstacleInterval = 20;
var minCollectibleInterval = 80;
var obstacleSpeed = 12;
var collectibleSpeed = 10;
var maxObstacleSpeed = 32;
var maxCollectibleSpeed = 24;
var ticksSinceLastObstacle = 0;
var ticksSinceLastCollectible = 0;
var difficultyTimer = 0;
// Dragging
var dragNode = null;
// For collision detection
var lastPlayerHit = false;
// Move handler for dragging player
function handleMove(x, y, obj) {
if (dragNode) {
// Clamp player within game area
var px = Math.max(player.width / 2, Math.min(2048 - player.width / 2, x));
var py = Math.max(player.height / 2 + 100, Math.min(2732 - player.height / 2, y));
player.x = px;
player.y = py;
}
}
game.move = handleMove;
game.down = function (x, y, obj) {
// Only start drag if touch is on player
var local = player.toLocal(game.toGlobal({
x: x,
y: y
}));
if (Math.abs(local.x) <= player.width / 2 && Math.abs(local.y) <= player.height / 2) {
dragNode = player;
handleMove(x, y, obj);
}
};
game.up = function (x, y, obj) {
dragNode = null;
};
// Main game update loop
game.update = function () {
// Difficulty increases over time
difficultyTimer++;
if (difficultyTimer % 300 === 0) {
// every 5 seconds
if (obstacleInterval > minObstacleInterval) obstacleInterval -= 4;
if (collectibleInterval > minCollectibleInterval) collectibleInterval -= 4;
if (obstacleSpeed < maxObstacleSpeed) obstacleSpeed += 1.5;
if (collectibleSpeed < maxCollectibleSpeed) collectibleSpeed += 1;
}
// Spawn obstacles
ticksSinceLastObstacle++;
if (ticksSinceLastObstacle >= obstacleInterval) {
ticksSinceLastObstacle = 0;
var obs = new Obstacle();
obs.x = Math.random() * (2048 - 180) + 90;
obs.y = -80;
obs.speed = obstacleSpeed + Math.random() * 2;
obstacles.push(obs);
game.addChild(obs);
}
// Spawn collectibles
ticksSinceLastCollectible++;
if (ticksSinceLastCollectible >= collectibleInterval) {
ticksSinceLastCollectible = 0;
var col = new Collectible();
col.x = Math.random() * (2048 - 140) + 70;
col.y = -60;
col.speed = collectibleSpeed + Math.random() * 2;
collectibles.push(col);
game.addChild(col);
}
// Update obstacles
for (var i = obstacles.length - 1; i >= 0; i--) {
var obs = obstacles[i];
obs.update();
// Remove if off screen
if (obs.y - obs.height / 2 > 2732 + 40) {
obs.destroy();
obstacles.splice(i, 1);
continue;
}
// Collision with player
var hit = player.intersects(obs);
if (!lastPlayerHit && hit) {
// Flash screen red
LK.effects.flashScreen(0xff0000, 800);
// Game over
LK.showGameOver();
return;
}
lastPlayerHit = hit;
}
// Update collectibles
for (var j = collectibles.length - 1; j >= 0; j--) {
var col = collectibles[j];
col.update();
// Remove if off screen
if (col.y - col.height / 2 > 2732 + 40) {
col.destroy();
collectibles.splice(j, 1);
continue;
}
// Collision with player
if (player.intersects(col)) {
// Add score
LK.setScore(LK.getScore() + 5);
scoreTxt.setText(LK.getScore());
// Flash collectible
LK.effects.flashObject(col, 0xffffff, 200);
col.destroy();
collectibles.splice(j, 1);
continue;
}
}
// Update score display
scoreTxt.setText(LK.getScore());
};
// Reset score on game start
LK.setScore(0);
scoreTxt.setText('0');