/****
* 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