/**** * Classes ****/ var Coin = Container.expand(function () { var self = Container.call(this); var coinGraphics = self.attachAsset('coin', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 15; self.active = true; self.lastY = 0; self.collected = false; self.update = function () { self.lastY = self.y; self.y += self.speed; // Rotate coin self.rotation += 0.05; // Check if coin is off screen if (self.y > 2832) { self.active = false; } }; return self; }); // Game variables var Motorcycle = Container.expand(function () { var self = Container.call(this); var motorcycleGraphics = self.attachAsset('motorcycle', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 10; self.lane = 1; // 0 = left, 1 = center, 2 = right self.lanePositions = [680, 1024, 1368]; // X positions for lanes self.targetX = self.lanePositions[self.lane]; self.isMoving = false; self.update = function () { // Smooth lane movement if (self.x < self.targetX - 5) { self.x += self.speed; } else if (self.x > self.targetX + 5) { self.x -= self.speed; } else { self.x = self.targetX; self.isMoving = false; } }; self.moveLeft = function () { if (self.lane > 0 && !self.isMoving) { self.lane--; self.targetX = self.lanePositions[self.lane]; self.isMoving = true; } }; self.moveRight = function () { if (self.lane < 2 && !self.isMoving) { self.lane++; self.targetX = self.lanePositions[self.lane]; self.isMoving = true; } }; // Adding free movement for any direction except backward self.freeMove = function (targetX) { // Don't allow moving backwards (above current Y) self.targetX = targetX; self.isMoving = true; }; return self; }); var Obstacle = Container.expand(function () { var self = Container.call(this); var obstacleGraphics = self.attachAsset('obstacle', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 15; self.active = true; self.lastY = 0; self.update = function () { self.lastY = self.y; self.y += self.speed; // Check if obstacle is off screen if (self.y > 2832) { self.active = false; } }; return self; }); var Road = Container.expand(function () { var self = Container.call(this); // Add road background var roadGraphics = self.attachAsset('road', { anchorX: 0.5, anchorY: 0 }); // Create road lines self.lines = []; self.lineSpeed = 15; self.lineInterval = 150; self.createLine = function (y) { var line = self.addChild(LK.getAsset('roadLine', { anchorX: 0.5, anchorY: 0.5, x: 0, y: y })); self.lines.push(line); return line; }; // Initialize road lines for (var y = -100; y < 2732 + 100; y += self.lineInterval) { self.createLine(y); } self.update = function () { // Update road lines for (var i = self.lines.length - 1; i >= 0; i--) { var line = self.lines[i]; line.y += self.lineSpeed; // If line goes beyond the bottom of the screen, move it to the top if (line.y > 2732 + 100) { line.y = -100; } } }; return self; }); var Scenery = Container.expand(function () { var self = Container.call(this); self.speed = 15; self.items = []; self.nextItemTime = 0; // Scenery types self.types = ['tree', 'house', 'flower']; self.createTree = function (side, y) { var tree = new Container(); // Create trunk var trunk = tree.addChild(LK.getAsset('treeTrunk', { anchorX: 0.5, anchorY: 1.0, x: 0, y: 0 })); // Create foliage var foliage = tree.addChild(LK.getAsset('tree', { anchorX: 0.5, anchorY: 1.0, x: 0, y: -trunk.height })); // Position tree tree.x = side === 'left' ? 350 : 1700; tree.y = y; self.addChild(tree); self.items.push({ element: tree, type: 'tree' }); return tree; }; self.createHouse = function (side, y) { var house = new Container(); // Create house body var houseBody = house.addChild(LK.getAsset('house', { anchorX: 0.5, anchorY: 1.0, x: 0, y: 0 })); // Create house roof var houseRoof = house.addChild(LK.getAsset('houseRoof', { anchorX: 0.5, anchorY: 1.0, x: 0, y: -houseBody.height })); // Position house house.x = side === 'left' ? 350 : 1700; house.y = y; self.addChild(house); self.items.push({ element: house, type: 'house' }); return house; }; self.createFlower = function (side, y) { var flowerGroup = new Container(); // Create a cluster of flowers for (var i = 0; i < 5; i++) { var flower = flowerGroup.addChild(LK.getAsset('flower', { anchorX: 0.5, anchorY: 0.5, x: Math.random() * 150 - 75, y: Math.random() * 50 - 25 })); // Random color for variety var colors = [0xff88ff, 0xffff44, 0xff4444, 0x4488ff, 0xffffff]; flower.tint = colors[Math.floor(Math.random() * colors.length)]; } // Position flowers flowerGroup.x = side === 'left' ? 400 : 1650; flowerGroup.y = y; self.addChild(flowerGroup); self.items.push({ element: flowerGroup, type: 'flower' }); return flowerGroup; }; self.addRandomScenery = function () { var side = Math.random() > 0.5 ? 'left' : 'right'; var type = self.types[Math.floor(Math.random() * self.types.length)]; switch (type) { case 'tree': self.createTree(side, -200); break; case 'house': self.createHouse(side, -200); break; case 'flower': self.createFlower(side, -100); break; } }; self.update = function () { // Update existing scenery items for (var i = self.items.length - 1; i >= 0; i--) { var item = self.items[i]; item.element.y += self.speed; // Remove items that have moved off screen if (item.element.y > 2832) { item.element.destroy(); self.items.splice(i, 1); } } // Add new scenery based on timing if (LK.ticks > self.nextItemTime) { self.addRandomScenery(); // Random interval for next scenery self.nextItemTime = LK.ticks + 30 + Math.floor(Math.random() * 60); } }; self.setSpeed = function (newSpeed) { self.speed = newSpeed; }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000000 }); /**** * Game Code ****/ // Game variables // Game assets var road; var motorcycle; var scenery; var obstacles = []; var coins = []; var score = 0; var distance = 0; var gameActive = true; var obstacleSpawnRate = 90; // Frames between obstacle spawns var coinSpawnRate = 120; // Frames between coin spawns var difficultyIncreaseRate = 100; // Distance between difficulty increases (in meters) var gameSpeed = 15; var lastDifficultyIncrease = 0; var level = 1; var levelTxt; // Play background music LK.playMusic('backround'); // Set up score display var scoreTxt = new Text2('Score: 0', { size: 70, fill: 0xFFFFFF }); scoreTxt.anchor.set(0, 0); LK.gui.topLeft.addChild(scoreTxt); scoreTxt.x = 120; // Avoid the top left 100x100 px area // Set up distance display var distanceTxt = new Text2('Distance: 0m', { size: 70, fill: 0xFFFFFF }); distanceTxt.anchor.set(1, 0); LK.gui.topRight.addChild(distanceTxt); // Create level display levelTxt = new Text2('Level: 1', { size: 70, fill: 0xFFFFFF }); levelTxt.anchor.set(0.5, 0); LK.gui.top.addChild(levelTxt); // Create scenery scenery = game.addChild(new Scenery()); // Create and position road road = game.addChild(new Road()); road.x = 2048 / 2; // Create and position motorcycle motorcycle = game.addChild(new Motorcycle()); motorcycle.x = 1024; // Center lane motorcycle.y = 2200; // Near bottom of screen // Handle touches for motorcycle control game.down = function (x, y, obj) { // Allow free horizontal movement but prevent going backward if (x >= 0 && x <= 2048) { // Restrict to screen width if (x < motorcycle.lanePositions[0]) { motorcycle.targetX = motorcycle.lanePositions[0]; // Left boundary } else if (x > motorcycle.lanePositions[2]) { motorcycle.targetX = motorcycle.lanePositions[2]; // Right boundary } else { motorcycle.targetX = x; } motorcycle.isMoving = true; } }; // Helper functions function spawnObstacle() { var obstacle = new Obstacle(); // Random lane position var lane = Math.floor(Math.random() * 3); // 0, 1, or 2 obstacle.x = motorcycle.lanePositions[lane]; obstacle.y = -100; // Above screen obstacles.push(obstacle); game.addChild(obstacle); return obstacle; } function spawnCoin() { var coin = new Coin(); // Random lane position var lane = Math.floor(Math.random() * 3); // 0, 1, or 2 coin.x = motorcycle.lanePositions[lane]; coin.y = -100; // Above screen coins.push(coin); game.addChild(coin); return coin; } function checkCollisions() { if (!gameActive) return; // Check obstacle collisions for (var i = obstacles.length - 1; i >= 0; i--) { var obstacle = obstacles[i]; // Check collision with motorcycle if (obstacle.active && motorcycle.intersects(obstacle)) { // Game over gameActive = false; LK.getSound('crash').play(); LK.effects.flashScreen(0xFF0000, 1000); LK.setTimeout(function () { LK.showGameOver(); }, 1000); return; } // Remove inactive obstacles if (!obstacle.active) { obstacle.destroy(); obstacles.splice(i, 1); } } // Check coin collisions for (var j = coins.length - 1; j >= 0; j--) { var coin = coins[j]; // Check collision with motorcycle if (coin.active && !coin.collected && motorcycle.intersects(coin)) { // Collect coin coin.collected = true; coin.active = false; LK.getSound('coinCollect').play(); // Update score score += 10; scoreTxt.setText("Score: " + score); // Flash effect LK.effects.flashObject(coin, 0xFFFFFF, 300); } // Remove inactive coins if (!coin.active) { coin.destroy(); coins.splice(j, 1); } } } function increaseDifficulty() { // Check if we've traveled 100 meters since the last difficulty increase var currentDistanceMeters = Math.floor(distance / 10); if (currentDistanceMeters - lastDifficultyIncrease >= difficultyIncreaseRate) { // Increase game level level++; levelTxt.setText("Level: " + level); // Play level up sound LK.getSound('levelUp').play(); // Flash screen effect for level up LK.effects.flashScreen(0x00FF00, 500); // Increase game speed gameSpeed += 2; // Decrease spawn rates (make obstacles appear more frequently) obstacleSpawnRate = Math.max(30, obstacleSpawnRate - 10); coinSpawnRate = Math.max(50, coinSpawnRate - 8); // Update road line speed road.lineSpeed = gameSpeed; // Update scenery speed scenery.setSpeed(gameSpeed); // Update obstacle and coin speed for (var i = 0; i < obstacles.length; i++) { obstacles[i].speed = gameSpeed; } for (var j = 0; j < coins.length; j++) { coins[j].speed = gameSpeed; } // Record the distance where we last increased difficulty lastDifficultyIncrease = currentDistanceMeters; } } // Main game update function game.update = function () { if (!gameActive) return; // Update scenery scenery.update(); // Update road road.update(); // Update motorcycle motorcycle.update(); // Update all obstacles for (var i = 0; i < obstacles.length; i++) { obstacles[i].update(); } // Update all coins for (var j = 0; j < coins.length; j++) { coins[j].update(); } // Spawn new obstacles if (LK.ticks % obstacleSpawnRate === 0) { spawnObstacle(); } // Spawn new coins if (LK.ticks % coinSpawnRate === 0) { spawnCoin(); } // Check collisions checkCollisions(); // Update distance distance += 1; distanceTxt.setText("Distance: " + Math.floor(distance / 10) + "m"); // Update score based on distance if (LK.ticks % 10 === 0) { score += 1; scoreTxt.setText("Score: " + score); LK.setScore(score); } // Increase difficulty over time increaseDifficulty(); };
/****
* Classes
****/
var Coin = Container.expand(function () {
var self = Container.call(this);
var coinGraphics = self.attachAsset('coin', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 15;
self.active = true;
self.lastY = 0;
self.collected = false;
self.update = function () {
self.lastY = self.y;
self.y += self.speed;
// Rotate coin
self.rotation += 0.05;
// Check if coin is off screen
if (self.y > 2832) {
self.active = false;
}
};
return self;
});
// Game variables
var Motorcycle = Container.expand(function () {
var self = Container.call(this);
var motorcycleGraphics = self.attachAsset('motorcycle', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 10;
self.lane = 1; // 0 = left, 1 = center, 2 = right
self.lanePositions = [680, 1024, 1368]; // X positions for lanes
self.targetX = self.lanePositions[self.lane];
self.isMoving = false;
self.update = function () {
// Smooth lane movement
if (self.x < self.targetX - 5) {
self.x += self.speed;
} else if (self.x > self.targetX + 5) {
self.x -= self.speed;
} else {
self.x = self.targetX;
self.isMoving = false;
}
};
self.moveLeft = function () {
if (self.lane > 0 && !self.isMoving) {
self.lane--;
self.targetX = self.lanePositions[self.lane];
self.isMoving = true;
}
};
self.moveRight = function () {
if (self.lane < 2 && !self.isMoving) {
self.lane++;
self.targetX = self.lanePositions[self.lane];
self.isMoving = true;
}
};
// Adding free movement for any direction except backward
self.freeMove = function (targetX) {
// Don't allow moving backwards (above current Y)
self.targetX = targetX;
self.isMoving = true;
};
return self;
});
var Obstacle = Container.expand(function () {
var self = Container.call(this);
var obstacleGraphics = self.attachAsset('obstacle', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 15;
self.active = true;
self.lastY = 0;
self.update = function () {
self.lastY = self.y;
self.y += self.speed;
// Check if obstacle is off screen
if (self.y > 2832) {
self.active = false;
}
};
return self;
});
var Road = Container.expand(function () {
var self = Container.call(this);
// Add road background
var roadGraphics = self.attachAsset('road', {
anchorX: 0.5,
anchorY: 0
});
// Create road lines
self.lines = [];
self.lineSpeed = 15;
self.lineInterval = 150;
self.createLine = function (y) {
var line = self.addChild(LK.getAsset('roadLine', {
anchorX: 0.5,
anchorY: 0.5,
x: 0,
y: y
}));
self.lines.push(line);
return line;
};
// Initialize road lines
for (var y = -100; y < 2732 + 100; y += self.lineInterval) {
self.createLine(y);
}
self.update = function () {
// Update road lines
for (var i = self.lines.length - 1; i >= 0; i--) {
var line = self.lines[i];
line.y += self.lineSpeed;
// If line goes beyond the bottom of the screen, move it to the top
if (line.y > 2732 + 100) {
line.y = -100;
}
}
};
return self;
});
var Scenery = Container.expand(function () {
var self = Container.call(this);
self.speed = 15;
self.items = [];
self.nextItemTime = 0;
// Scenery types
self.types = ['tree', 'house', 'flower'];
self.createTree = function (side, y) {
var tree = new Container();
// Create trunk
var trunk = tree.addChild(LK.getAsset('treeTrunk', {
anchorX: 0.5,
anchorY: 1.0,
x: 0,
y: 0
}));
// Create foliage
var foliage = tree.addChild(LK.getAsset('tree', {
anchorX: 0.5,
anchorY: 1.0,
x: 0,
y: -trunk.height
}));
// Position tree
tree.x = side === 'left' ? 350 : 1700;
tree.y = y;
self.addChild(tree);
self.items.push({
element: tree,
type: 'tree'
});
return tree;
};
self.createHouse = function (side, y) {
var house = new Container();
// Create house body
var houseBody = house.addChild(LK.getAsset('house', {
anchorX: 0.5,
anchorY: 1.0,
x: 0,
y: 0
}));
// Create house roof
var houseRoof = house.addChild(LK.getAsset('houseRoof', {
anchorX: 0.5,
anchorY: 1.0,
x: 0,
y: -houseBody.height
}));
// Position house
house.x = side === 'left' ? 350 : 1700;
house.y = y;
self.addChild(house);
self.items.push({
element: house,
type: 'house'
});
return house;
};
self.createFlower = function (side, y) {
var flowerGroup = new Container();
// Create a cluster of flowers
for (var i = 0; i < 5; i++) {
var flower = flowerGroup.addChild(LK.getAsset('flower', {
anchorX: 0.5,
anchorY: 0.5,
x: Math.random() * 150 - 75,
y: Math.random() * 50 - 25
}));
// Random color for variety
var colors = [0xff88ff, 0xffff44, 0xff4444, 0x4488ff, 0xffffff];
flower.tint = colors[Math.floor(Math.random() * colors.length)];
}
// Position flowers
flowerGroup.x = side === 'left' ? 400 : 1650;
flowerGroup.y = y;
self.addChild(flowerGroup);
self.items.push({
element: flowerGroup,
type: 'flower'
});
return flowerGroup;
};
self.addRandomScenery = function () {
var side = Math.random() > 0.5 ? 'left' : 'right';
var type = self.types[Math.floor(Math.random() * self.types.length)];
switch (type) {
case 'tree':
self.createTree(side, -200);
break;
case 'house':
self.createHouse(side, -200);
break;
case 'flower':
self.createFlower(side, -100);
break;
}
};
self.update = function () {
// Update existing scenery items
for (var i = self.items.length - 1; i >= 0; i--) {
var item = self.items[i];
item.element.y += self.speed;
// Remove items that have moved off screen
if (item.element.y > 2832) {
item.element.destroy();
self.items.splice(i, 1);
}
}
// Add new scenery based on timing
if (LK.ticks > self.nextItemTime) {
self.addRandomScenery();
// Random interval for next scenery
self.nextItemTime = LK.ticks + 30 + Math.floor(Math.random() * 60);
}
};
self.setSpeed = function (newSpeed) {
self.speed = newSpeed;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000000
});
/****
* Game Code
****/
// Game variables
// Game assets
var road;
var motorcycle;
var scenery;
var obstacles = [];
var coins = [];
var score = 0;
var distance = 0;
var gameActive = true;
var obstacleSpawnRate = 90; // Frames between obstacle spawns
var coinSpawnRate = 120; // Frames between coin spawns
var difficultyIncreaseRate = 100; // Distance between difficulty increases (in meters)
var gameSpeed = 15;
var lastDifficultyIncrease = 0;
var level = 1;
var levelTxt;
// Play background music
LK.playMusic('backround');
// Set up score display
var scoreTxt = new Text2('Score: 0', {
size: 70,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0, 0);
LK.gui.topLeft.addChild(scoreTxt);
scoreTxt.x = 120; // Avoid the top left 100x100 px area
// Set up distance display
var distanceTxt = new Text2('Distance: 0m', {
size: 70,
fill: 0xFFFFFF
});
distanceTxt.anchor.set(1, 0);
LK.gui.topRight.addChild(distanceTxt);
// Create level display
levelTxt = new Text2('Level: 1', {
size: 70,
fill: 0xFFFFFF
});
levelTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(levelTxt);
// Create scenery
scenery = game.addChild(new Scenery());
// Create and position road
road = game.addChild(new Road());
road.x = 2048 / 2;
// Create and position motorcycle
motorcycle = game.addChild(new Motorcycle());
motorcycle.x = 1024; // Center lane
motorcycle.y = 2200; // Near bottom of screen
// Handle touches for motorcycle control
game.down = function (x, y, obj) {
// Allow free horizontal movement but prevent going backward
if (x >= 0 && x <= 2048) {
// Restrict to screen width
if (x < motorcycle.lanePositions[0]) {
motorcycle.targetX = motorcycle.lanePositions[0]; // Left boundary
} else if (x > motorcycle.lanePositions[2]) {
motorcycle.targetX = motorcycle.lanePositions[2]; // Right boundary
} else {
motorcycle.targetX = x;
}
motorcycle.isMoving = true;
}
};
// Helper functions
function spawnObstacle() {
var obstacle = new Obstacle();
// Random lane position
var lane = Math.floor(Math.random() * 3); // 0, 1, or 2
obstacle.x = motorcycle.lanePositions[lane];
obstacle.y = -100; // Above screen
obstacles.push(obstacle);
game.addChild(obstacle);
return obstacle;
}
function spawnCoin() {
var coin = new Coin();
// Random lane position
var lane = Math.floor(Math.random() * 3); // 0, 1, or 2
coin.x = motorcycle.lanePositions[lane];
coin.y = -100; // Above screen
coins.push(coin);
game.addChild(coin);
return coin;
}
function checkCollisions() {
if (!gameActive) return;
// Check obstacle collisions
for (var i = obstacles.length - 1; i >= 0; i--) {
var obstacle = obstacles[i];
// Check collision with motorcycle
if (obstacle.active && motorcycle.intersects(obstacle)) {
// Game over
gameActive = false;
LK.getSound('crash').play();
LK.effects.flashScreen(0xFF0000, 1000);
LK.setTimeout(function () {
LK.showGameOver();
}, 1000);
return;
}
// Remove inactive obstacles
if (!obstacle.active) {
obstacle.destroy();
obstacles.splice(i, 1);
}
}
// Check coin collisions
for (var j = coins.length - 1; j >= 0; j--) {
var coin = coins[j];
// Check collision with motorcycle
if (coin.active && !coin.collected && motorcycle.intersects(coin)) {
// Collect coin
coin.collected = true;
coin.active = false;
LK.getSound('coinCollect').play();
// Update score
score += 10;
scoreTxt.setText("Score: " + score);
// Flash effect
LK.effects.flashObject(coin, 0xFFFFFF, 300);
}
// Remove inactive coins
if (!coin.active) {
coin.destroy();
coins.splice(j, 1);
}
}
}
function increaseDifficulty() {
// Check if we've traveled 100 meters since the last difficulty increase
var currentDistanceMeters = Math.floor(distance / 10);
if (currentDistanceMeters - lastDifficultyIncrease >= difficultyIncreaseRate) {
// Increase game level
level++;
levelTxt.setText("Level: " + level);
// Play level up sound
LK.getSound('levelUp').play();
// Flash screen effect for level up
LK.effects.flashScreen(0x00FF00, 500);
// Increase game speed
gameSpeed += 2;
// Decrease spawn rates (make obstacles appear more frequently)
obstacleSpawnRate = Math.max(30, obstacleSpawnRate - 10);
coinSpawnRate = Math.max(50, coinSpawnRate - 8);
// Update road line speed
road.lineSpeed = gameSpeed;
// Update scenery speed
scenery.setSpeed(gameSpeed);
// Update obstacle and coin speed
for (var i = 0; i < obstacles.length; i++) {
obstacles[i].speed = gameSpeed;
}
for (var j = 0; j < coins.length; j++) {
coins[j].speed = gameSpeed;
}
// Record the distance where we last increased difficulty
lastDifficultyIncrease = currentDistanceMeters;
}
}
// Main game update function
game.update = function () {
if (!gameActive) return;
// Update scenery
scenery.update();
// Update road
road.update();
// Update motorcycle
motorcycle.update();
// Update all obstacles
for (var i = 0; i < obstacles.length; i++) {
obstacles[i].update();
}
// Update all coins
for (var j = 0; j < coins.length; j++) {
coins[j].update();
}
// Spawn new obstacles
if (LK.ticks % obstacleSpawnRate === 0) {
spawnObstacle();
}
// Spawn new coins
if (LK.ticks % coinSpawnRate === 0) {
spawnCoin();
}
// Check collisions
checkCollisions();
// Update distance
distance += 1;
distanceTxt.setText("Distance: " + Math.floor(distance / 10) + "m");
// Update score based on distance
if (LK.ticks % 10 === 0) {
score += 1;
scoreTxt.setText("Score: " + score);
LK.setScore(score);
}
// Increase difficulty over time
increaseDifficulty();
};
coin. In-Game asset. 2d. High contrast. No shadows
what appears from the upper side motorcycle. In-Game asset. 2d. High contrast. No shadows
the stone. In-Game asset. 2d. High contrast. No shadows
let there be a house and let the house be surrounded by lawns and flowers. In-Game asset. 2d. High contrast. No shadows
tree. In-Game asset. 2d. High contrast. No shadows