/**** * Plugins ****/ var tween = LK.import("@upit/tween.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 = 8; self.collected = false; self.update = function () { self.x -= self.speed; coinGraphics.rotation += 0.1; }; return self; }); var Enemy = Container.expand(function () { var self = Container.call(this); var enemyGraphics = self.attachAsset('enemy', { anchorX: 0.5, anchorY: 1.0 }); self.speed = 8; self.moveDirection = 1; self.moveRange = 100; self.startY = 0; self.update = function () { self.x -= self.speed; self.y += self.moveDirection * 2; if (Math.abs(self.y - self.startY) > self.moveRange) { self.moveDirection *= -1; } }; return self; }); var Gap = Container.expand(function () { var self = Container.call(this); var gapGraphics = self.attachAsset('gap', { anchorX: 0, anchorY: 0 }); self.speed = 8; self.update = function () { self.x -= self.speed; }; return self; }); var Ground = Container.expand(function () { var self = Container.call(this); var groundGraphics = self.attachAsset('ground', { anchorX: 0, anchorY: 0 }); self.speed = 8; self.update = function () { self.x -= self.speed; }; return self; }); var Player = Container.expand(function () { var self = Container.call(this); var playerGraphics = self.attachAsset('player', { anchorX: 0.5, anchorY: 1.0 }); self.velocityY = 0; self.isGrounded = false; self.jumpPower = -20; self.gravity = 1.2; self.groundY = 2400; self.jump = function () { if (self.isGrounded) { self.velocityY = self.jumpPower; self.isGrounded = false; LK.getSound('jump').play(); } }; self.update = function () { self.velocityY += self.gravity; self.y += self.velocityY; if (self.y >= self.groundY) { self.y = self.groundY; self.velocityY = 0; self.isGrounded = true; } }; return self; }); var Spike = Container.expand(function () { var self = Container.call(this); var spikeGraphics = self.attachAsset('spike', { anchorX: 0.5, anchorY: 1.0 }); self.speed = 8; self.update = function () { self.x -= self.speed; }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x87ceeb }); /**** * Game Code ****/ var player; var obstacles = []; var coins = []; var groundTiles = []; var gameSpeed = 8; var spawnTimer = 0; var coinSpawnTimer = 0; var speedIncreaseTimer = 0; var distance = 0; var coinScore = 0; // UI Elements var scoreText = new Text2('Score: 0', { size: 60, fill: 0xFFFFFF }); scoreText.anchor.set(0, 0); LK.gui.topLeft.addChild(scoreText); scoreText.x = 120; scoreText.y = 20; var distanceText = new Text2('Distance: 0m', { size: 60, fill: 0xFFFFFF }); distanceText.anchor.set(1, 0); LK.gui.topRight.addChild(distanceText); distanceText.x = -20; distanceText.y = 20; // Initialize player player = game.addChild(new Player()); player.x = 300; player.y = 2400; // Initialize ground tiles for (var i = 0; i < 15; i++) { var groundTile = game.addChild(new Ground()); groundTile.x = i * 200; groundTile.y = 2400; groundTiles.push(groundTile); } function spawnObstacle() { var obstacleType = Math.floor(Math.random() * 3); var obstacle; switch (obstacleType) { case 0: // Spike obstacle = new Spike(); obstacle.x = 2200; obstacle.y = 2400; break; case 1: // Gap obstacle = new Gap(); obstacle.x = 2200; obstacle.y = 2400; break; case 2: // Enemy obstacle = new Enemy(); obstacle.x = 2200; obstacle.y = 2200; obstacle.startY = obstacle.y; break; } if (obstacle) { obstacles.push(obstacle); game.addChild(obstacle); } } function spawnCoin() { var coin = new Coin(); coin.x = 2200; coin.y = 2000 + Math.random() * 300; coins.push(coin); game.addChild(coin); } function updateScore() { var totalScore = Math.floor(distance / 10) + coinScore * 10; scoreText.setText('Score: ' + totalScore); distanceText.setText('Distance: ' + Math.floor(distance / 10) + 'm'); LK.setScore(totalScore); } function checkCollisions() { // Check obstacle collisions for (var i = obstacles.length - 1; i >= 0; i--) { var obstacle = obstacles[i]; if (player.intersects(obstacle)) { LK.effects.flashScreen(0xff0000, 500); LK.showGameOver(); return; } } // Check coin collisions for (var j = coins.length - 1; j >= 0; j--) { var coin = coins[j]; if (!coin.collected && player.intersects(coin)) { coin.collected = true; coinScore++; LK.getSound('coin').play(); coin.alpha = 0; tween(coin, { scaleX: 2, scaleY: 2 }, { duration: 200 }); } } } game.down = function (x, y, obj) { player.jump(); }; game.update = function () { distance += gameSpeed / 10; // Update all objects for (var i = obstacles.length - 1; i >= 0; i--) { var obstacle = obstacles[i]; obstacle.speed = gameSpeed; if (obstacle.x < -200) { obstacle.destroy(); obstacles.splice(i, 1); } } for (var j = coins.length - 1; j >= 0; j--) { var coin = coins[j]; coin.speed = gameSpeed; if (coin.x < -100) { coin.destroy(); coins.splice(j, 1); } } for (var k = 0; k < groundTiles.length; k++) { var tile = groundTiles[k]; tile.speed = gameSpeed; if (tile.x < -200) { tile.x = tile.x + groundTiles.length * 200; } } // Spawn obstacles spawnTimer++; if (spawnTimer > 80 - Math.min(gameSpeed * 2, 50)) { spawnObstacle(); spawnTimer = 0; } // Spawn coins coinSpawnTimer++; if (coinSpawnTimer > 120) { if (Math.random() < 0.7) { spawnCoin(); } coinSpawnTimer = 0; } // Increase speed over time speedIncreaseTimer++; if (speedIncreaseTimer > 300) { gameSpeed += 0.5; speedIncreaseTimer = 0; } checkCollisions(); updateScore(); };
/****
* Plugins
****/
var tween = LK.import("@upit/tween.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 = 8;
self.collected = false;
self.update = function () {
self.x -= self.speed;
coinGraphics.rotation += 0.1;
};
return self;
});
var Enemy = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('enemy', {
anchorX: 0.5,
anchorY: 1.0
});
self.speed = 8;
self.moveDirection = 1;
self.moveRange = 100;
self.startY = 0;
self.update = function () {
self.x -= self.speed;
self.y += self.moveDirection * 2;
if (Math.abs(self.y - self.startY) > self.moveRange) {
self.moveDirection *= -1;
}
};
return self;
});
var Gap = Container.expand(function () {
var self = Container.call(this);
var gapGraphics = self.attachAsset('gap', {
anchorX: 0,
anchorY: 0
});
self.speed = 8;
self.update = function () {
self.x -= self.speed;
};
return self;
});
var Ground = Container.expand(function () {
var self = Container.call(this);
var groundGraphics = self.attachAsset('ground', {
anchorX: 0,
anchorY: 0
});
self.speed = 8;
self.update = function () {
self.x -= self.speed;
};
return self;
});
var Player = Container.expand(function () {
var self = Container.call(this);
var playerGraphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 1.0
});
self.velocityY = 0;
self.isGrounded = false;
self.jumpPower = -20;
self.gravity = 1.2;
self.groundY = 2400;
self.jump = function () {
if (self.isGrounded) {
self.velocityY = self.jumpPower;
self.isGrounded = false;
LK.getSound('jump').play();
}
};
self.update = function () {
self.velocityY += self.gravity;
self.y += self.velocityY;
if (self.y >= self.groundY) {
self.y = self.groundY;
self.velocityY = 0;
self.isGrounded = true;
}
};
return self;
});
var Spike = Container.expand(function () {
var self = Container.call(this);
var spikeGraphics = self.attachAsset('spike', {
anchorX: 0.5,
anchorY: 1.0
});
self.speed = 8;
self.update = function () {
self.x -= self.speed;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87ceeb
});
/****
* Game Code
****/
var player;
var obstacles = [];
var coins = [];
var groundTiles = [];
var gameSpeed = 8;
var spawnTimer = 0;
var coinSpawnTimer = 0;
var speedIncreaseTimer = 0;
var distance = 0;
var coinScore = 0;
// UI Elements
var scoreText = new Text2('Score: 0', {
size: 60,
fill: 0xFFFFFF
});
scoreText.anchor.set(0, 0);
LK.gui.topLeft.addChild(scoreText);
scoreText.x = 120;
scoreText.y = 20;
var distanceText = new Text2('Distance: 0m', {
size: 60,
fill: 0xFFFFFF
});
distanceText.anchor.set(1, 0);
LK.gui.topRight.addChild(distanceText);
distanceText.x = -20;
distanceText.y = 20;
// Initialize player
player = game.addChild(new Player());
player.x = 300;
player.y = 2400;
// Initialize ground tiles
for (var i = 0; i < 15; i++) {
var groundTile = game.addChild(new Ground());
groundTile.x = i * 200;
groundTile.y = 2400;
groundTiles.push(groundTile);
}
function spawnObstacle() {
var obstacleType = Math.floor(Math.random() * 3);
var obstacle;
switch (obstacleType) {
case 0:
// Spike
obstacle = new Spike();
obstacle.x = 2200;
obstacle.y = 2400;
break;
case 1:
// Gap
obstacle = new Gap();
obstacle.x = 2200;
obstacle.y = 2400;
break;
case 2:
// Enemy
obstacle = new Enemy();
obstacle.x = 2200;
obstacle.y = 2200;
obstacle.startY = obstacle.y;
break;
}
if (obstacle) {
obstacles.push(obstacle);
game.addChild(obstacle);
}
}
function spawnCoin() {
var coin = new Coin();
coin.x = 2200;
coin.y = 2000 + Math.random() * 300;
coins.push(coin);
game.addChild(coin);
}
function updateScore() {
var totalScore = Math.floor(distance / 10) + coinScore * 10;
scoreText.setText('Score: ' + totalScore);
distanceText.setText('Distance: ' + Math.floor(distance / 10) + 'm');
LK.setScore(totalScore);
}
function checkCollisions() {
// Check obstacle collisions
for (var i = obstacles.length - 1; i >= 0; i--) {
var obstacle = obstacles[i];
if (player.intersects(obstacle)) {
LK.effects.flashScreen(0xff0000, 500);
LK.showGameOver();
return;
}
}
// Check coin collisions
for (var j = coins.length - 1; j >= 0; j--) {
var coin = coins[j];
if (!coin.collected && player.intersects(coin)) {
coin.collected = true;
coinScore++;
LK.getSound('coin').play();
coin.alpha = 0;
tween(coin, {
scaleX: 2,
scaleY: 2
}, {
duration: 200
});
}
}
}
game.down = function (x, y, obj) {
player.jump();
};
game.update = function () {
distance += gameSpeed / 10;
// Update all objects
for (var i = obstacles.length - 1; i >= 0; i--) {
var obstacle = obstacles[i];
obstacle.speed = gameSpeed;
if (obstacle.x < -200) {
obstacle.destroy();
obstacles.splice(i, 1);
}
}
for (var j = coins.length - 1; j >= 0; j--) {
var coin = coins[j];
coin.speed = gameSpeed;
if (coin.x < -100) {
coin.destroy();
coins.splice(j, 1);
}
}
for (var k = 0; k < groundTiles.length; k++) {
var tile = groundTiles[k];
tile.speed = gameSpeed;
if (tile.x < -200) {
tile.x = tile.x + groundTiles.length * 200;
}
}
// Spawn obstacles
spawnTimer++;
if (spawnTimer > 80 - Math.min(gameSpeed * 2, 50)) {
spawnObstacle();
spawnTimer = 0;
}
// Spawn coins
coinSpawnTimer++;
if (coinSpawnTimer > 120) {
if (Math.random() < 0.7) {
spawnCoin();
}
coinSpawnTimer = 0;
}
// Increase speed over time
speedIncreaseTimer++;
if (speedIncreaseTimer > 300) {
gameSpeed += 0.5;
speedIncreaseTimer = 0;
}
checkCollisions();
updateScore();
};