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