/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ var Balloon = Container.expand(function (color, speed) { var self = Container.call(this); self.color = color || 'redBalloon'; self.speed = speed || 2; self.value = 1; if (self.color === 'goldBalloon') { self.value = 5; } var balloonGraphics = self.attachAsset(self.color, { anchorX: 0.5, anchorY: 0.5 }); var stringGraphics = self.attachAsset('string', { anchorX: 0.5, anchorY: 0 }); stringGraphics.y = balloonGraphics.height / 2; self.radius = balloonGraphics.width / 2; self.update = function () { self.y -= self.speed; // Apply slight horizontal drift if (LK.ticks % 30 === 0) { self.x += Math.random() * 2 - 1; } }; self.pop = function () { // Play pop sound if (self.color === 'goldBalloon') { LK.getSound('goldPop').play(); } else { LK.getSound('pop').play(); } // Flash effect and destroy LK.effects.flashObject(self, 0xFFFFFF, 200); // Scale up and fade out animation tween(self, { scaleX: 1.5, scaleY: 1.5, alpha: 0 }, { duration: 200, easing: tween.easeOut, onFinish: function onFinish() { self.isPopped = true; } }); }; // Receive touch events self.down = function (x, y, obj) { self.pop(); return true; // Event handled }; return self; }); var Bomb = Container.expand(function (speed) { var self = Container.call(this); self.speed = speed || 1.5; var bombGraphics = self.attachAsset('bomb', { anchorX: 0.5, anchorY: 0.5 }); var stringGraphics = self.attachAsset('string', { anchorX: 0.5, anchorY: 0 }); stringGraphics.y = bombGraphics.height / 2; self.radius = bombGraphics.width / 2; self.update = function () { self.y -= self.speed; // Apply slight horizontal drift if (LK.ticks % 30 === 0) { self.x += Math.random() * 2 - 1; } }; self.explode = function () { // Play explosion sound LK.getSound('bombExplode').play(); // Flash screen and bomb LK.effects.flashScreen(0xFF0000, 300); LK.effects.flashObject(self, 0xFF0000, 300); // Scale up and fade out animation tween(self, { scaleX: 2, scaleY: 2, alpha: 0 }, { duration: 300, easing: tween.easeOut, onFinish: function onFinish() { self.isExploded = true; } }); }; // Receive touch events self.down = function (x, y, obj) { self.explode(); return true; // Event handled }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x87CEEB // Sky blue background }); /**** * Game Code ****/ // Game variables var score = 0; var level = 1; var lives = 3; var balloons = []; var bombs = []; var gameActive = true; var spawnInterval = 60; // Frames between balloon spawns var bombChance = 0.2; // Chance of spawning a bomb instead of a balloon var goldChance = 0.1; // Chance of spawning a gold balloon var lastSpawn = 0; var highScore = storage.highScore || 0; // UI elements var scoreTxt = new Text2('Score: 0', { size: 70, fill: 0xFFFFFF }); scoreTxt.anchor.set(0, 0); LK.gui.topRight.addChild(scoreTxt); scoreTxt.x = -scoreTxt.width - 20; scoreTxt.y = 20; var livesTxt = new Text2('Lives: 3', { size: 70, fill: 0xFFFFFF }); livesTxt.anchor.set(0, 0); LK.gui.topRight.addChild(livesTxt); livesTxt.x = -livesTxt.width - 20; livesTxt.y = scoreTxt.y + scoreTxt.height + 10; var levelTxt = new Text2('Level: 1', { size: 70, fill: 0xFFFFFF }); levelTxt.anchor.set(0, 0); LK.gui.top.addChild(levelTxt); levelTxt.y = 20; // Function to update score display function updateScore(points) { score += points; scoreTxt.setText('Score: ' + score); // Update high score if needed if (score > highScore) { highScore = score; storage.highScore = highScore; } // Level up every 100 points var newLevel = Math.floor(score / 100) + 1; if (newLevel > level) { level = newLevel; levelTxt.setText('Level: ' + level); // Increase difficulty spawnInterval = Math.max(20, 60 - level * 5); bombChance = Math.min(0.4, 0.2 + level * 0.03); } // Set LK engine score for leaderboards LK.setScore(score); } // Function to update lives display function updateLives(change) { lives += change; livesTxt.setText('Lives: ' + lives); if (lives <= 0) { gameActive = false; LK.showGameOver(); } } // Function to spawn a new balloon function spawnBalloon() { // Random horizontal position var x = Math.random() * (2048 - 200) + 100; // Randomize balloon type var randomValue = Math.random(); if (randomValue < bombChance) { // Spawn bomb var bomb = new Bomb(1.5 + level * 0.2); bomb.x = x; bomb.y = 2732 + bomb.radius; bombs.push(bomb); game.addChild(bomb); } else { // Spawn balloon var colorOptions = ['redBalloon', 'blueBalloon', 'greenBalloon']; var balloonColor = colorOptions[Math.floor(Math.random() * colorOptions.length)]; // Gold balloon chance if (Math.random() < goldChance) { balloonColor = 'goldBalloon'; } var balloon = new Balloon(balloonColor, 1.5 + level * 0.3); balloon.x = x; balloon.y = 2732 + balloon.radius; balloons.push(balloon); game.addChild(balloon); } } // Start background music LK.playMusic('gameMusic', { fade: { start: 0, end: 0.4, duration: 1000 } }); // Game update function game.update = function () { if (!gameActive) { return; } // Spawn new balloons based on interval if (LK.ticks - lastSpawn > spawnInterval) { spawnBalloon(); lastSpawn = LK.ticks; } // Update balloons for (var i = balloons.length - 1; i >= 0; i--) { var balloon = balloons[i]; // Check if balloon is off screen if (balloon.y < -balloon.radius) { // Missed a balloon game.removeChild(balloon); balloons.splice(i, 1); // Only lose a life if it's not a bomb updateLives(-1); continue; } // Check if balloon has been popped if (balloon.isPopped) { game.removeChild(balloon); balloons.splice(i, 1); updateScore(balloon.value); } } // Update bombs for (var j = bombs.length - 1; j >= 0; j--) { var bomb = bombs[j]; // Check if bomb is off screen if (bomb.y < -bomb.radius) { // Bomb floated away safely game.removeChild(bomb); bombs.splice(j, 1); continue; } // Check if bomb has exploded if (bomb.isExploded) { game.removeChild(bomb); bombs.splice(j, 1); updateLives(-1); } } }; // Mouse/touch events for game area (not needed since objects handle their own touch events) game.down = function (x, y, obj) { // This is handled by the individual balloon/bomb objects };
===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,273 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+var storage = LK.import("@upit/storage.v1");
+
+/****
+* Classes
+****/
+var Balloon = Container.expand(function (color, speed) {
+ var self = Container.call(this);
+ self.color = color || 'redBalloon';
+ self.speed = speed || 2;
+ self.value = 1;
+ if (self.color === 'goldBalloon') {
+ self.value = 5;
+ }
+ var balloonGraphics = self.attachAsset(self.color, {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ var stringGraphics = self.attachAsset('string', {
+ anchorX: 0.5,
+ anchorY: 0
+ });
+ stringGraphics.y = balloonGraphics.height / 2;
+ self.radius = balloonGraphics.width / 2;
+ self.update = function () {
+ self.y -= self.speed;
+ // Apply slight horizontal drift
+ if (LK.ticks % 30 === 0) {
+ self.x += Math.random() * 2 - 1;
+ }
+ };
+ self.pop = function () {
+ // Play pop sound
+ if (self.color === 'goldBalloon') {
+ LK.getSound('goldPop').play();
+ } else {
+ LK.getSound('pop').play();
+ }
+ // Flash effect and destroy
+ LK.effects.flashObject(self, 0xFFFFFF, 200);
+ // Scale up and fade out animation
+ tween(self, {
+ scaleX: 1.5,
+ scaleY: 1.5,
+ alpha: 0
+ }, {
+ duration: 200,
+ easing: tween.easeOut,
+ onFinish: function onFinish() {
+ self.isPopped = true;
+ }
+ });
+ };
+ // Receive touch events
+ self.down = function (x, y, obj) {
+ self.pop();
+ return true; // Event handled
+ };
+ return self;
+});
+var Bomb = Container.expand(function (speed) {
+ var self = Container.call(this);
+ self.speed = speed || 1.5;
+ var bombGraphics = self.attachAsset('bomb', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ var stringGraphics = self.attachAsset('string', {
+ anchorX: 0.5,
+ anchorY: 0
+ });
+ stringGraphics.y = bombGraphics.height / 2;
+ self.radius = bombGraphics.width / 2;
+ self.update = function () {
+ self.y -= self.speed;
+ // Apply slight horizontal drift
+ if (LK.ticks % 30 === 0) {
+ self.x += Math.random() * 2 - 1;
+ }
+ };
+ self.explode = function () {
+ // Play explosion sound
+ LK.getSound('bombExplode').play();
+ // Flash screen and bomb
+ LK.effects.flashScreen(0xFF0000, 300);
+ LK.effects.flashObject(self, 0xFF0000, 300);
+ // Scale up and fade out animation
+ tween(self, {
+ scaleX: 2,
+ scaleY: 2,
+ alpha: 0
+ }, {
+ duration: 300,
+ easing: tween.easeOut,
+ onFinish: function onFinish() {
+ self.isExploded = true;
+ }
+ });
+ };
+ // Receive touch events
+ self.down = function (x, y, obj) {
+ self.explode();
+ return true; // Event handled
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x87CEEB // Sky blue background
+});
+
+/****
+* Game Code
+****/
+// Game variables
+var score = 0;
+var level = 1;
+var lives = 3;
+var balloons = [];
+var bombs = [];
+var gameActive = true;
+var spawnInterval = 60; // Frames between balloon spawns
+var bombChance = 0.2; // Chance of spawning a bomb instead of a balloon
+var goldChance = 0.1; // Chance of spawning a gold balloon
+var lastSpawn = 0;
+var highScore = storage.highScore || 0;
+// UI elements
+var scoreTxt = new Text2('Score: 0', {
+ size: 70,
+ fill: 0xFFFFFF
+});
+scoreTxt.anchor.set(0, 0);
+LK.gui.topRight.addChild(scoreTxt);
+scoreTxt.x = -scoreTxt.width - 20;
+scoreTxt.y = 20;
+var livesTxt = new Text2('Lives: 3', {
+ size: 70,
+ fill: 0xFFFFFF
+});
+livesTxt.anchor.set(0, 0);
+LK.gui.topRight.addChild(livesTxt);
+livesTxt.x = -livesTxt.width - 20;
+livesTxt.y = scoreTxt.y + scoreTxt.height + 10;
+var levelTxt = new Text2('Level: 1', {
+ size: 70,
+ fill: 0xFFFFFF
+});
+levelTxt.anchor.set(0, 0);
+LK.gui.top.addChild(levelTxt);
+levelTxt.y = 20;
+// Function to update score display
+function updateScore(points) {
+ score += points;
+ scoreTxt.setText('Score: ' + score);
+ // Update high score if needed
+ if (score > highScore) {
+ highScore = score;
+ storage.highScore = highScore;
+ }
+ // Level up every 100 points
+ var newLevel = Math.floor(score / 100) + 1;
+ if (newLevel > level) {
+ level = newLevel;
+ levelTxt.setText('Level: ' + level);
+ // Increase difficulty
+ spawnInterval = Math.max(20, 60 - level * 5);
+ bombChance = Math.min(0.4, 0.2 + level * 0.03);
+ }
+ // Set LK engine score for leaderboards
+ LK.setScore(score);
+}
+// Function to update lives display
+function updateLives(change) {
+ lives += change;
+ livesTxt.setText('Lives: ' + lives);
+ if (lives <= 0) {
+ gameActive = false;
+ LK.showGameOver();
+ }
+}
+// Function to spawn a new balloon
+function spawnBalloon() {
+ // Random horizontal position
+ var x = Math.random() * (2048 - 200) + 100;
+ // Randomize balloon type
+ var randomValue = Math.random();
+ if (randomValue < bombChance) {
+ // Spawn bomb
+ var bomb = new Bomb(1.5 + level * 0.2);
+ bomb.x = x;
+ bomb.y = 2732 + bomb.radius;
+ bombs.push(bomb);
+ game.addChild(bomb);
+ } else {
+ // Spawn balloon
+ var colorOptions = ['redBalloon', 'blueBalloon', 'greenBalloon'];
+ var balloonColor = colorOptions[Math.floor(Math.random() * colorOptions.length)];
+ // Gold balloon chance
+ if (Math.random() < goldChance) {
+ balloonColor = 'goldBalloon';
+ }
+ var balloon = new Balloon(balloonColor, 1.5 + level * 0.3);
+ balloon.x = x;
+ balloon.y = 2732 + balloon.radius;
+ balloons.push(balloon);
+ game.addChild(balloon);
+ }
+}
+// Start background music
+LK.playMusic('gameMusic', {
+ fade: {
+ start: 0,
+ end: 0.4,
+ duration: 1000
+ }
+});
+// Game update function
+game.update = function () {
+ if (!gameActive) {
+ return;
+ }
+ // Spawn new balloons based on interval
+ if (LK.ticks - lastSpawn > spawnInterval) {
+ spawnBalloon();
+ lastSpawn = LK.ticks;
+ }
+ // Update balloons
+ for (var i = balloons.length - 1; i >= 0; i--) {
+ var balloon = balloons[i];
+ // Check if balloon is off screen
+ if (balloon.y < -balloon.radius) {
+ // Missed a balloon
+ game.removeChild(balloon);
+ balloons.splice(i, 1);
+ // Only lose a life if it's not a bomb
+ updateLives(-1);
+ continue;
+ }
+ // Check if balloon has been popped
+ if (balloon.isPopped) {
+ game.removeChild(balloon);
+ balloons.splice(i, 1);
+ updateScore(balloon.value);
+ }
+ }
+ // Update bombs
+ for (var j = bombs.length - 1; j >= 0; j--) {
+ var bomb = bombs[j];
+ // Check if bomb is off screen
+ if (bomb.y < -bomb.radius) {
+ // Bomb floated away safely
+ game.removeChild(bomb);
+ bombs.splice(j, 1);
+ continue;
+ }
+ // Check if bomb has exploded
+ if (bomb.isExploded) {
+ game.removeChild(bomb);
+ bombs.splice(j, 1);
+ updateLives(-1);
+ }
+ }
+};
+// Mouse/touch events for game area (not needed since objects handle their own touch events)
+game.down = function (x, y, obj) {
+ // This is handled by the individual balloon/bomb objects
+};
\ No newline at end of file