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