/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var PlayerCar = Container.expand(function () {
var self = Container.call(this);
var carGraphics = self.attachAsset('playerCar', {
anchorX: 0.5,
anchorY: 0.5
});
self.lane = 2; // Start in middle lane (0,1,2,3,4)
self.targetX = 0;
self.update = function () {
// Smooth movement towards target position
var diff = self.targetX - self.x;
if (Math.abs(diff) > 2) {
self.x += diff * 0.2;
}
};
self.setLane = function (lane) {
if (lane < 0) lane = 0;
if (lane > 4) lane = 4;
self.lane = lane;
self.targetX = lanePositions[lane];
};
return self;
});
var RoadLine = Container.expand(function () {
var self = Container.call(this);
var lineGraphics = self.attachAsset('roadLine', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 5;
self.update = function () {
self.y += self.speed;
if (self.y > 2732 + 50) {
self.y -= 2732 + 200;
}
};
return self;
});
var TrafficCar = Container.expand(function () {
var self = Container.call(this);
var carTypes = ['trafficCar1', 'trafficCar2', 'trafficCar3'];
var carType = carTypes[Math.floor(Math.random() * carTypes.length)];
var carGraphics = self.attachAsset(carType, {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 3 + Math.random() * 4; // Random speed between 3-7
self.baseSpeed = self.speed;
self.update = function () {
self.y += self.speed;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x34495e
});
/****
* Game Code
****/
var lanePositions = [400, 600, 800, 1000, 1200]; // X positions for 5 lanes
var roadWidth = 1000;
var roadX = 2048 / 2;
// Create road background
var road = game.addChild(LK.getAsset('road', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.6,
scaleY: 9,
x: roadX,
y: 2732 / 2
}));
// Create road lines
var roadLines = [];
for (var i = 1; i < 5; i++) {
for (var j = 0; j < 8; j++) {
var line = new RoadLine();
line.x = lanePositions[i] - 50;
line.y = j * 400 - 200;
roadLines.push(line);
game.addChild(line);
}
}
// Create player car
var playerCar = game.addChild(new PlayerCar());
playerCar.x = lanePositions[2];
playerCar.y = 2400;
playerCar.targetX = playerCar.x;
// Game variables
var trafficCars = [];
var distance = 0;
var gameSpeed = 1;
var spawnTimer = 0;
var spawnInterval = 120; // Start spawning every 2 seconds at 60fps
var dragActive = false;
var dragStartX = 0;
var lastPlayerX = playerCar.x;
// UI elements
var distanceText = new Text2('0m', {
size: 80,
fill: 0xFFFFFF
});
distanceText.anchor.set(0.5, 0);
LK.gui.top.addChild(distanceText);
distanceText.y = 100;
// Spawn traffic car
function spawnTrafficCar() {
var lane = Math.floor(Math.random() * 5);
var car = new TrafficCar();
car.x = lanePositions[lane];
car.y = -100;
car.speed *= gameSpeed;
trafficCars.push(car);
game.addChild(car);
}
// Touch/drag controls
game.down = function (x, y, obj) {
dragActive = true;
dragStartX = x;
lastPlayerX = playerCar.x;
};
game.move = function (x, y, obj) {
if (dragActive) {
var dragDistance = x - dragStartX;
var newX = lastPlayerX + dragDistance;
// Find closest lane
var closestLane = 0;
var closestDistance = Math.abs(newX - lanePositions[0]);
for (var i = 1; i < lanePositions.length; i++) {
var distance = Math.abs(newX - lanePositions[i]);
if (distance < closestDistance) {
closestDistance = distance;
closestLane = i;
}
}
playerCar.setLane(closestLane);
}
};
game.up = function (x, y, obj) {
dragActive = false;
};
// Main game update
game.update = function () {
// Update distance and speed
distance += 0.5;
LK.setScore(Math.floor(distance));
distanceText.setText(Math.floor(distance) + 'm');
// Increase difficulty over time
if (LK.ticks % 1800 === 0) {
// Every 30 seconds
gameSpeed += 0.1;
spawnInterval = Math.max(60, spawnInterval - 5);
}
// Update road line speeds
for (var i = 0; i < roadLines.length; i++) {
roadLines[i].speed = 5 * gameSpeed;
}
// Spawn new traffic cars
spawnTimer++;
if (spawnTimer >= spawnInterval) {
spawnTrafficCar();
spawnTimer = 0;
}
// Update and check collisions with traffic cars
for (var i = trafficCars.length - 1; i >= 0; i--) {
var car = trafficCars[i];
// Remove cars that are off screen
if (car.y > 2732 + 100) {
car.destroy();
trafficCars.splice(i, 1);
continue;
}
// Check collision with player
if (car.intersects(playerCar)) {
// Game over
LK.getSound('crash').play();
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
return;
}
}
}; /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var PlayerCar = Container.expand(function () {
var self = Container.call(this);
var carGraphics = self.attachAsset('playerCar', {
anchorX: 0.5,
anchorY: 0.5
});
self.lane = 2; // Start in middle lane (0,1,2,3,4)
self.targetX = 0;
self.update = function () {
// Smooth movement towards target position
var diff = self.targetX - self.x;
if (Math.abs(diff) > 2) {
self.x += diff * 0.2;
}
};
self.setLane = function (lane) {
if (lane < 0) lane = 0;
if (lane > 4) lane = 4;
self.lane = lane;
self.targetX = lanePositions[lane];
};
return self;
});
var RoadLine = Container.expand(function () {
var self = Container.call(this);
var lineGraphics = self.attachAsset('roadLine', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 5;
self.update = function () {
self.y += self.speed;
if (self.y > 2732 + 50) {
self.y -= 2732 + 200;
}
};
return self;
});
var TrafficCar = Container.expand(function () {
var self = Container.call(this);
var carTypes = ['trafficCar1', 'trafficCar2', 'trafficCar3'];
var carType = carTypes[Math.floor(Math.random() * carTypes.length)];
var carGraphics = self.attachAsset(carType, {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 3 + Math.random() * 4; // Random speed between 3-7
self.baseSpeed = self.speed;
self.update = function () {
self.y += self.speed;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x34495e
});
/****
* Game Code
****/
var lanePositions = [400, 600, 800, 1000, 1200]; // X positions for 5 lanes
var roadWidth = 1000;
var roadX = 2048 / 2;
// Create road background
var road = game.addChild(LK.getAsset('road', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.6,
scaleY: 9,
x: roadX,
y: 2732 / 2
}));
// Create road lines
var roadLines = [];
for (var i = 1; i < 5; i++) {
for (var j = 0; j < 8; j++) {
var line = new RoadLine();
line.x = lanePositions[i] - 50;
line.y = j * 400 - 200;
roadLines.push(line);
game.addChild(line);
}
}
// Create player car
var playerCar = game.addChild(new PlayerCar());
playerCar.x = lanePositions[2];
playerCar.y = 2400;
playerCar.targetX = playerCar.x;
// Game variables
var trafficCars = [];
var distance = 0;
var gameSpeed = 1;
var spawnTimer = 0;
var spawnInterval = 120; // Start spawning every 2 seconds at 60fps
var dragActive = false;
var dragStartX = 0;
var lastPlayerX = playerCar.x;
// UI elements
var distanceText = new Text2('0m', {
size: 80,
fill: 0xFFFFFF
});
distanceText.anchor.set(0.5, 0);
LK.gui.top.addChild(distanceText);
distanceText.y = 100;
// Spawn traffic car
function spawnTrafficCar() {
var lane = Math.floor(Math.random() * 5);
var car = new TrafficCar();
car.x = lanePositions[lane];
car.y = -100;
car.speed *= gameSpeed;
trafficCars.push(car);
game.addChild(car);
}
// Touch/drag controls
game.down = function (x, y, obj) {
dragActive = true;
dragStartX = x;
lastPlayerX = playerCar.x;
};
game.move = function (x, y, obj) {
if (dragActive) {
var dragDistance = x - dragStartX;
var newX = lastPlayerX + dragDistance;
// Find closest lane
var closestLane = 0;
var closestDistance = Math.abs(newX - lanePositions[0]);
for (var i = 1; i < lanePositions.length; i++) {
var distance = Math.abs(newX - lanePositions[i]);
if (distance < closestDistance) {
closestDistance = distance;
closestLane = i;
}
}
playerCar.setLane(closestLane);
}
};
game.up = function (x, y, obj) {
dragActive = false;
};
// Main game update
game.update = function () {
// Update distance and speed
distance += 0.5;
LK.setScore(Math.floor(distance));
distanceText.setText(Math.floor(distance) + 'm');
// Increase difficulty over time
if (LK.ticks % 1800 === 0) {
// Every 30 seconds
gameSpeed += 0.1;
spawnInterval = Math.max(60, spawnInterval - 5);
}
// Update road line speeds
for (var i = 0; i < roadLines.length; i++) {
roadLines[i].speed = 5 * gameSpeed;
}
// Spawn new traffic cars
spawnTimer++;
if (spawnTimer >= spawnInterval) {
spawnTrafficCar();
spawnTimer = 0;
}
// Update and check collisions with traffic cars
for (var i = trafficCars.length - 1; i >= 0; i--) {
var car = trafficCars[i];
// Remove cars that are off screen
if (car.y > 2732 + 100) {
car.destroy();
trafficCars.splice(i, 1);
continue;
}
// Check collision with player
if (car.intersects(playerCar)) {
// Game over
LK.getSound('crash').play();
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
return;
}
}
};