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