/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* 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;
}
}; ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,207 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+
+/****
+* 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: 0x000000
-});
\ No newline at end of file
+ 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;
+ }
+};
\ No newline at end of file