/**** * Classes ****/ var Car = Container.expand(function () { var self = Container.call(this); var carGraphics = self.attachAsset('car', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 0; self.maxSpeed = 12; self.acceleration = 0.02; self.driftDirection = 0; // -1 left, 0 straight, 1 right self.driftSpeed = 0; self.maxDriftSpeed = 8; self.driftDecay = 0.92; self.roadPosition = 0; // Position relative to road center (-1 to 1) self.update = function () { // Increase speed over time if (self.speed < self.maxSpeed) { self.speed += self.acceleration; } // Apply drifting if (self.driftDirection !== 0) { self.driftSpeed += self.driftDirection * 0.8; self.driftSpeed = Math.max(-self.maxDriftSpeed, Math.min(self.maxDriftSpeed, self.driftSpeed)); } // Apply drift decay when not actively drifting if (self.driftDirection === 0) { self.driftSpeed *= self.driftDecay; } // Update road position based on drift self.roadPosition += self.driftSpeed * 0.02; // Update visual rotation for drifting effect carGraphics.rotation = self.driftSpeed * 0.15; }; self.startDrift = function (direction) { self.driftDirection = direction; }; self.stopDrift = function () { self.driftDirection = 0; }; return self; }); var RoadSegment = Container.expand(function () { var self = Container.call(this); self.roadWidth = 400; self.curveAmount = 0; self.segmentHeight = 40; var roadCenter = self.attachAsset('roadSegment', { anchorX: 0.5, anchorY: 0.5 }); var leftEdge = self.attachAsset('roadEdge', { anchorX: 0.5, anchorY: 0.5 }); var rightEdge = self.attachAsset('roadEdge', { anchorX: 0.5, anchorY: 0.5 }); self.setup = function (width, curve) { self.roadWidth = width; self.curveAmount = curve; roadCenter.width = width; leftEdge.x = -width / 2 - 10; rightEdge.x = width / 2 + 10; }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x87ceeb }); /**** * Game Code ****/ var car = game.addChild(new Car()); var roadSegments = []; var roadCurve = 0; var roadCurveChange = 0; var distance = 0; var gameSpeed = 1; var roadWidth = 400; var minRoadWidth = 200; var roadNarrowRate = 0.001; // UI Elements var scoreTxt = new Text2('0m', { size: 80, fill: 0xFFFFFF }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); var speedTxt = new Text2('Speed: 0', { size: 50, fill: 0xFFFFFF }); speedTxt.anchor.set(0, 0); speedTxt.x = 50; speedTxt.y = 50; LK.gui.topLeft.addChild(speedTxt); // Position car car.x = 2048 / 2; car.y = 2732 - 300; // Create initial road segments for (var i = 0; i < 20; i++) { var segment = new RoadSegment(); segment.y = 2732 - i * 40; segment.x = 2048 / 2; segment.setup(roadWidth, 0); roadSegments.push(segment); game.addChild(segment); } // Input handling var isDrifting = false; var driftDirection = 0; game.down = function (x, y, obj) { isDrifting = true; driftDirection = x < 2048 / 2 ? -1 : 1; car.startDrift(driftDirection); LK.getSound('drift').play(); }; game.up = function (x, y, obj) { isDrifting = false; car.stopDrift(); }; // Game update loop game.update = function () { // Update distance and score distance += car.speed * 0.1; scoreTxt.setText(Math.floor(distance) + 'm'); speedTxt.setText('Speed: ' + Math.floor(car.speed * 10)); // Gradually narrow the road if (roadWidth > minRoadWidth) { roadWidth -= roadNarrowRate; } // Update road curve roadCurveChange += (Math.random() - 0.5) * 0.02; roadCurveChange = Math.max(-0.1, Math.min(0.1, roadCurveChange)); roadCurve += roadCurveChange; // Move road segments down for (var i = roadSegments.length - 1; i >= 0; i--) { var segment = roadSegments[i]; segment.y += car.speed * 2; // Apply curve to segment position var curveOffset = Math.sin(segment.y * 0.01 + roadCurve) * 100; segment.x = 2048 / 2 + curveOffset; // Remove segments that are off screen if (segment.y > 2732 + 100) { segment.destroy(); roadSegments.splice(i, 1); } } // Add new road segments at the top while (roadSegments.length < 25) { var newSegment = new RoadSegment(); var lastSegment = roadSegments[0]; newSegment.y = lastSegment.y - 40; var curveOffset = Math.sin(newSegment.y * 0.01 + roadCurve) * 100; newSegment.x = 2048 / 2 + curveOffset; newSegment.setup(roadWidth, roadCurve); roadSegments.unshift(newSegment); game.addChild(newSegment); } // Update car position based on road curve and drift var nearestSegment = null; var minDistance = Infinity; for (var j = 0; j < roadSegments.length; j++) { var seg = roadSegments[j]; var dist = Math.abs(seg.y - car.y); if (dist < minDistance) { minDistance = dist; nearestSegment = seg; } } if (nearestSegment) { // Calculate car's world position relative to road var carWorldX = car.x + car.roadPosition * 200; var roadCenterX = nearestSegment.x; var roadLeftEdge = roadCenterX - roadWidth / 2; var roadRightEdge = roadCenterX + roadWidth / 2; // Update car visual position car.x = roadCenterX + car.roadPosition * 200; // Check if car is off the road if (carWorldX < roadLeftEdge || carWorldX > roadRightEdge) { // Game over LK.getSound('crash').play(); LK.effects.flashScreen(0xff0000, 1000); LK.setScore(Math.floor(distance)); LK.showGameOver(); } } // Increase game speed over time gameSpeed += 0.001; if (car.maxSpeed < 20) { car.maxSpeed += 0.002; } };
/****
* Classes
****/
var Car = Container.expand(function () {
var self = Container.call(this);
var carGraphics = self.attachAsset('car', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 0;
self.maxSpeed = 12;
self.acceleration = 0.02;
self.driftDirection = 0; // -1 left, 0 straight, 1 right
self.driftSpeed = 0;
self.maxDriftSpeed = 8;
self.driftDecay = 0.92;
self.roadPosition = 0; // Position relative to road center (-1 to 1)
self.update = function () {
// Increase speed over time
if (self.speed < self.maxSpeed) {
self.speed += self.acceleration;
}
// Apply drifting
if (self.driftDirection !== 0) {
self.driftSpeed += self.driftDirection * 0.8;
self.driftSpeed = Math.max(-self.maxDriftSpeed, Math.min(self.maxDriftSpeed, self.driftSpeed));
}
// Apply drift decay when not actively drifting
if (self.driftDirection === 0) {
self.driftSpeed *= self.driftDecay;
}
// Update road position based on drift
self.roadPosition += self.driftSpeed * 0.02;
// Update visual rotation for drifting effect
carGraphics.rotation = self.driftSpeed * 0.15;
};
self.startDrift = function (direction) {
self.driftDirection = direction;
};
self.stopDrift = function () {
self.driftDirection = 0;
};
return self;
});
var RoadSegment = Container.expand(function () {
var self = Container.call(this);
self.roadWidth = 400;
self.curveAmount = 0;
self.segmentHeight = 40;
var roadCenter = self.attachAsset('roadSegment', {
anchorX: 0.5,
anchorY: 0.5
});
var leftEdge = self.attachAsset('roadEdge', {
anchorX: 0.5,
anchorY: 0.5
});
var rightEdge = self.attachAsset('roadEdge', {
anchorX: 0.5,
anchorY: 0.5
});
self.setup = function (width, curve) {
self.roadWidth = width;
self.curveAmount = curve;
roadCenter.width = width;
leftEdge.x = -width / 2 - 10;
rightEdge.x = width / 2 + 10;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87ceeb
});
/****
* Game Code
****/
var car = game.addChild(new Car());
var roadSegments = [];
var roadCurve = 0;
var roadCurveChange = 0;
var distance = 0;
var gameSpeed = 1;
var roadWidth = 400;
var minRoadWidth = 200;
var roadNarrowRate = 0.001;
// UI Elements
var scoreTxt = new Text2('0m', {
size: 80,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
var speedTxt = new Text2('Speed: 0', {
size: 50,
fill: 0xFFFFFF
});
speedTxt.anchor.set(0, 0);
speedTxt.x = 50;
speedTxt.y = 50;
LK.gui.topLeft.addChild(speedTxt);
// Position car
car.x = 2048 / 2;
car.y = 2732 - 300;
// Create initial road segments
for (var i = 0; i < 20; i++) {
var segment = new RoadSegment();
segment.y = 2732 - i * 40;
segment.x = 2048 / 2;
segment.setup(roadWidth, 0);
roadSegments.push(segment);
game.addChild(segment);
}
// Input handling
var isDrifting = false;
var driftDirection = 0;
game.down = function (x, y, obj) {
isDrifting = true;
driftDirection = x < 2048 / 2 ? -1 : 1;
car.startDrift(driftDirection);
LK.getSound('drift').play();
};
game.up = function (x, y, obj) {
isDrifting = false;
car.stopDrift();
};
// Game update loop
game.update = function () {
// Update distance and score
distance += car.speed * 0.1;
scoreTxt.setText(Math.floor(distance) + 'm');
speedTxt.setText('Speed: ' + Math.floor(car.speed * 10));
// Gradually narrow the road
if (roadWidth > minRoadWidth) {
roadWidth -= roadNarrowRate;
}
// Update road curve
roadCurveChange += (Math.random() - 0.5) * 0.02;
roadCurveChange = Math.max(-0.1, Math.min(0.1, roadCurveChange));
roadCurve += roadCurveChange;
// Move road segments down
for (var i = roadSegments.length - 1; i >= 0; i--) {
var segment = roadSegments[i];
segment.y += car.speed * 2;
// Apply curve to segment position
var curveOffset = Math.sin(segment.y * 0.01 + roadCurve) * 100;
segment.x = 2048 / 2 + curveOffset;
// Remove segments that are off screen
if (segment.y > 2732 + 100) {
segment.destroy();
roadSegments.splice(i, 1);
}
}
// Add new road segments at the top
while (roadSegments.length < 25) {
var newSegment = new RoadSegment();
var lastSegment = roadSegments[0];
newSegment.y = lastSegment.y - 40;
var curveOffset = Math.sin(newSegment.y * 0.01 + roadCurve) * 100;
newSegment.x = 2048 / 2 + curveOffset;
newSegment.setup(roadWidth, roadCurve);
roadSegments.unshift(newSegment);
game.addChild(newSegment);
}
// Update car position based on road curve and drift
var nearestSegment = null;
var minDistance = Infinity;
for (var j = 0; j < roadSegments.length; j++) {
var seg = roadSegments[j];
var dist = Math.abs(seg.y - car.y);
if (dist < minDistance) {
minDistance = dist;
nearestSegment = seg;
}
}
if (nearestSegment) {
// Calculate car's world position relative to road
var carWorldX = car.x + car.roadPosition * 200;
var roadCenterX = nearestSegment.x;
var roadLeftEdge = roadCenterX - roadWidth / 2;
var roadRightEdge = roadCenterX + roadWidth / 2;
// Update car visual position
car.x = roadCenterX + car.roadPosition * 200;
// Check if car is off the road
if (carWorldX < roadLeftEdge || carWorldX > roadRightEdge) {
// Game over
LK.getSound('crash').play();
LK.effects.flashScreen(0xff0000, 1000);
LK.setScore(Math.floor(distance));
LK.showGameOver();
}
}
// Increase game speed over time
gameSpeed += 0.001;
if (car.maxSpeed < 20) {
car.maxSpeed += 0.002;
}
};