/**** * Classes ****/ // Gold class: falling collectible var Gold = Container.expand(function () { var self = Container.call(this); var goldAsset = self.attachAsset('gold', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 10 + Math.random() * 8; // randomize speed a bit self.lastY = 0; self.update = function () { self.lastY = self.y; self.y += self.speed; }; return self; }); // Miner class: player character var Miner = Container.expand(function () { var self = Container.call(this); var minerAsset = self.attachAsset('miner', { anchorX: 0.5, anchorY: 0.5 }); self.update = function () {}; return self; }); // Game variables // Rock class: falling obstacle var Rock = Container.expand(function () { var self = Container.call(this); var rockAsset = self.attachAsset('rock', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 12 + Math.random() * 8; self.lastY = 0; self.update = function () { self.lastY = self.y; self.y += self.speed; }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000000 }); /**** * Game Code ****/ // Game variables var miner = new Miner(); var golds = []; var rocks = []; var score = 0; var lives = 3; var lastGoldSpawn = 0; var lastRockSpawn = 0; var goldSpawnInterval = 60; // frames var rockSpawnInterval = 90; // frames // Add miner to game, position at bottom center game.addChild(miner); miner.x = 2048 / 2; miner.y = 2732 - 180; // Score and lives display var scoreTxt = new Text2('0', { size: 120, fill: 0xFFD700 }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); var livesTxt = new Text2('❤❤❤', { size: 100, fill: 0xFF4444 }); livesTxt.anchor.set(1, 0); LK.gui.topRight.addChild(livesTxt); // Dragging logic var dragging = false; game.down = function (x, y, obj) { // Only allow drag if touch is on miner or below if (y > miner.y - 120) { dragging = true; miner.x = Math.max(80, Math.min(2048 - 80, x)); } }; game.move = function (x, y, obj) { if (dragging) { miner.x = Math.max(80, Math.min(2048 - 80, x)); } }; game.up = function (x, y, obj) { dragging = false; }; // Update function: spawn, move, check collisions game.update = function () { // Spawn gold if (LK.ticks - lastGoldSpawn > goldSpawnInterval) { var g = new Gold(); g.x = 120 + Math.random() * (2048 - 240); g.y = -80; g.lastY = g.y; golds.push(g); game.addChild(g); lastGoldSpawn = LK.ticks; } // Spawn rocks if (LK.ticks - lastRockSpawn > rockSpawnInterval) { var r = new Rock(); r.x = 120 + Math.random() * (2048 - 240); r.y = -80; r.lastY = r.y; rocks.push(r); game.addChild(r); lastRockSpawn = LK.ticks; } // Update golds for (var i = golds.length - 1; i >= 0; i--) { var g = golds[i]; g.update(); // Check if caught by miner if (!g.caught && g.lastY < miner.y - 40 && g.y >= miner.y - 40 && Math.abs(g.x - miner.x) < 120) { g.caught = true; score += 1; scoreTxt.setText(score); g.destroy(); golds.splice(i, 1); continue; } // Missed gold (falls below screen) if (g.y > 2732 + 80) { g.destroy(); golds.splice(i, 1); lives -= 1; updateLives(); if (lives <= 0) { LK.showGameOver(); return; } } } // Update rocks for (var j = rocks.length - 1; j >= 0; j--) { var r = rocks[j]; r.update(); // Hit by miner if (!r.hit && r.lastY < miner.y - 40 && r.y >= miner.y - 40 && Math.abs(r.x - miner.x) < 120) { r.hit = true; lives -= 1; updateLives(); r.destroy(); rocks.splice(j, 1); if (lives <= 0) { LK.showGameOver(); return; } continue; } // Remove rock if off screen if (r.y > 2732 + 80) { r.destroy(); rocks.splice(j, 1); } } }; // Update lives display function updateLives() { var s = ''; for (var i = 0; i < lives; i++) s += '❤'; livesTxt.setText(s); }
/****
* Classes
****/
// Gold class: falling collectible
var Gold = Container.expand(function () {
var self = Container.call(this);
var goldAsset = self.attachAsset('gold', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 10 + Math.random() * 8; // randomize speed a bit
self.lastY = 0;
self.update = function () {
self.lastY = self.y;
self.y += self.speed;
};
return self;
});
// Miner class: player character
var Miner = Container.expand(function () {
var self = Container.call(this);
var minerAsset = self.attachAsset('miner', {
anchorX: 0.5,
anchorY: 0.5
});
self.update = function () {};
return self;
});
// Game variables
// Rock class: falling obstacle
var Rock = Container.expand(function () {
var self = Container.call(this);
var rockAsset = self.attachAsset('rock', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 12 + Math.random() * 8;
self.lastY = 0;
self.update = function () {
self.lastY = self.y;
self.y += self.speed;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000000
});
/****
* Game Code
****/
// Game variables
var miner = new Miner();
var golds = [];
var rocks = [];
var score = 0;
var lives = 3;
var lastGoldSpawn = 0;
var lastRockSpawn = 0;
var goldSpawnInterval = 60; // frames
var rockSpawnInterval = 90; // frames
// Add miner to game, position at bottom center
game.addChild(miner);
miner.x = 2048 / 2;
miner.y = 2732 - 180;
// Score and lives display
var scoreTxt = new Text2('0', {
size: 120,
fill: 0xFFD700
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
var livesTxt = new Text2('❤❤❤', {
size: 100,
fill: 0xFF4444
});
livesTxt.anchor.set(1, 0);
LK.gui.topRight.addChild(livesTxt);
// Dragging logic
var dragging = false;
game.down = function (x, y, obj) {
// Only allow drag if touch is on miner or below
if (y > miner.y - 120) {
dragging = true;
miner.x = Math.max(80, Math.min(2048 - 80, x));
}
};
game.move = function (x, y, obj) {
if (dragging) {
miner.x = Math.max(80, Math.min(2048 - 80, x));
}
};
game.up = function (x, y, obj) {
dragging = false;
};
// Update function: spawn, move, check collisions
game.update = function () {
// Spawn gold
if (LK.ticks - lastGoldSpawn > goldSpawnInterval) {
var g = new Gold();
g.x = 120 + Math.random() * (2048 - 240);
g.y = -80;
g.lastY = g.y;
golds.push(g);
game.addChild(g);
lastGoldSpawn = LK.ticks;
}
// Spawn rocks
if (LK.ticks - lastRockSpawn > rockSpawnInterval) {
var r = new Rock();
r.x = 120 + Math.random() * (2048 - 240);
r.y = -80;
r.lastY = r.y;
rocks.push(r);
game.addChild(r);
lastRockSpawn = LK.ticks;
}
// Update golds
for (var i = golds.length - 1; i >= 0; i--) {
var g = golds[i];
g.update();
// Check if caught by miner
if (!g.caught && g.lastY < miner.y - 40 && g.y >= miner.y - 40 && Math.abs(g.x - miner.x) < 120) {
g.caught = true;
score += 1;
scoreTxt.setText(score);
g.destroy();
golds.splice(i, 1);
continue;
}
// Missed gold (falls below screen)
if (g.y > 2732 + 80) {
g.destroy();
golds.splice(i, 1);
lives -= 1;
updateLives();
if (lives <= 0) {
LK.showGameOver();
return;
}
}
}
// Update rocks
for (var j = rocks.length - 1; j >= 0; j--) {
var r = rocks[j];
r.update();
// Hit by miner
if (!r.hit && r.lastY < miner.y - 40 && r.y >= miner.y - 40 && Math.abs(r.x - miner.x) < 120) {
r.hit = true;
lives -= 1;
updateLives();
r.destroy();
rocks.splice(j, 1);
if (lives <= 0) {
LK.showGameOver();
return;
}
continue;
}
// Remove rock if off screen
if (r.y > 2732 + 80) {
r.destroy();
rocks.splice(j, 1);
}
}
};
// Update lives display
function updateLives() {
var s = '';
for (var i = 0; i < lives; i++) s += '❤';
livesTxt.setText(s);
}