/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ var Coin = Container.expand(function () { var self = Container.call(this); var coinGraphics = self.attachAsset('coin', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 4; self.collected = false; self.update = function () { self.y += self.speed; self.rotation += 0.1; }; return self; }); var Labubu = Container.expand(function () { var self = Container.call(this); var labubuGraphics = self.attachAsset('labubu', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 8; self.shielded = false; self.shieldTime = 0; self.update = function () { if (self.shielded) { self.shieldTime--; if (self.shieldTime <= 0) { self.shielded = false; labubuGraphics.tint = 0xFFFFFF; } } }; self.activateShield = function () { self.shielded = true; self.shieldTime = 300; // 5 seconds at 60fps labubuGraphics.tint = 0x00FFFF; }; return self; }); var Obstacle = Container.expand(function () { var self = Container.call(this); var obstacleGraphics = self.attachAsset('obstacle', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 6; self.update = function () { self.y += self.speed; }; return self; }); var PowerUp = Container.expand(function () { var self = Container.call(this); var powerUpGraphics = self.attachAsset('shield', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 4; self.collected = false; self.type = 'shield'; self.update = function () { self.y += self.speed; self.rotation += 0.15; }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x1a1a2e }); /**** * Game Code ****/ var labubu = game.addChild(new Labubu()); labubu.x = 2048 / 2; labubu.y = 2732 - 200; var obstacles = []; var coins = []; var powerUps = []; var gameSpeed = 1; var obstacleSpawnRate = 120; var coinSpawnRate = 180; var powerUpSpawnRate = 600; var comboCount = 0; var lastObstacleTime = 0; // UI Elements var scoreTxt = new Text2('Score: 0', { size: 80, fill: 0xFFFFFF }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); var coinsTxt = new Text2('Coins: ' + (storage.coins || 0), { size: 60, fill: 0xFFD700 }); coinsTxt.anchor.set(1, 0); coinsTxt.x = -20; coinsTxt.y = 20; LK.gui.topRight.addChild(coinsTxt); var comboTxt = new Text2('', { size: 70, fill: 0xFF69B4 }); comboTxt.anchor.set(0.5, 0.5); LK.gui.center.addChild(comboTxt); // Touch controls var dragStartX = 0; var dragStartY = 0; var isDragging = false; game.down = function (x, y, obj) { dragStartX = x; dragStartY = y; isDragging = true; }; game.move = function (x, y, obj) { if (isDragging) { var deltaX = x - dragStartX; var deltaY = y - dragStartY; labubu.x += deltaX * 0.5; labubu.y += deltaY * 0.5; // Keep Labubu within screen bounds labubu.x = Math.max(60, Math.min(2048 - 60, labubu.x)); labubu.y = Math.max(60, Math.min(2732 - 60, labubu.y)); dragStartX = x; dragStartY = y; } }; game.up = function (x, y, obj) { isDragging = false; }; // Initialize storage if (storage.coins === undefined) { storage.coins = 0; } if (storage.highScore === undefined) { storage.highScore = 0; } function spawnObstacle() { var obstacle = new Obstacle(); obstacle.x = Math.random() * (2048 - 160) + 80; obstacle.y = -50; obstacle.speed = 6 + gameSpeed * 2; obstacles.push(obstacle); game.addChild(obstacle); } function spawnCoin() { var coin = new Coin(); coin.x = Math.random() * (2048 - 80) + 40; coin.y = -30; coin.speed = 4 + gameSpeed; coins.push(coin); game.addChild(coin); } function spawnPowerUp() { var powerUp = new PowerUp(); powerUp.x = Math.random() * (2048 - 100) + 50; powerUp.y = -30; powerUp.speed = 4 + gameSpeed; powerUps.push(powerUp); game.addChild(powerUp); } function updateScore() { var currentScore = LK.getScore(); scoreTxt.setText('Score: ' + currentScore); if (currentScore > storage.highScore) { storage.highScore = currentScore; } } function updateCombo() { if (comboCount > 5) { comboTxt.setText('COMBO x' + comboCount); tween(comboTxt, { scaleX: 1.2, scaleY: 1.2 }, { duration: 200, onFinish: function onFinish() { tween(comboTxt, { scaleX: 1, scaleY: 1 }, { duration: 200 }); } }); } else { comboTxt.setText(''); } } LK.playMusic('bgmusic'); game.update = function () { // Increase game difficulty over time if (LK.ticks % 600 === 0) { gameSpeed += 0.1; obstacleSpawnRate = Math.max(60, obstacleSpawnRate - 2); } // Spawn obstacles if (LK.ticks % Math.floor(obstacleSpawnRate / gameSpeed) === 0) { spawnObstacle(); } // Spawn coins if (LK.ticks % Math.floor(coinSpawnRate / gameSpeed) === 0) { spawnCoin(); } // Spawn power-ups if (LK.ticks % Math.floor(powerUpSpawnRate / gameSpeed) === 0) { spawnPowerUp(); } // Update and check obstacles for (var i = obstacles.length - 1; i >= 0; i--) { var obstacle = obstacles[i]; if (obstacle.lastY === undefined) obstacle.lastY = obstacle.y; // Remove off-screen obstacles if (obstacle.lastY <= 2732 && obstacle.y > 2732) { obstacle.destroy(); obstacles.splice(i, 1); // Increment combo for successful dodge comboCount++; lastObstacleTime = LK.ticks; updateCombo(); LK.setScore(LK.getScore() + 10 * Math.max(1, Math.floor(comboCount / 5))); updateScore(); continue; } // Check collision with Labubu if (obstacle.intersects(labubu)) { if (!labubu.shielded) { LK.getSound('hit').play(); LK.effects.flashScreen(0xFF0000, 1000); LK.showGameOver(); return; } else { // Shield absorbs hit obstacle.destroy(); obstacles.splice(i, 1); labubu.shielded = false; labubu.shieldTime = 0; LK.effects.flashObject(labubu, 0xFFFFFF, 300); continue; } } obstacle.lastY = obstacle.y; } // Update and check coins for (var j = coins.length - 1; j >= 0; j--) { var coin = coins[j]; if (coin.lastY === undefined) coin.lastY = coin.y; // Remove off-screen coins if (coin.lastY <= 2732 && coin.y > 2732) { coin.destroy(); coins.splice(j, 1); continue; } // Check collection if (!coin.collected && coin.intersects(labubu)) { coin.collected = true; LK.getSound('collect').play(); storage.coins++; coinsTxt.setText('Coins: ' + storage.coins); tween(coin, { scaleX: 2, scaleY: 2, alpha: 0 }, { duration: 300, onFinish: function onFinish() { coin.destroy(); } }); coins.splice(j, 1); LK.setScore(LK.getScore() + 50); updateScore(); continue; } coin.lastY = coin.y; } // Update and check power-ups for (var k = powerUps.length - 1; k >= 0; k--) { var powerUp = powerUps[k]; if (powerUp.lastY === undefined) powerUp.lastY = powerUp.y; // Remove off-screen power-ups if (powerUp.lastY <= 2732 && powerUp.y > 2732) { powerUp.destroy(); powerUps.splice(k, 1); continue; } // Check collection if (!powerUp.collected && powerUp.intersects(labubu)) { powerUp.collected = true; LK.getSound('collect').play(); if (powerUp.type === 'shield') { labubu.activateShield(); } tween(powerUp, { scaleX: 2, scaleY: 2, alpha: 0 }, { duration: 300, onFinish: function onFinish() { powerUp.destroy(); } }); powerUps.splice(k, 1); LK.setScore(LK.getScore() + 100); updateScore(); continue; } powerUp.lastY = powerUp.y; } // Reset combo if no obstacles dodged recently if (LK.ticks - lastObstacleTime > 180) { comboCount = 0; updateCombo(); } // Passive score increase if (LK.ticks % 60 === 0) { LK.setScore(LK.getScore() + 1); updateScore(); } };
===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,335 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+var storage = LK.import("@upit/storage.v1");
+
+/****
+* Classes
+****/
+var Coin = Container.expand(function () {
+ var self = Container.call(this);
+ var coinGraphics = self.attachAsset('coin', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 4;
+ self.collected = false;
+ self.update = function () {
+ self.y += self.speed;
+ self.rotation += 0.1;
+ };
+ return self;
+});
+var Labubu = Container.expand(function () {
+ var self = Container.call(this);
+ var labubuGraphics = self.attachAsset('labubu', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 8;
+ self.shielded = false;
+ self.shieldTime = 0;
+ self.update = function () {
+ if (self.shielded) {
+ self.shieldTime--;
+ if (self.shieldTime <= 0) {
+ self.shielded = false;
+ labubuGraphics.tint = 0xFFFFFF;
+ }
+ }
+ };
+ self.activateShield = function () {
+ self.shielded = true;
+ self.shieldTime = 300; // 5 seconds at 60fps
+ labubuGraphics.tint = 0x00FFFF;
+ };
+ return self;
+});
+var Obstacle = Container.expand(function () {
+ var self = Container.call(this);
+ var obstacleGraphics = self.attachAsset('obstacle', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 6;
+ self.update = function () {
+ self.y += self.speed;
+ };
+ return self;
+});
+var PowerUp = Container.expand(function () {
+ var self = Container.call(this);
+ var powerUpGraphics = self.attachAsset('shield', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 4;
+ self.collected = false;
+ self.type = 'shield';
+ self.update = function () {
+ self.y += self.speed;
+ self.rotation += 0.15;
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x1a1a2e
+});
+
+/****
+* Game Code
+****/
+var labubu = game.addChild(new Labubu());
+labubu.x = 2048 / 2;
+labubu.y = 2732 - 200;
+var obstacles = [];
+var coins = [];
+var powerUps = [];
+var gameSpeed = 1;
+var obstacleSpawnRate = 120;
+var coinSpawnRate = 180;
+var powerUpSpawnRate = 600;
+var comboCount = 0;
+var lastObstacleTime = 0;
+// UI Elements
+var scoreTxt = new Text2('Score: 0', {
+ size: 80,
+ fill: 0xFFFFFF
+});
+scoreTxt.anchor.set(0.5, 0);
+LK.gui.top.addChild(scoreTxt);
+var coinsTxt = new Text2('Coins: ' + (storage.coins || 0), {
+ size: 60,
+ fill: 0xFFD700
+});
+coinsTxt.anchor.set(1, 0);
+coinsTxt.x = -20;
+coinsTxt.y = 20;
+LK.gui.topRight.addChild(coinsTxt);
+var comboTxt = new Text2('', {
+ size: 70,
+ fill: 0xFF69B4
+});
+comboTxt.anchor.set(0.5, 0.5);
+LK.gui.center.addChild(comboTxt);
+// Touch controls
+var dragStartX = 0;
+var dragStartY = 0;
+var isDragging = false;
+game.down = function (x, y, obj) {
+ dragStartX = x;
+ dragStartY = y;
+ isDragging = true;
+};
+game.move = function (x, y, obj) {
+ if (isDragging) {
+ var deltaX = x - dragStartX;
+ var deltaY = y - dragStartY;
+ labubu.x += deltaX * 0.5;
+ labubu.y += deltaY * 0.5;
+ // Keep Labubu within screen bounds
+ labubu.x = Math.max(60, Math.min(2048 - 60, labubu.x));
+ labubu.y = Math.max(60, Math.min(2732 - 60, labubu.y));
+ dragStartX = x;
+ dragStartY = y;
+ }
+};
+game.up = function (x, y, obj) {
+ isDragging = false;
+};
+// Initialize storage
+if (storage.coins === undefined) {
+ storage.coins = 0;
+}
+if (storage.highScore === undefined) {
+ storage.highScore = 0;
+}
+function spawnObstacle() {
+ var obstacle = new Obstacle();
+ obstacle.x = Math.random() * (2048 - 160) + 80;
+ obstacle.y = -50;
+ obstacle.speed = 6 + gameSpeed * 2;
+ obstacles.push(obstacle);
+ game.addChild(obstacle);
+}
+function spawnCoin() {
+ var coin = new Coin();
+ coin.x = Math.random() * (2048 - 80) + 40;
+ coin.y = -30;
+ coin.speed = 4 + gameSpeed;
+ coins.push(coin);
+ game.addChild(coin);
+}
+function spawnPowerUp() {
+ var powerUp = new PowerUp();
+ powerUp.x = Math.random() * (2048 - 100) + 50;
+ powerUp.y = -30;
+ powerUp.speed = 4 + gameSpeed;
+ powerUps.push(powerUp);
+ game.addChild(powerUp);
+}
+function updateScore() {
+ var currentScore = LK.getScore();
+ scoreTxt.setText('Score: ' + currentScore);
+ if (currentScore > storage.highScore) {
+ storage.highScore = currentScore;
+ }
+}
+function updateCombo() {
+ if (comboCount > 5) {
+ comboTxt.setText('COMBO x' + comboCount);
+ tween(comboTxt, {
+ scaleX: 1.2,
+ scaleY: 1.2
+ }, {
+ duration: 200,
+ onFinish: function onFinish() {
+ tween(comboTxt, {
+ scaleX: 1,
+ scaleY: 1
+ }, {
+ duration: 200
+ });
+ }
+ });
+ } else {
+ comboTxt.setText('');
+ }
+}
+LK.playMusic('bgmusic');
+game.update = function () {
+ // Increase game difficulty over time
+ if (LK.ticks % 600 === 0) {
+ gameSpeed += 0.1;
+ obstacleSpawnRate = Math.max(60, obstacleSpawnRate - 2);
+ }
+ // Spawn obstacles
+ if (LK.ticks % Math.floor(obstacleSpawnRate / gameSpeed) === 0) {
+ spawnObstacle();
+ }
+ // Spawn coins
+ if (LK.ticks % Math.floor(coinSpawnRate / gameSpeed) === 0) {
+ spawnCoin();
+ }
+ // Spawn power-ups
+ if (LK.ticks % Math.floor(powerUpSpawnRate / gameSpeed) === 0) {
+ spawnPowerUp();
+ }
+ // Update and check obstacles
+ for (var i = obstacles.length - 1; i >= 0; i--) {
+ var obstacle = obstacles[i];
+ if (obstacle.lastY === undefined) obstacle.lastY = obstacle.y;
+ // Remove off-screen obstacles
+ if (obstacle.lastY <= 2732 && obstacle.y > 2732) {
+ obstacle.destroy();
+ obstacles.splice(i, 1);
+ // Increment combo for successful dodge
+ comboCount++;
+ lastObstacleTime = LK.ticks;
+ updateCombo();
+ LK.setScore(LK.getScore() + 10 * Math.max(1, Math.floor(comboCount / 5)));
+ updateScore();
+ continue;
+ }
+ // Check collision with Labubu
+ if (obstacle.intersects(labubu)) {
+ if (!labubu.shielded) {
+ LK.getSound('hit').play();
+ LK.effects.flashScreen(0xFF0000, 1000);
+ LK.showGameOver();
+ return;
+ } else {
+ // Shield absorbs hit
+ obstacle.destroy();
+ obstacles.splice(i, 1);
+ labubu.shielded = false;
+ labubu.shieldTime = 0;
+ LK.effects.flashObject(labubu, 0xFFFFFF, 300);
+ continue;
+ }
+ }
+ obstacle.lastY = obstacle.y;
+ }
+ // Update and check coins
+ for (var j = coins.length - 1; j >= 0; j--) {
+ var coin = coins[j];
+ if (coin.lastY === undefined) coin.lastY = coin.y;
+ // Remove off-screen coins
+ if (coin.lastY <= 2732 && coin.y > 2732) {
+ coin.destroy();
+ coins.splice(j, 1);
+ continue;
+ }
+ // Check collection
+ if (!coin.collected && coin.intersects(labubu)) {
+ coin.collected = true;
+ LK.getSound('collect').play();
+ storage.coins++;
+ coinsTxt.setText('Coins: ' + storage.coins);
+ tween(coin, {
+ scaleX: 2,
+ scaleY: 2,
+ alpha: 0
+ }, {
+ duration: 300,
+ onFinish: function onFinish() {
+ coin.destroy();
+ }
+ });
+ coins.splice(j, 1);
+ LK.setScore(LK.getScore() + 50);
+ updateScore();
+ continue;
+ }
+ coin.lastY = coin.y;
+ }
+ // Update and check power-ups
+ for (var k = powerUps.length - 1; k >= 0; k--) {
+ var powerUp = powerUps[k];
+ if (powerUp.lastY === undefined) powerUp.lastY = powerUp.y;
+ // Remove off-screen power-ups
+ if (powerUp.lastY <= 2732 && powerUp.y > 2732) {
+ powerUp.destroy();
+ powerUps.splice(k, 1);
+ continue;
+ }
+ // Check collection
+ if (!powerUp.collected && powerUp.intersects(labubu)) {
+ powerUp.collected = true;
+ LK.getSound('collect').play();
+ if (powerUp.type === 'shield') {
+ labubu.activateShield();
+ }
+ tween(powerUp, {
+ scaleX: 2,
+ scaleY: 2,
+ alpha: 0
+ }, {
+ duration: 300,
+ onFinish: function onFinish() {
+ powerUp.destroy();
+ }
+ });
+ powerUps.splice(k, 1);
+ LK.setScore(LK.getScore() + 100);
+ updateScore();
+ continue;
+ }
+ powerUp.lastY = powerUp.y;
+ }
+ // Reset combo if no obstacles dodged recently
+ if (LK.ticks - lastObstacleTime > 180) {
+ comboCount = 0;
+ updateCombo();
+ }
+ // Passive score increase
+ if (LK.ticks % 60 === 0) {
+ LK.setScore(LK.getScore() + 1);
+ updateScore();
+ }
+};
\ No newline at end of file