/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var Circle = Container.expand(function () { var self = Container.call(this); var circleGraphics = self.attachAsset('circle', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.1, scaleY: 0.1 }); self.maxScale = 3.0; self.isExploding = false; self.startTime = LK.ticks; self.baseSpeed = 0.02; // Start the expanding animation self.startExpanding = function () { var speedMultiplier = 1 + LK.getScore() * 0.1; var duration = Math.max(1000, 2000 - LK.getScore() * 50); tween(circleGraphics, { scaleX: self.maxScale, scaleY: self.maxScale }, { duration: duration / speedMultiplier, easing: tween.easeOut, onFinish: function onFinish() { if (!self.isExploding) { self.explode(); } } }); }; self.explode = function () { if (self.isExploding) return; self.isExploding = true; LK.getSound('explosion').play(); LK.effects.flashScreen(0xff0000, 300); LK.showGameOver(); }; self.pop = function () { if (self.isExploding) return; self.isExploding = true; tween.stop(circleGraphics); LK.getSound('pop').play(); LK.setScore(LK.getScore() + 1); // Scale down animation before removal tween(circleGraphics, { scaleX: 0, scaleY: 0, alpha: 0 }, { duration: 150, easing: tween.easeIn, onFinish: function onFinish() { var index = circles.indexOf(self); if (index > -1) { circles.splice(index, 1); self.destroy(); } } }); }; self.down = function (x, y, obj) { self.pop(); }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x87ceeb }); /**** * Game Code ****/ var circles = []; var spawnTimer = 0; var baseSpawnRate = 120; // frames between spawns // Create score display var scoreTxt = new Text2('Score: 0', { size: 80, fill: 0xFFFFFF }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); // Position score text away from top-left menu area scoreTxt.y = 50; function spawnCircle() { var circle = new Circle(); // Random position with margins to keep circles fully visible var margin = 100; circle.x = margin + Math.random() * (2048 - 2 * margin); circle.y = margin + Math.random() * (2732 - 2 * margin); circles.push(circle); game.addChild(circle); circle.startExpanding(); } game.update = function () { // Update score display scoreTxt.setText('Score: ' + LK.getScore()); // Spawn new circles with increasing frequency var currentSpawnRate = Math.max(30, baseSpawnRate - LK.getScore() * 2); spawnTimer++; if (spawnTimer >= currentSpawnRate) { spawnCircle(); spawnTimer = 0; } // Spawn initial circle if none exist if (circles.length === 0 && LK.ticks > 60) { spawnCircle(); } };
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var Circle = Container.expand(function () {
var self = Container.call(this);
var circleGraphics = self.attachAsset('circle', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.1,
scaleY: 0.1
});
self.maxScale = 3.0;
self.isExploding = false;
self.startTime = LK.ticks;
self.baseSpeed = 0.02;
// Start the expanding animation
self.startExpanding = function () {
var speedMultiplier = 1 + LK.getScore() * 0.1;
var duration = Math.max(1000, 2000 - LK.getScore() * 50);
tween(circleGraphics, {
scaleX: self.maxScale,
scaleY: self.maxScale
}, {
duration: duration / speedMultiplier,
easing: tween.easeOut,
onFinish: function onFinish() {
if (!self.isExploding) {
self.explode();
}
}
});
};
self.explode = function () {
if (self.isExploding) return;
self.isExploding = true;
LK.getSound('explosion').play();
LK.effects.flashScreen(0xff0000, 300);
LK.showGameOver();
};
self.pop = function () {
if (self.isExploding) return;
self.isExploding = true;
tween.stop(circleGraphics);
LK.getSound('pop').play();
LK.setScore(LK.getScore() + 1);
// Scale down animation before removal
tween(circleGraphics, {
scaleX: 0,
scaleY: 0,
alpha: 0
}, {
duration: 150,
easing: tween.easeIn,
onFinish: function onFinish() {
var index = circles.indexOf(self);
if (index > -1) {
circles.splice(index, 1);
self.destroy();
}
}
});
};
self.down = function (x, y, obj) {
self.pop();
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87ceeb
});
/****
* Game Code
****/
var circles = [];
var spawnTimer = 0;
var baseSpawnRate = 120; // frames between spawns
// Create score display
var scoreTxt = new Text2('Score: 0', {
size: 80,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Position score text away from top-left menu area
scoreTxt.y = 50;
function spawnCircle() {
var circle = new Circle();
// Random position with margins to keep circles fully visible
var margin = 100;
circle.x = margin + Math.random() * (2048 - 2 * margin);
circle.y = margin + Math.random() * (2732 - 2 * margin);
circles.push(circle);
game.addChild(circle);
circle.startExpanding();
}
game.update = function () {
// Update score display
scoreTxt.setText('Score: ' + LK.getScore());
// Spawn new circles with increasing frequency
var currentSpawnRate = Math.max(30, baseSpawnRate - LK.getScore() * 2);
spawnTimer++;
if (spawnTimer >= currentSpawnRate) {
spawnCircle();
spawnTimer = 0;
}
// Spawn initial circle if none exist
if (circles.length === 0 && LK.ticks > 60) {
spawnCircle();
}
};