/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ var BTSMember = Container.expand(function (memberType) { var self = Container.call(this); // Member stats self.memberType = memberType || 'rm'; self.jumpPower = 15; self.speed = 0; self.isJumping = false; self.groundY = 2400; self.velocityY = 0; self.gravity = 0.8; // Special abilities per member switch (self.memberType) { case 'suga': self.speedBoost = 1.2; break; case 'jhope': self.jumpPower = 18; break; case 'jin': self.hasShield = true; break; default: self.speedBoost = 1.0; } var memberGraphics = self.attachAsset(self.memberType, { anchorX: 0.5, anchorY: 1.0 }); self.jump = function () { if (!self.isJumping) { self.velocityY = -self.jumpPower; self.isJumping = true; LK.getSound('jump').play(); } }; self.update = function () { // Apply gravity if (self.isJumping) { self.velocityY += self.gravity; self.y += self.velocityY; // Check if landed if (self.y >= self.groundY) { self.y = self.groundY; self.isJumping = false; self.velocityY = 0; } } // Slight animation bobbing when running if (!self.isJumping) { memberGraphics.y = Math.sin(LK.ticks * 0.3) * 3; } }; return self; }); var Fan = Container.expand(function () { var self = Container.call(this); var fanGraphics = self.attachAsset('fan', { anchorX: 0.5, anchorY: 1.0 }); self.chaseSpeed = 3; self.groundY = 2400; self.update = function () { // Chase the player if (self.x > player.x - 800) { self.x -= self.chaseSpeed; } // Slight animation fanGraphics.y = Math.sin(LK.ticks * 0.2 + self.x * 0.01) * 5; // Remove if too far behind if (self.x < player.x - 1200) { self.destroy(); } }; return self; }); var Heart = Container.expand(function () { var self = Container.call(this); var heartGraphics = self.attachAsset('heart', { anchorX: 0.5, anchorY: 0.5 }); self.collected = false; self.update = function () { self.x -= gameSpeed; // Gentle floating animation heartGraphics.y = Math.sin(LK.ticks * 0.1 + self.x * 0.01) * 10; heartGraphics.rotation += 0.02; // Check if collected if (!self.collected && self.intersects(player)) { self.collected = true; score += 10; LK.setScore(score); LK.getSound('collect').play(); // Visual effect tween(heartGraphics, { scaleX: 2, scaleY: 2, alpha: 0 }, { duration: 300, onFinish: function onFinish() { self.destroy(); } }); } // Remove if off screen if (self.x < -100) { self.destroy(); } }; return self; }); var Obstacle = Container.expand(function () { var self = Container.call(this); var obstacleGraphics = self.attachAsset('obstacle', { anchorX: 0.5, anchorY: 1.0 }); self.hit = false; self.groundY = 2400; self.update = function () { self.x -= gameSpeed; // Check collision with player if (!self.hit && self.intersects(player)) { self.hit = true; // Check if player has shield (Jin's ability) if (player.hasShield) { player.hasShield = false; LK.effects.flashObject(player, 0xFFD700, 500); } else { // Slow down player gameSpeed *= 0.8; LK.getSound('obstacle').play(); LK.effects.flashObject(player, 0xFF0000, 300); // Decrease score score = Math.max(0, score - 5); LK.setScore(score); } } // Remove if off screen if (self.x < -150) { self.destroy(); } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x87CEEB }); /**** * Game Code ****/ // Music // Sounds // Game elements // Character assets for BTS members // Game variables var score = 0; var distance = 0; var gameSpeed = 6; var maxGameSpeed = 12; var hearts = []; var fans = []; var obstacles = []; var spawnTimer = 0; var fanSpawnTimer = 0; // Member selection (default to RM) var selectedMember = storage.selectedMember || 'rm'; var player = game.addChild(new BTSMember(selectedMember)); // Position player player.x = 300; player.y = player.groundY; // Create ground var ground = game.addChild(LK.getAsset('ground', { anchorX: 0, anchorY: 0 })); ground.x = 0; ground.y = 2450; // Create UI var scoreText = new Text2('Score: 0', { size: 80, fill: 0xFFFFFF }); scoreText.anchor.set(0, 0); LK.gui.topRight.addChild(scoreText); var distanceText = new Text2('0m', { size: 60, fill: 0xFFFFFF }); distanceText.anchor.set(0.5, 0); LK.gui.top.addChild(distanceText); // Member selection UI var memberText = new Text2('Member: ' + selectedMember.toUpperCase(), { size: 50, fill: 0xFFFFFF }); memberText.anchor.set(0, 0); LK.gui.bottomLeft.addChild(memberText); // Instructions var instructionText = new Text2('Tap to Jump!', { size: 70, fill: 0xFFD700 }); instructionText.anchor.set(0.5, 0.5); LK.gui.center.addChild(instructionText); // Hide instructions after 3 seconds LK.setTimeout(function () { tween(instructionText, { alpha: 0 }, { duration: 1000 }); }, 3000); // Game controls game.down = function (x, y, obj) { player.jump(); }; // Main game loop game.update = function () { // Update distance distance += gameSpeed * 0.1; distanceText.setText(Math.floor(distance) + 'm'); // Gradually increase game speed if (gameSpeed < maxGameSpeed) { gameSpeed += 0.001; } // Update score display scoreText.setText('Score: ' + score); // Spawn hearts spawnTimer++; if (spawnTimer > 120) { // Every 2 seconds spawnTimer = 0; var heart = new Heart(); heart.x = 2200; heart.y = Math.random() * 400 + 2000; // Random height hearts.push(heart); game.addChild(heart); } // Spawn obstacles if (Math.random() < 0.005) { // Random chance var obstacle = new Obstacle(); obstacle.x = 2200; obstacle.y = obstacle.groundY; obstacles.push(obstacle); game.addChild(obstacle); } // Spawn fans fanSpawnTimer++; if (fanSpawnTimer > 300) { // Every 5 seconds fanSpawnTimer = 0; var fan = new Fan(); fan.x = player.x - 600; fan.y = fan.groundY; fans.push(fan); game.addChild(fan); } // Clean up destroyed objects hearts = hearts.filter(function (heart) { return heart.parent !== null; }); obstacles = obstacles.filter(function (obstacle) { return obstacle.parent !== null; }); fans = fans.filter(function (fan) { return fan.parent !== null; }); // Win condition - reach 1000 points if (score >= 1000) { LK.showYouWin(); } // Game over condition - if caught by fans for (var i = 0; i < fans.length; i++) { if (fans[i].x > player.x - 50) { LK.showGameOver(); break; } } // Background scrolling effect ground.x -= gameSpeed; if (ground.x <= -2048) { ground.x = 0; } }; // Play background music LK.playMusic('bgmusic'); // Save selected member storage.selectedMember = selectedMember;
===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,306 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+var storage = LK.import("@upit/storage.v1");
+
+/****
+* Classes
+****/
+var BTSMember = Container.expand(function (memberType) {
+ var self = Container.call(this);
+ // Member stats
+ self.memberType = memberType || 'rm';
+ self.jumpPower = 15;
+ self.speed = 0;
+ self.isJumping = false;
+ self.groundY = 2400;
+ self.velocityY = 0;
+ self.gravity = 0.8;
+ // Special abilities per member
+ switch (self.memberType) {
+ case 'suga':
+ self.speedBoost = 1.2;
+ break;
+ case 'jhope':
+ self.jumpPower = 18;
+ break;
+ case 'jin':
+ self.hasShield = true;
+ break;
+ default:
+ self.speedBoost = 1.0;
+ }
+ var memberGraphics = self.attachAsset(self.memberType, {
+ anchorX: 0.5,
+ anchorY: 1.0
+ });
+ self.jump = function () {
+ if (!self.isJumping) {
+ self.velocityY = -self.jumpPower;
+ self.isJumping = true;
+ LK.getSound('jump').play();
+ }
+ };
+ self.update = function () {
+ // Apply gravity
+ if (self.isJumping) {
+ self.velocityY += self.gravity;
+ self.y += self.velocityY;
+ // Check if landed
+ if (self.y >= self.groundY) {
+ self.y = self.groundY;
+ self.isJumping = false;
+ self.velocityY = 0;
+ }
+ }
+ // Slight animation bobbing when running
+ if (!self.isJumping) {
+ memberGraphics.y = Math.sin(LK.ticks * 0.3) * 3;
+ }
+ };
+ return self;
+});
+var Fan = Container.expand(function () {
+ var self = Container.call(this);
+ var fanGraphics = self.attachAsset('fan', {
+ anchorX: 0.5,
+ anchorY: 1.0
+ });
+ self.chaseSpeed = 3;
+ self.groundY = 2400;
+ self.update = function () {
+ // Chase the player
+ if (self.x > player.x - 800) {
+ self.x -= self.chaseSpeed;
+ }
+ // Slight animation
+ fanGraphics.y = Math.sin(LK.ticks * 0.2 + self.x * 0.01) * 5;
+ // Remove if too far behind
+ if (self.x < player.x - 1200) {
+ self.destroy();
+ }
+ };
+ return self;
+});
+var Heart = Container.expand(function () {
+ var self = Container.call(this);
+ var heartGraphics = self.attachAsset('heart', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.collected = false;
+ self.update = function () {
+ self.x -= gameSpeed;
+ // Gentle floating animation
+ heartGraphics.y = Math.sin(LK.ticks * 0.1 + self.x * 0.01) * 10;
+ heartGraphics.rotation += 0.02;
+ // Check if collected
+ if (!self.collected && self.intersects(player)) {
+ self.collected = true;
+ score += 10;
+ LK.setScore(score);
+ LK.getSound('collect').play();
+ // Visual effect
+ tween(heartGraphics, {
+ scaleX: 2,
+ scaleY: 2,
+ alpha: 0
+ }, {
+ duration: 300,
+ onFinish: function onFinish() {
+ self.destroy();
+ }
+ });
+ }
+ // Remove if off screen
+ if (self.x < -100) {
+ self.destroy();
+ }
+ };
+ return self;
+});
+var Obstacle = Container.expand(function () {
+ var self = Container.call(this);
+ var obstacleGraphics = self.attachAsset('obstacle', {
+ anchorX: 0.5,
+ anchorY: 1.0
+ });
+ self.hit = false;
+ self.groundY = 2400;
+ self.update = function () {
+ self.x -= gameSpeed;
+ // Check collision with player
+ if (!self.hit && self.intersects(player)) {
+ self.hit = true;
+ // Check if player has shield (Jin's ability)
+ if (player.hasShield) {
+ player.hasShield = false;
+ LK.effects.flashObject(player, 0xFFD700, 500);
+ } else {
+ // Slow down player
+ gameSpeed *= 0.8;
+ LK.getSound('obstacle').play();
+ LK.effects.flashObject(player, 0xFF0000, 300);
+ // Decrease score
+ score = Math.max(0, score - 5);
+ LK.setScore(score);
+ }
+ }
+ // Remove if off screen
+ if (self.x < -150) {
+ self.destroy();
+ }
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x87CEEB
+});
+
+/****
+* Game Code
+****/
+// Music
+// Sounds
+// Game elements
+// Character assets for BTS members
+// Game variables
+var score = 0;
+var distance = 0;
+var gameSpeed = 6;
+var maxGameSpeed = 12;
+var hearts = [];
+var fans = [];
+var obstacles = [];
+var spawnTimer = 0;
+var fanSpawnTimer = 0;
+// Member selection (default to RM)
+var selectedMember = storage.selectedMember || 'rm';
+var player = game.addChild(new BTSMember(selectedMember));
+// Position player
+player.x = 300;
+player.y = player.groundY;
+// Create ground
+var ground = game.addChild(LK.getAsset('ground', {
+ anchorX: 0,
+ anchorY: 0
+}));
+ground.x = 0;
+ground.y = 2450;
+// Create UI
+var scoreText = new Text2('Score: 0', {
+ size: 80,
+ fill: 0xFFFFFF
+});
+scoreText.anchor.set(0, 0);
+LK.gui.topRight.addChild(scoreText);
+var distanceText = new Text2('0m', {
+ size: 60,
+ fill: 0xFFFFFF
+});
+distanceText.anchor.set(0.5, 0);
+LK.gui.top.addChild(distanceText);
+// Member selection UI
+var memberText = new Text2('Member: ' + selectedMember.toUpperCase(), {
+ size: 50,
+ fill: 0xFFFFFF
+});
+memberText.anchor.set(0, 0);
+LK.gui.bottomLeft.addChild(memberText);
+// Instructions
+var instructionText = new Text2('Tap to Jump!', {
+ size: 70,
+ fill: 0xFFD700
+});
+instructionText.anchor.set(0.5, 0.5);
+LK.gui.center.addChild(instructionText);
+// Hide instructions after 3 seconds
+LK.setTimeout(function () {
+ tween(instructionText, {
+ alpha: 0
+ }, {
+ duration: 1000
+ });
+}, 3000);
+// Game controls
+game.down = function (x, y, obj) {
+ player.jump();
+};
+// Main game loop
+game.update = function () {
+ // Update distance
+ distance += gameSpeed * 0.1;
+ distanceText.setText(Math.floor(distance) + 'm');
+ // Gradually increase game speed
+ if (gameSpeed < maxGameSpeed) {
+ gameSpeed += 0.001;
+ }
+ // Update score display
+ scoreText.setText('Score: ' + score);
+ // Spawn hearts
+ spawnTimer++;
+ if (spawnTimer > 120) {
+ // Every 2 seconds
+ spawnTimer = 0;
+ var heart = new Heart();
+ heart.x = 2200;
+ heart.y = Math.random() * 400 + 2000; // Random height
+ hearts.push(heart);
+ game.addChild(heart);
+ }
+ // Spawn obstacles
+ if (Math.random() < 0.005) {
+ // Random chance
+ var obstacle = new Obstacle();
+ obstacle.x = 2200;
+ obstacle.y = obstacle.groundY;
+ obstacles.push(obstacle);
+ game.addChild(obstacle);
+ }
+ // Spawn fans
+ fanSpawnTimer++;
+ if (fanSpawnTimer > 300) {
+ // Every 5 seconds
+ fanSpawnTimer = 0;
+ var fan = new Fan();
+ fan.x = player.x - 600;
+ fan.y = fan.groundY;
+ fans.push(fan);
+ game.addChild(fan);
+ }
+ // Clean up destroyed objects
+ hearts = hearts.filter(function (heart) {
+ return heart.parent !== null;
+ });
+ obstacles = obstacles.filter(function (obstacle) {
+ return obstacle.parent !== null;
+ });
+ fans = fans.filter(function (fan) {
+ return fan.parent !== null;
+ });
+ // Win condition - reach 1000 points
+ if (score >= 1000) {
+ LK.showYouWin();
+ }
+ // Game over condition - if caught by fans
+ for (var i = 0; i < fans.length; i++) {
+ if (fans[i].x > player.x - 50) {
+ LK.showGameOver();
+ break;
+ }
+ }
+ // Background scrolling effect
+ ground.x -= gameSpeed;
+ if (ground.x <= -2048) {
+ ground.x = 0;
+ }
+};
+// Play background music
+LK.playMusic('bgmusic');
+// Save selected member
+storage.selectedMember = selectedMember;
\ No newline at end of file