/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// Balloon class
var Balloon = Container.expand(function () {
var self = Container.call(this);
// Balloon color options
var colors = [0xff4d4d, 0x4db8ff, 0x4dff88, 0xffe14d, 0xff4df2, 0x9d4dff];
// Random color
var color = colors[Math.floor(Math.random() * colors.length)];
// Random size
var minSize = 120;
var maxSize = 220;
var size = minSize + Math.floor(Math.random() * (maxSize - minSize));
// Attach balloon shape (ellipse)
var balloonShape = self.attachAsset('balloon', {
width: size,
height: size * 1.2,
color: color,
shape: 'ellipse',
anchorX: 0.5,
anchorY: 0.5
});
// Is this a special balloon?
self.isSpecial = false;
self.specialType = null;
// 10% chance to be a special balloon
if (Math.random() < 0.1) {
self.isSpecial = true;
// Randomly choose special type: 'score' or 'slow'
self.specialType = Math.random() < 0.5 ? 'score' : 'slow';
// Add a visual indicator (star or S)
var specialTxt = new Text2(self.specialType === 'score' ? '★' : 'S', {
size: size * 0.7,
fill: self.specialType === 'score' ? "#fff700" : "#00eaff"
});
specialTxt.anchor.set(0.5, 0.5);
self.addChild(specialTxt);
}
// Set initial speed (pixels per frame)
self.baseSpeed = 6 + Math.random() * 3;
self.speed = self.baseSpeed;
// For touch detection
self.interactive = true;
// For popping animation
self.isPopping = false;
// Pop balloon
self.pop = function () {
if (self.isPopping) return;
self.isPopping = true;
// Animate: scale up and fade out
tween(self, {
scaleX: 1.5,
scaleY: 1.5,
alpha: 0
}, {
duration: 250,
easing: tween.easeOut,
onFinish: function onFinish() {
self.destroy();
}
});
};
// Update method called every tick
self.update = function () {
if (self.isPopping) return;
self.y -= self.speed;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87ceeb // Sky blue
});
/****
* Game Code
****/
// Game variables
var balloons = [];
var spawnInterval = 36; // frames between spawns (~0.6s at 60fps)
var lastSpawnTick = 0;
var gameDuration = 30 * 60; // 30 seconds * 60fps
var timeLeft = gameDuration;
var score = 0;
var slowEffectTicks = 0;
// Score text
var scoreTxt = new Text2('0', {
size: 120,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Timer text
var timerTxt = new Text2('30', {
size: 90,
fill: 0xFFFFFF
});
timerTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(timerTxt);
timerTxt.y = 120;
// Helper: spawn a balloon at random x
function spawnBalloon() {
var balloon = new Balloon();
// Random x, avoid leftmost 100px (menu) and rightmost 100px
var margin = 140;
var x = margin + Math.random() * (2048 - 2 * margin);
balloon.x = x;
// Start just below the bottom
balloon.y = 2732 + balloon.height / 2;
// Randomize z-order a bit
game.addChild(balloon);
balloons.push(balloon);
}
// Helper: handle popping a balloon
function handlePop(balloon) {
if (balloon.isPopping) return;
// Score
var addScore = 1;
if (balloon.isSpecial) {
if (balloon.specialType === 'score') {
addScore = 5;
LK.effects.flashObject(balloon, 0xfff700, 400);
} else if (balloon.specialType === 'slow') {
slowEffectTicks = 180; // 3 seconds slow
LK.effects.flashScreen(0x00eaff, 300);
}
}
score += addScore;
LK.setScore(score);
scoreTxt.setText(score);
balloon.pop();
}
// Touch/drag handling
var dragBalloon = null;
function getBalloonAt(x, y) {
for (var i = balloons.length - 1; i >= 0; i--) {
var b = balloons[i];
if (b.isPopping) continue;
// Simple hit test: distance to center < radius
var dx = x - b.x;
var dy = y - b.y;
var rx = b.width / 2;
var ry = b.height / 2;
if (dx * dx / (rx * rx) + dy * dy / (ry * ry) <= 1) {
return b;
}
}
return null;
}
// Touch down: pop balloon if touched
game.down = function (x, y, obj) {
var b = getBalloonAt(x, y);
if (b) {
handlePop(b);
dragBalloon = b;
}
};
// Touch move: allow dragging finger to pop more balloons
game.move = function (x, y, obj) {
var b = getBalloonAt(x, y);
if (b && b !== dragBalloon) {
handlePop(b);
dragBalloon = b;
}
};
// Touch up: reset drag
game.up = function (x, y, obj) {
dragBalloon = null;
};
// Main update loop
game.update = function () {
// Spawn balloons
if (LK.ticks - lastSpawnTick >= spawnInterval) {
spawnBalloon();
lastSpawnTick = LK.ticks;
}
// Update slow effect
var speedFactor = 1;
if (slowEffectTicks > 0) {
speedFactor = 0.4;
slowEffectTicks--;
}
// Update balloons
for (var i = balloons.length - 1; i >= 0; i--) {
var b = balloons[i];
if (b.isPopping) continue;
b.speed = b.baseSpeed * speedFactor;
b.update();
// Remove if off top
if (b.y + b.height / 2 < 0) {
b.pop();
balloons.splice(i, 1);
}
}
// Remove destroyed balloons from array
for (var i = balloons.length - 1; i >= 0; i--) {
if (balloons[i].destroyed) {
balloons.splice(i, 1);
}
}
// Update timer
timeLeft--;
var seconds = Math.ceil(timeLeft / 60);
timerTxt.setText(seconds);
// End game if time is up
if (timeLeft <= 0) {
LK.showGameOver();
}
};
// Initialize score and timer
score = 0;
LK.setScore(score);
scoreTxt.setText(score);
timerTxt.setText(Math.ceil(gameDuration / 60)); ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,223 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+
+/****
+* Classes
+****/
+// Balloon class
+var Balloon = Container.expand(function () {
+ var self = Container.call(this);
+ // Balloon color options
+ var colors = [0xff4d4d, 0x4db8ff, 0x4dff88, 0xffe14d, 0xff4df2, 0x9d4dff];
+ // Random color
+ var color = colors[Math.floor(Math.random() * colors.length)];
+ // Random size
+ var minSize = 120;
+ var maxSize = 220;
+ var size = minSize + Math.floor(Math.random() * (maxSize - minSize));
+ // Attach balloon shape (ellipse)
+ var balloonShape = self.attachAsset('balloon', {
+ width: size,
+ height: size * 1.2,
+ color: color,
+ shape: 'ellipse',
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ // Is this a special balloon?
+ self.isSpecial = false;
+ self.specialType = null;
+ // 10% chance to be a special balloon
+ if (Math.random() < 0.1) {
+ self.isSpecial = true;
+ // Randomly choose special type: 'score' or 'slow'
+ self.specialType = Math.random() < 0.5 ? 'score' : 'slow';
+ // Add a visual indicator (star or S)
+ var specialTxt = new Text2(self.specialType === 'score' ? '★' : 'S', {
+ size: size * 0.7,
+ fill: self.specialType === 'score' ? "#fff700" : "#00eaff"
+ });
+ specialTxt.anchor.set(0.5, 0.5);
+ self.addChild(specialTxt);
+ }
+ // Set initial speed (pixels per frame)
+ self.baseSpeed = 6 + Math.random() * 3;
+ self.speed = self.baseSpeed;
+ // For touch detection
+ self.interactive = true;
+ // For popping animation
+ self.isPopping = false;
+ // Pop balloon
+ self.pop = function () {
+ if (self.isPopping) return;
+ self.isPopping = true;
+ // Animate: scale up and fade out
+ tween(self, {
+ scaleX: 1.5,
+ scaleY: 1.5,
+ alpha: 0
+ }, {
+ duration: 250,
+ easing: tween.easeOut,
+ onFinish: function onFinish() {
+ self.destroy();
+ }
+ });
+ };
+ // Update method called every tick
+ self.update = function () {
+ if (self.isPopping) return;
+ self.y -= self.speed;
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x87ceeb // Sky blue
+});
+
+/****
+* Game Code
+****/
+// Game variables
+var balloons = [];
+var spawnInterval = 36; // frames between spawns (~0.6s at 60fps)
+var lastSpawnTick = 0;
+var gameDuration = 30 * 60; // 30 seconds * 60fps
+var timeLeft = gameDuration;
+var score = 0;
+var slowEffectTicks = 0;
+// Score text
+var scoreTxt = new Text2('0', {
+ size: 120,
+ fill: 0xFFFFFF
+});
+scoreTxt.anchor.set(0.5, 0);
+LK.gui.top.addChild(scoreTxt);
+// Timer text
+var timerTxt = new Text2('30', {
+ size: 90,
+ fill: 0xFFFFFF
+});
+timerTxt.anchor.set(0.5, 0);
+LK.gui.top.addChild(timerTxt);
+timerTxt.y = 120;
+// Helper: spawn a balloon at random x
+function spawnBalloon() {
+ var balloon = new Balloon();
+ // Random x, avoid leftmost 100px (menu) and rightmost 100px
+ var margin = 140;
+ var x = margin + Math.random() * (2048 - 2 * margin);
+ balloon.x = x;
+ // Start just below the bottom
+ balloon.y = 2732 + balloon.height / 2;
+ // Randomize z-order a bit
+ game.addChild(balloon);
+ balloons.push(balloon);
+}
+// Helper: handle popping a balloon
+function handlePop(balloon) {
+ if (balloon.isPopping) return;
+ // Score
+ var addScore = 1;
+ if (balloon.isSpecial) {
+ if (balloon.specialType === 'score') {
+ addScore = 5;
+ LK.effects.flashObject(balloon, 0xfff700, 400);
+ } else if (balloon.specialType === 'slow') {
+ slowEffectTicks = 180; // 3 seconds slow
+ LK.effects.flashScreen(0x00eaff, 300);
+ }
+ }
+ score += addScore;
+ LK.setScore(score);
+ scoreTxt.setText(score);
+ balloon.pop();
+}
+// Touch/drag handling
+var dragBalloon = null;
+function getBalloonAt(x, y) {
+ for (var i = balloons.length - 1; i >= 0; i--) {
+ var b = balloons[i];
+ if (b.isPopping) continue;
+ // Simple hit test: distance to center < radius
+ var dx = x - b.x;
+ var dy = y - b.y;
+ var rx = b.width / 2;
+ var ry = b.height / 2;
+ if (dx * dx / (rx * rx) + dy * dy / (ry * ry) <= 1) {
+ return b;
+ }
+ }
+ return null;
+}
+// Touch down: pop balloon if touched
+game.down = function (x, y, obj) {
+ var b = getBalloonAt(x, y);
+ if (b) {
+ handlePop(b);
+ dragBalloon = b;
+ }
+};
+// Touch move: allow dragging finger to pop more balloons
+game.move = function (x, y, obj) {
+ var b = getBalloonAt(x, y);
+ if (b && b !== dragBalloon) {
+ handlePop(b);
+ dragBalloon = b;
+ }
+};
+// Touch up: reset drag
+game.up = function (x, y, obj) {
+ dragBalloon = null;
+};
+// Main update loop
+game.update = function () {
+ // Spawn balloons
+ if (LK.ticks - lastSpawnTick >= spawnInterval) {
+ spawnBalloon();
+ lastSpawnTick = LK.ticks;
+ }
+ // Update slow effect
+ var speedFactor = 1;
+ if (slowEffectTicks > 0) {
+ speedFactor = 0.4;
+ slowEffectTicks--;
+ }
+ // Update balloons
+ for (var i = balloons.length - 1; i >= 0; i--) {
+ var b = balloons[i];
+ if (b.isPopping) continue;
+ b.speed = b.baseSpeed * speedFactor;
+ b.update();
+ // Remove if off top
+ if (b.y + b.height / 2 < 0) {
+ b.pop();
+ balloons.splice(i, 1);
+ }
+ }
+ // Remove destroyed balloons from array
+ for (var i = balloons.length - 1; i >= 0; i--) {
+ if (balloons[i].destroyed) {
+ balloons.splice(i, 1);
+ }
+ }
+ // Update timer
+ timeLeft--;
+ var seconds = Math.ceil(timeLeft / 60);
+ timerTxt.setText(seconds);
+ // End game if time is up
+ if (timeLeft <= 0) {
+ LK.showGameOver();
+ }
+};
+// Initialize score and timer
+score = 0;
+LK.setScore(score);
+scoreTxt.setText(score);
+timerTxt.setText(Math.ceil(gameDuration / 60));
\ No newline at end of file