User prompt
Change startbutton color to orange ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Please fix the bug: 'startButton.attachAsset is not a function' in or related to this line: 'var startButtonAsset = startButton.attachAsset('startbutton', {' Line Number: 640
User prompt
Add startbutton asset to the start game title
User prompt
Remove startButtonGraphic from the game
User prompt
Change startbuttonhraphic to orange
User prompt
Change start game color to white
User prompt
Move menuwallpaper UP by 400 units
User prompt
Move menuwallpaper left by 300 units
User prompt
MOVE THEMENUWALLPAPER LEFT BY 400 UNITS
User prompt
FIX THIS FAIL POSITION
User prompt
this is not the center of the screen!!!
User prompt
place the menuwallpaper center to the center of the screen!!!
User prompt
add menuwallpaper to the menu
User prompt
change it black
User prompt
change the menu ground wallpaper to menuwallpaper asset
User prompt
rename wallpaper asset to ground
User prompt
remove title from the menu
User prompt
add roadSegmentShadow asset to the asset list
User prompt
remove roadSegmentShadow from the game
User prompt
remove wheeltrack asset from the game
User prompt
remove shadows from the menu
User prompt
remove all stripes from the menu
User prompt
remove all effects from the menu
User prompt
remove underline from the game
User prompt
Add roadtrack line under the car, but above the roads. Roadtrack Line angle should be the same as the road under it. Roadtrack LINE only disappear if reach the edge of the screen.
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var BlurBackground = Container.expand(function (options) {
var self = Container.call(this);
self.graphics = new Graphics();
self.addChild(self.graphics);
self.options = options || {};
self.options.blur = self.options.blur || 10;
self.options.width = self.options.width || 2048;
self.options.height = self.options.height || 2732;
self.updateGraphics = function () {
self.graphics.clear();
self.graphics.beginFill(0x0a0a0a, 0.95); // Very dark background for modern look
self.graphics.drawRect(0, 0, self.options.width, self.options.height);
self.graphics.endFill();
};
self.applyBlur = function () {
var blurFilter = new filters.BlurFilter();
blurFilter.blur = self.options.blur;
// Filters not supported in LK engine - commenting out assignment
// self.filters = [blurFilter];
};
self.updateGraphics();
self.applyBlur();
return self;
});
var Car = Container.expand(function () {
var self = Container.call(this);
self.projectMovement = function (vector) {
var angle = -Math.PI / 4;
var cosAngle = Math.cos(angle);
var sinAngle = Math.sin(angle);
return {
x: vector.x * cosAngle - vector.y * sinAngle,
y: vector.x * sinAngle + vector.y * cosAngle
};
};
var carGraphics = self.attachAsset('car', {
anchorX: 0.5,
anchorY: 0.5
});
// Create headlight beam effect (right beam)
self.headlightBeam = self.attachAsset('beamR', {
anchorX: 0.5,
anchorY: 1.0,
width: 1400,
height: 1200,
alpha: 0.3,
tint: 0xFFFF88
});
self.headlightBeam.x = 753;
self.headlightBeam.y = -50;
// Create second headlight beam next to the first one
self.headlightBeam2 = self.attachAsset('beamR', {
anchorX: 0.5,
anchorY: 1.0,
width: 1400,
height: 1200,
alpha: 0.3,
tint: 0xFFFF88
});
self.headlightBeam2.x = 838;
self.headlightBeam2.y = -15;
// Create left headlight beam effect
self.leftBeam = self.attachAsset('beamL', {
anchorX: 0.5,
anchorY: 1.0,
width: 1400,
height: 1200,
alpha: 0.3,
tint: 0xFFFF88
});
self.leftBeam.x = -753;
self.leftBeam.y = -50;
self.leftBeam.visible = false;
// Create second left headlight beam next to the first one
self.leftBeam2 = self.attachAsset('beamL', {
anchorX: 0.5,
anchorY: 1.0,
width: 1400,
height: 1200,
alpha: 0.3,
tint: 0xFFFF88
});
self.leftBeam2.x = -838;
self.leftBeam2.y = -15;
self.leftBeam2.visible = false;
self.speed = 5;
self.direction = 0;
self.momentum = {
x: 0,
y: 0
};
self._move_migrated = function () {
var momentumModifier = 0.1;
if (self.direction === 0) {
self.momentum.x += self.speed * momentumModifier;
} else {
self.momentum.y -= self.speed * momentumModifier;
}
var projectedMovement = self.projectMovement(self.momentum);
// Check if car reaches the center of the screen on the X coordinate
if (self.lastX <= 2048 / 2 && self.x > 2048 / 2) {
console.log("Car reached the center of the screen on the X coordinate");
}
self.lastX = self.x;
self.x += projectedMovement.x;
self.y += projectedMovement.y;
// Check if car arrives at a specific X, Y coordinate
if (self.lastY <= 1500 && self.y > 1500 && self.lastX <= 1000 && self.x > 1000) {
console.log("Car arrived at the specific X, Y coordinate");
}
self.lastY = self.y;
self.lastX = self.x;
// Check if car comes close to the bottom of the screen on the Y coordinate
if (self.lastY <= 2732 - 100 && self.y > 2732 - 100) {
console.log("Car is close to the bottom of the screen");
}
self.lastY = self.y;
var nonTravelMomentum;
if (self.direction === 0) {
self.momentum.x *= 0.98;
self.momentum.y *= 0.95;
nonTravelMomentum = self.momentum.y;
} else {
self.momentum.x *= 0.95;
self.momentum.y *= 0.98;
nonTravelMomentum = self.momentum.x;
}
self.nonTravelMomentum = nonTravelMomentum;
// Show beamR only when car is turned to the right (direction === 0)
var shouldShowRightBeam = self.direction === 0;
self.headlightBeam.visible = shouldShowRightBeam;
self.headlightBeam2.visible = shouldShowRightBeam;
// Show beamL only when car is turned to the left (direction === 1)
var shouldShowLeftBeam = self.direction === 1;
if (self.leftBeam) {
self.leftBeam.visible = shouldShowLeftBeam;
}
if (self.leftBeam2) {
self.leftBeam2.visible = shouldShowLeftBeam;
}
if (shouldShowRightBeam) {
// Update headlight beam intensity based on speed
var totalSpeed = Math.sqrt(self.momentum.x * self.momentum.x + self.momentum.y * self.momentum.y);
var beamIntensity = Math.min(0.6, Math.max(0.2, totalSpeed * 0.05));
// Animate headlight beam flickering
tween(self.headlightBeam, {
alpha: beamIntensity
}, {
duration: 100 + Math.random() * 200,
easing: tween.easeInOut,
onFinish: function onFinish() {
// Create slight flickering effect
var flickerAlpha = beamIntensity + (Math.random() - 0.5) * 0.1;
tween(self.headlightBeam, {
alpha: Math.max(0.1, flickerAlpha)
}, {
duration: 50,
easing: tween.linear
});
}
});
// Animate second beam with slight variation
tween(self.headlightBeam2, {
alpha: beamIntensity
}, {
duration: 120 + Math.random() * 180,
easing: tween.easeInOut,
onFinish: function onFinish() {
// Create slight flickering effect
var flickerAlpha = beamIntensity + (Math.random() - 0.5) * 0.1;
tween(self.headlightBeam2, {
alpha: Math.max(0.1, flickerAlpha)
}, {
duration: 60,
easing: tween.linear
});
}
});
}
if (shouldShowLeftBeam && self.leftBeam) {
// Update left beam intensity based on speed
var totalSpeed = Math.sqrt(self.momentum.x * self.momentum.x + self.momentum.y * self.momentum.y);
var beamIntensity = Math.min(0.6, Math.max(0.2, totalSpeed * 0.05));
// Animate left beam flickering
tween(self.leftBeam, {
alpha: beamIntensity
}, {
duration: 100 + Math.random() * 200,
easing: tween.easeInOut,
onFinish: function onFinish() {
// Create slight flickering effect
var flickerAlpha = beamIntensity + (Math.random() - 0.5) * 0.1;
tween(self.leftBeam, {
alpha: Math.max(0.1, flickerAlpha)
}, {
duration: 50,
easing: tween.linear
});
}
});
// Animate second left beam with slight variation
if (self.leftBeam2) {
tween(self.leftBeam2, {
alpha: beamIntensity
}, {
duration: 120 + Math.random() * 180,
easing: tween.easeInOut,
onFinish: function onFinish() {
// Create slight flickering effect
var flickerAlpha = beamIntensity + (Math.random() - 0.5) * 0.1;
tween(self.leftBeam2, {
alpha: Math.max(0.1, flickerAlpha)
}, {
duration: 60,
easing: tween.linear
});
}
});
}
}
// Adjust beam width based on direction and momentum
var beamWidth = 1350 + Math.abs(self.nonTravelMomentum) * 20;
tween(self.headlightBeam, {
width: beamWidth
}, {
duration: 200,
easing: tween.easeOut
});
// Update second beam width as well
tween(self.headlightBeam2, {
width: beamWidth
}, {
duration: 200,
easing: tween.easeOut
});
if (self.leftBeam) {
tween(self.leftBeam, {
width: beamWidth
}, {
duration: 200,
easing: tween.easeOut
});
}
if (self.leftBeam2) {
tween(self.leftBeam2, {
width: beamWidth
}, {
duration: 200,
easing: tween.easeOut
});
}
};
self.changeDirection = function () {
self.direction = self.direction === 0 ? 1 : 0;
carGraphics.scale.x *= -1;
// Synchronize beam rotation with car direction
self.headlightBeam.scale.x *= -1;
self.headlightBeam2.scale.x *= -1;
if (self.leftBeam) {
self.leftBeam.scale.x *= -1;
}
if (self.leftBeam2) {
self.leftBeam2.scale.x *= -1;
}
};
});
var DriftAndDodge = Container.expand(function () {
var self = Container.call(this);
});
var Dust = Container.expand(function () {
var self = Container.call(this);
var dustGraphics = self.attachAsset('dust', {
anchorX: 0.5,
anchorY: 0.5
});
self.lifetime = 60;
self.velocityY = -2 - Math.random() * 3;
self.velocityX = (Math.random() - 0.5) * 2;
self.fadeSpeed = 0.02;
self.scaleSpeed = 0.02;
self.update = function () {
self.y += self.velocityY;
self.x += self.velocityX;
self.alpha -= self.fadeSpeed;
self.scaleX += self.scaleSpeed;
self.scaleY += self.scaleSpeed;
if (self.alpha <= 0 || --self.lifetime <= 0) {
self.destroy();
}
};
return self;
});
// Add the game logic for 'DriftAndDodge' here
var Graphics = Container.expand(function () {
var self = Container.call(this);
self.clear = function () {};
self.beginFill = function (color, alpha) {
self._fillColor = color;
self._fillAlpha = alpha;
};
self.drawRect = function (x, y, width, height) {
var rect = LK.getAsset('beamR', {
// Using 'beamR' asset for rectangle drawing
x: x,
y: y,
width: width,
height: height,
tint: self._fillColor,
alpha: self._fillAlpha
});
self.addChild(rect);
};
self.endFill = function () {};
return self;
});
var Particle = Container.expand(function () {
var self = Container.call(this);
var particleGraphics = self.attachAsset('particle', {
anchorX: 0.5,
anchorY: 0.5
});
particleGraphics.rotation = Math.PI / 4;
self.lifetime = 100;
self.tick = function () {
if (--self.lifetime <= 0) {
self.destroy();
}
};
});
var Rock = Container.expand(function () {
var self = Container.call(this);
var rockGraphics = self.attachAsset('rock', {
anchorX: 0.5,
anchorY: 0.5
});
});
var SnowyEmbankment = Container.expand(function () {
var self = Container.call(this);
var embankmentGraphics = self.attachAsset('rods', {
anchorX: 0.5,
anchorY: 0.5
});
});
var Tree = Container.expand(function () {
var self = Container.call(this);
var treeGraphics = self.attachAsset('tree', {
anchorX: 0.5,
anchorY: 0.5
});
});
var Tree2 = Container.expand(function () {
var self = Container.call(this);
var treeGraphics = self.attachAsset('tree2', {
anchorX: 0.5,
anchorY: 0.5
});
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0xFFFFFF
});
/****
* Game Code
****/
var filters = {
BlurFilter: function BlurFilter() {
this.blur = 0;
}
};
var driftAndDodge = game.addChild(new DriftAndDodge());
driftAndDodge.on('down', function (x, y, obj) {
// Add the event handler for 'down' event here
});
driftAndDodge.on('up', function (x, y, obj) {
// Add the event handler for 'up' event here
});
driftAndDodge.on('move', function (x, y, obj) {
// Add the event handler for 'move' event here
});
game.calculateDistanceToPoint = function (point, segmentStart, segmentEnd) {
var A = point.x - segmentStart.x;
var B = point.y - segmentStart.y;
var C = segmentEnd.x - segmentStart.x;
var D = segmentEnd.y - segmentStart.y;
var dot = A * C + B * D;
var len_sq = C * C + D * D;
var param = -1;
if (len_sq != 0) {
param = dot / len_sq;
}
var xx, yy;
if (param < 0) {
xx = segmentStart.x;
yy = segmentStart.y;
} else if (param > 1) {
xx = segmentEnd.x;
yy = segmentEnd.y;
} else {
xx = segmentStart.x + param * C;
yy = segmentStart.y + param * D;
}
var dx = point.x - xx;
var dy = point.y - yy;
return Math.sqrt(dx * dx + dy * dy);
};
game.addRoadSegment = function () {
var lastSegment = roadSegments[roadSegments.length - 1];
zigzag = !zigzag;
var segment = roadContainer.attachAsset('roadSegment', {
anchorX: 0.5
});
// Adjust segment width based on difficulty
var difficultyMultiplier = 1.0;
if (currentDifficulty === 'Normal') {
difficultyMultiplier = 0.85; // Make track 15% thinner
} else if (currentDifficulty === 'Hard') {
difficultyMultiplier = 0.5; // Make track 50% thinner for extreme difficulty
}
segment.width = segmentWidth * difficultyMultiplier;
// More aggressive width reduction for hard mode
var widthReduction = currentDifficulty === 'Hard' ? 25 : 15;
segmentWidth = Math.max(350 * difficultyMultiplier, segmentWidth - widthReduction);
segment.height = (i === 1 ? 3000 : Math.floor(Math.random() * (4000 - 1200 + 1)) + 1200) * 2;
segment.rotation = zigzag ? -Math.PI - Math.PI / 4 : -Math.PI + Math.PI / 4;
segment.y = currentY;
segment.x = currentX;
var adjustedHeight = segment.height - segmentWidth / 2;
currentY += adjustedHeight * Math.cos(segment.rotation);
currentX -= adjustedHeight * Math.sin(segment.rotation);
segment.shadow = roadContainer.attachAsset('roadSegmentShadow', {
anchorX: 0.5
});
segment.shadow.width = segment.width;
segment.shadow.height = segment.height;
segment.shadow.rotation = segment.rotation;
segment.shadow.x = segment.x;
segment.shadow.y = segment.y + 50;
segment.shadow.alpha = 1;
segment.used = false;
roadSegments.push(segment);
roadContainer.addChildAt(segment.shadow, 0);
roadContainer.addChild(segment);
// Add multiple trees to the left and right of the road segment
var treeSpacing = 300; // Increase space between trees
var numberOfTrees = Math.floor(segment.height / treeSpacing) - 3; // Decrease the number of trees by 3
var numberOfTree2 = Math.floor(segment.height / treeSpacing) - 3; // Decrease the number of tree2 by 3
for (var i = 0; i < numberOfTree2; i++) {
var leftTree = new Tree();
leftTree.x = segment.x - segment.width - 100 - i * treeSpacing; // Move trees closer to road by reducing distance
leftTree.y = segment.y + i * treeSpacing;
roadContainer.addChild(leftTree);
var rightTree = new Tree2();
rightTree.x = segment.x + segment.width + 100 + i * treeSpacing; // Move trees closer to road by reducing distance
rightTree.y = segment.y + i * treeSpacing;
roadContainer.addChild(rightTree);
}
// Add rocks to the left and right of the road segment
var leftRock = new Rock();
leftRock.x = segment.x - segment.width - 1000; // Double the distance from the road
leftRock.y = segment.y;
roadContainer.addChildAt(leftRock, 0);
roadContainer.addChildAt(rightRock, 0);
var rightRock = new Rock();
rightRock.x = segment.x + segment.width + 1000; // Double the distance from the road
rightRock.y = segment.y;
// Attach snowy embankments to the left and right of the road segment
var leftEmbankment = new SnowyEmbankment();
leftEmbankment.x = segment.x - segment.width / 2 - 50; // Increase distance by 50 units
leftEmbankment.y = segment.y;
roadContainer.addChild(leftEmbankment);
var rightEmbankment = new SnowyEmbankment();
rightEmbankment.x = segment.x + segment.width / 2 + 50; // Increase distance by 50 units
rightEmbankment.y = segment.y;
roadContainer.addChild(rightEmbankment);
};
game.setBackgroundColor(0x000000); // Set background to black
var particles = [];
var dustParticles = [];
var mainContainer = game.addChild(new Container());
var roadContainer = mainContainer.addChild(new Container());
var roadSegments = [];
var segmentLength = Math.floor(Math.random() * (1000 - 200 + 1)) + 200;
var segmentWidth = 1200;
var currentX = 2048 / 2;
var currentY = 2732 / 2;
var zigzag = true;
for (var i = 1; i <= 15; i++) {
game.addRoadSegment();
}
var turnText = new Text2('Turn:', {
size: 50,
fill: 0xFFFFFF,
weight: '800',
dropShadow: true,
dropShadowColor: '#373330',
dropShadowBlur: 4,
dropShadowAngle: Math.PI / 6,
dropShadowDistance: 6
});
turnText.anchor.set(1, 0); // Anchor to right edge so it aligns nicely with score
turnText.visible = false; // Hide turn text initially
LK.gui.topRight.addChild(turnText);
var scoreText = new Text2('0', {
size: 50,
fill: 0xFFFFFF,
weight: '800',
dropShadow: true,
dropShadowColor: '#373330',
dropShadowBlur: 4,
dropShadowAngle: Math.PI / 6,
dropShadowDistance: 6
});
scoreText.anchor.set(0, 0);
scoreText.visible = false; // Hide score text initially
LK.gui.topRight.addChild(scoreText);
// Position turn text to the left of score text
turnText.x = scoreText.x - 107;
turnText.y = scoreText.y;
// Move score text left by 69 units
scoreText.x = scoreText.x - 69;
// Add a neon blue-colored speedometer to the bottom left corner of the map
var isMenuShowing = true;
var speedometer = new Text2('Speed: 0', {
size: 50,
fill: 0xFFD700,
// Gold color
weight: '800',
dropShadow: true,
dropShadowColor: '#000000',
dropShadowBlur: 4,
dropShadowAngle: Math.PI / 6,
dropShadowDistance: 6
});
speedometer.anchor.set(0, 1); // Anchor to bottom left
speedometer.visible = false; // Hide speedometer initially
LK.gui.bottomLeft.addChild(speedometer);
var menuContainer = LK.gui.addChild(new Container());
var wallpaper = menuContainer.attachAsset('menuwallpaper', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2 - 300,
y: 2732 / 2 - 400
});
var menuBackground = menuContainer.addChild(new BlurBackground({
width: 2048,
height: 2732,
blur: 25
}));
// Effects removed from menu
LK.playMusic('menuMusic', {
loop: true
});
var difficultyText = new Text2('Difficulty:', {
size: 87.5,
fill: 0xFFFFFF,
align: 'center'
});
difficultyText.anchor.set(0.5, 0.5);
difficultyText.x = 2048 / 2 - 313;
difficultyText.y = 2732 / 2 + 200;
menuContainer.addChild(difficultyText);
// Add difficulty level buttons
var easyButton = new Text2('Easy', {
size: 100,
fill: 0x00ff00,
// Green for Easy
align: 'center'
});
easyButton.anchor.set(0.5, 0.5);
easyButton.x = 200;
easyButton.y = 2732 / 2 + 380;
menuContainer.addChild(easyButton);
var normalButton = new Text2('Normal', {
size: 100,
fill: 0xFFFFFF,
// White for Normal
align: 'center'
});
normalButton.anchor.set(0.5, 0.5);
normalButton.x = 2048 / 2 - 313;
normalButton.y = 2732 / 2 + 380;
menuContainer.addChild(normalButton);
var hardButton = new Text2('Hard', {
size: 100,
fill: 0xff0000,
// Red for Hard
align: 'center'
});
hardButton.anchor.set(0.5, 0.5);
hardButton.x = 2048 / 2 - 126 + 333;
hardButton.y = 2732 / 2 + 380;
menuContainer.addChild(hardButton);
// Highlight current difficulty (Easy by default)
easyButton.alpha = 1.0;
normalButton.alpha = 0.6;
hardButton.alpha = 0.6;
// Add underline graphics for selected difficulty
var startButtonContainer = new Container();
startButtonContainer.x = 2048 / 2 - 321;
startButtonContainer.y = 2732 / 2 + 50 - 500;
var startButtonAsset = startButtonContainer.attachAsset('startbutton', {
anchorX: 0.5,
anchorY: 0.5
});
var startButton = new Text2('Start Game', {
size: 60,
fill: 0xFFFFFF,
align: 'center'
});
startButton.anchor.set(0.5, 0.5);
startButtonContainer.addChild(startButton);
function flashStartButton() {
// No flashing animation for start button
}
// Start the flashing animation
menuContainer.addChild(startButtonContainer);
// Add click handlers for difficulty buttons
easyButton.down = function (x, y, obj) {
currentDifficulty = 'Easy';
difficultyIndex = 0;
easyButton.alpha = 1.0;
normalButton.alpha = 0.6;
hardButton.alpha = 0.6;
};
normalButton.down = function (x, y, obj) {
currentDifficulty = 'Normal';
difficultyIndex = 1;
easyButton.alpha = 0.6;
normalButton.alpha = 1.0;
hardButton.alpha = 0.6;
};
hardButton.down = function (x, y, obj) {
currentDifficulty = 'Hard';
difficultyIndex = 2;
easyButton.alpha = 0.6;
normalButton.alpha = 0.6;
hardButton.alpha = 1.0;
};
startButtonContainer.down = function (x, y, obj) {
isMenuShowing = false;
menuContainer.visible = false;
mainContainer.visible = true;
// Show counters when game starts
scoreText.visible = true;
speedometer.visible = true;
turnText.visible = true;
timerText.visible = true;
// Initialize game start time
gameStartTime = Date.now();
// Properly load and activate the game world
// Initialize car's last position tracking for movement detection
car.lastX = car.x;
car.lastY = car.y;
car.lastWasIntersecting = false;
// Stop menu music and start the game music
LK.stopMusic();
LK.playMusic('Car', {
loop: true
});
// Reset game state
score = 0;
LK.setScore(score);
scoreText.setText(score.toString());
isGameOver = false;
// Ensure all road segments are properly initialized
roadSegments.forEach(function (segment) {
segment.used = false;
});
};
var car = mainContainer.addChild(new Car());
car.x = 2048 / 2;
car.y = 2732 / 2;
// Hide main container when menu is showing
mainContainer.visible = false;
var isGameOver = false;
var score = 0;
var closestSegment = null;
var gameStartTime = 0;
var currentDifficulty = 'Easy'; // Track current difficulty level
var difficultyLevels = ['Easy', 'Normal', 'Hard']; // Available difficulty levels
var difficultyIndex = 0; // Current difficulty index
var timerText = new Text2('00:00:00:000', {
size: 50,
fill: 0xFFFFFF,
weight: '800',
dropShadow: true,
dropShadowColor: '#373330',
dropShadowBlur: 4,
dropShadowAngle: Math.PI / 6,
dropShadowDistance: 6
});
timerText.anchor.set(1, 1); // Anchor to bottom right
timerText.visible = false; // Hide timer initially
LK.gui.bottomRight.addChild(timerText);
game.on('down', function (x, y, obj) {
if (isMenuShowing) {
return;
}
car.changeDirection();
});
LK.on('tick', function () {
if (isMenuShowing) {
return;
}
car._move_migrated();
LK.playMusic('Car', {
loop: true
});
var carIsOnRoad = false;
var carPosition = {
x: car.x,
y: car.y
};
// Update the speedometer with the current speed
speedometer.setText('Speed: ' + Math.round(Math.sqrt(car.momentum.x * car.momentum.x + car.momentum.y * car.momentum.y) * 5) + ' km/h');
// Update timer display
var currentTime = Date.now();
var elapsedTime = currentTime - gameStartTime;
var hours = Math.floor(elapsedTime / 3600000);
var minutes = Math.floor(elapsedTime % 3600000 / 60000);
var seconds = Math.floor(elapsedTime % 60000 / 1000);
var milliseconds = elapsedTime % 1000;
var formattedTime = (hours < 10 ? '0' + hours : hours) + ':' + (minutes < 10 ? '0' + minutes : minutes) + ':' + (seconds < 10 ? '0' + seconds : seconds) + ':' + (milliseconds < 100 ? milliseconds < 10 ? '00' + milliseconds : '0' + milliseconds : milliseconds);
timerText.setText(formattedTime);
var currentClosestSegment = null;
var currentClosestDistance = Infinity;
roadSegments.forEach(function (segment) {
var segmentStart = {
x: segment.x + Math.sin(segment.rotation) * 100,
y: segment.y - Math.cos(segment.rotation) * 100
};
var segmentEnd = {
x: segment.x - Math.sin(segment.rotation) * (segment.height - segment.width / 2),
y: segment.y + Math.cos(segment.rotation) * (segment.height - segment.width / 2)
};
var distance = game.calculateDistanceToPoint(carPosition, segmentStart, segmentEnd);
if (distance < currentClosestDistance) {
currentClosestDistance = distance;
currentClosestSegment = segment;
}
if (distance < segment.width / 2 - 50) {
carIsOnRoad = true;
}
});
if (closestSegment !== currentClosestSegment && !currentClosestSegment.used) {
// Check for intersection between car and road segment
if (car.lastWasIntersecting === false && car.intersects(currentClosestSegment)) {
console.log("Car intersected with a road segment");
}
car.lastWasIntersecting = car.intersects(currentClosestSegment);
closestSegment = currentClosestSegment;
closestSegment.used = true;
score++;
LK.setScore(score);
scoreText.setText(score.toString());
}
if (!carIsOnRoad) {
LK.showGameOver();
} else {}
var particle = new Particle();
particle.alpha = Math.max(0, Math.min(1, Math.abs(car.nonTravelMomentum) / 5 - 0.5));
if (particle.alpha > 0) {
var noiseX = (Math.random() - 0.5) * 10;
var noiseY = (Math.random() - 0.5) * 10;
particle.x = car.x + noiseX;
particle.y = car.y + noiseY;
mainContainer.addChildAt(particle, 1);
particles.push(particle);
}
// Create brown dust particles under the car
if (LK.ticks % 3 === 0) {
var dust = new Dust();
dust.x = car.x + (Math.random() - 0.5) * 30;
dust.y = car.y + 40;
dust.alpha = 0.6 + Math.random() * 0.4;
dust.scaleX = 0.5 + Math.random() * 0.5;
dust.scaleY = 0.5 + Math.random() * 0.5;
// Animate dust with random movement
tween(dust, {
rotation: (Math.random() - 0.5) * Math.PI
}, {
duration: 1000 + Math.random() * 1000,
easing: tween.easeOut
});
mainContainer.addChildAt(dust, 1);
dustParticles.push(dust);
}
// Create additional side dust particles next to the car
if (LK.ticks % 2 === 0) {
// Left side dust - primary
var leftDust = new Dust();
leftDust.x = car.x - 60 + (Math.random() - 0.5) * 40;
leftDust.y = car.y + 20 + Math.random() * 30;
leftDust.alpha = 0.4 + Math.random() * 0.3;
leftDust.scaleX = 0.3 + Math.random() * 0.4;
leftDust.scaleY = 0.3 + Math.random() * 0.4;
leftDust.velocityX = -1 - Math.random() * 2;
// Animate left dust with drift movement
tween(leftDust, {
rotation: (Math.random() - 0.5) * Math.PI * 1.5,
scaleX: leftDust.scaleX + 0.3,
scaleY: leftDust.scaleY + 0.3
}, {
duration: 800 + Math.random() * 800,
easing: tween.easeOut
});
mainContainer.addChildAt(leftDust, 1);
dustParticles.push(leftDust);
// Right side dust - primary
var rightDust = new Dust();
rightDust.x = car.x + 60 + (Math.random() - 0.5) * 40;
rightDust.y = car.y + 20 + Math.random() * 30;
rightDust.alpha = 0.4 + Math.random() * 0.3;
rightDust.scaleX = 0.3 + Math.random() * 0.4;
rightDust.scaleY = 0.3 + Math.random() * 0.4;
rightDust.velocityX = 1 + Math.random() * 2;
// Animate right dust with drift movement
tween(rightDust, {
rotation: (Math.random() - 0.5) * Math.PI * 1.5,
scaleX: rightDust.scaleX + 0.3,
scaleY: rightDust.scaleY + 0.3
}, {
duration: 800 + Math.random() * 800,
easing: tween.easeOut
});
mainContainer.addChildAt(rightDust, 1);
dustParticles.push(rightDust);
}
// Create additional dense dust clouds on both sides
if (LK.ticks % 3 === 0) {
// Left side dense dust
var leftDenseDust = new Dust();
leftDenseDust.x = car.x - 80 + (Math.random() - 0.5) * 60;
leftDenseDust.y = car.y + 10 + Math.random() * 40;
leftDenseDust.alpha = 0.5 + Math.random() * 0.4;
leftDenseDust.scaleX = 0.6 + Math.random() * 0.6;
leftDenseDust.scaleY = 0.6 + Math.random() * 0.6;
leftDenseDust.velocityX = -2 - Math.random() * 3;
leftDenseDust.velocityY = -1 - Math.random() * 2;
// Animate left dense dust with swirl movement
tween(leftDenseDust, {
rotation: Math.PI + Math.random() * Math.PI,
scaleX: leftDenseDust.scaleX + 0.5,
scaleY: leftDenseDust.scaleY + 0.5,
alpha: 0.1
}, {
duration: 1200 + Math.random() * 1000,
easing: tween.easeOut
});
mainContainer.addChildAt(leftDenseDust, 1);
dustParticles.push(leftDenseDust);
// Right side dense dust
var rightDenseDust = new Dust();
rightDenseDust.x = car.x + 80 + (Math.random() - 0.5) * 60;
rightDenseDust.y = car.y + 10 + Math.random() * 40;
rightDenseDust.alpha = 0.5 + Math.random() * 0.4;
rightDenseDust.scaleX = 0.6 + Math.random() * 0.6;
rightDenseDust.scaleY = 0.6 + Math.random() * 0.6;
rightDenseDust.velocityX = 2 + Math.random() * 3;
rightDenseDust.velocityY = -1 - Math.random() * 2;
// Animate right dense dust with swirl movement
tween(rightDenseDust, {
rotation: -Math.PI - Math.random() * Math.PI,
scaleX: rightDenseDust.scaleX + 0.5,
scaleY: rightDenseDust.scaleY + 0.5,
alpha: 0.1
}, {
duration: 1200 + Math.random() * 1000,
easing: tween.easeOut
});
mainContainer.addChildAt(rightDenseDust, 1);
dustParticles.push(rightDenseDust);
}
// Create smaller wispy dust particles on both sides
if (LK.ticks % 5 === 0) {
// Left side wispy dust
var leftWispyDust = new Dust();
leftWispyDust.x = car.x - 40 + (Math.random() - 0.5) * 20;
leftWispyDust.y = car.y + 30 + Math.random() * 20;
leftWispyDust.alpha = 0.3 + Math.random() * 0.2;
leftWispyDust.scaleX = 0.2 + Math.random() * 0.3;
leftWispyDust.scaleY = 0.2 + Math.random() * 0.3;
leftWispyDust.velocityX = -0.5 - Math.random();
leftWispyDust.velocityY = -2 - Math.random() * 2;
// Animate left wispy dust with gentle float
tween(leftWispyDust, {
rotation: (Math.random() - 0.5) * Math.PI,
scaleX: leftWispyDust.scaleX + 0.2,
scaleY: leftWispyDust.scaleY + 0.2
}, {
duration: 600 + Math.random() * 600,
easing: tween.easeOut
});
mainContainer.addChildAt(leftWispyDust, 1);
dustParticles.push(leftWispyDust);
// Right side wispy dust
var rightWispyDust = new Dust();
rightWispyDust.x = car.x + 40 + (Math.random() - 0.5) * 20;
rightWispyDust.y = car.y + 30 + Math.random() * 20;
rightWispyDust.alpha = 0.3 + Math.random() * 0.2;
rightWispyDust.scaleX = 0.2 + Math.random() * 0.3;
rightWispyDust.scaleY = 0.2 + Math.random() * 0.3;
rightWispyDust.velocityX = 0.5 + Math.random();
rightWispyDust.velocityY = -2 - Math.random() * 2;
// Animate right wispy dust with gentle float
tween(rightWispyDust, {
rotation: (Math.random() - 0.5) * Math.PI,
scaleX: rightWispyDust.scaleX + 0.2,
scaleY: rightWispyDust.scaleY + 0.2
}, {
duration: 600 + Math.random() * 600,
easing: tween.easeOut
});
mainContainer.addChildAt(rightWispyDust, 1);
dustParticles.push(rightWispyDust);
}
particles.forEach(function (particle, index) {
particle.tick();
if (particle.lifetime <= 0) {
particles.splice(index, 1);
}
});
dustParticles.forEach(function (dust, index) {
dust.update();
if (dust.alpha <= 0 || dust.lifetime <= 0) {
dustParticles.splice(index, 1);
}
});
var carLocalPosition = game.toLocal(car.position, car.parent);
var offsetX = (2048 / 2 - carLocalPosition.x) / 20;
var offsetY = (2732 - 450 - carLocalPosition.y) / 20;
mainContainer.x += offsetX;
mainContainer.y += offsetY;
for (var i = roadSegments.length - 1; i >= 0; i--) {
var segmentGlobalPosition = game.toLocal(roadSegments[i].position, roadSegments[i].parent);
if (segmentGlobalPosition.y - roadSegments[i].height > 2732 * 2) {
roadSegments[i].shadow.destroy();
roadSegments[i].destroy();
roadSegments.splice(i, 1);
game.addRoadSegment();
}
// Destroy embankments which are off screen
if (roadSegments[i].leftEmbankment && roadSegments[i].leftEmbankment.y < -50) {
roadSegments[i].leftEmbankment.destroy();
}
if (roadSegments[i].rightEmbankment && roadSegments[i].rightEmbankment.y < -50) {
roadSegments[i].rightEmbankment.destroy();
}
}
}); ===================================================================
--- original.js
+++ change.js
Rock at night, drone view
Dirt road at night, topview
Photorealistic dusty rock in desert at night, bird view
photorealistic very dark smoot dirt ground in the night, top view but From a distance
TRANSPARENT RECTANGLE WITH SINGLE LINE ORANGE FRAME, FRONT VIEW
Transparent brawn turning left arrow in a brawn circle, front view
Photorealistic speedometer's orange hourhand, only just the hourhand with black bath. The hourhand shape is a line. front view
Photorealistic Subaru Impreza WRC in nightlight, drone topview from back and 45 degrees angle in top right corner
Photorealistic 1990'S Subaru Impreza WRC Rallycar in nightlight, drone topview from back and 45 degrees angle in top right corner
Photorealistic Lancia Delta Rallycar in nightlight, drone topview from back and 45 degrees angle in top right corner
Photorealistic Mitsubishi Lancer Evolution Rallycar in nightlight, drone topview from back and 45 degrees angle in top right corner
Photorealistic Ford Focus RS WRC 2008 Rallycar in nightlight, drone topview from back and 45 degrees angle in top right corner
Photorealistic Seat Cordoba Rallycar in nightlight, drone topview from back and 45 degrees angle in top right corner
Photorealistic Suzuki Rallycar in nightlight, drone topview from back and 45 degrees angle in top right corner. Replace SUZUKI text to SUZIKA
Photorealistic Lancia Stratos Rallycar in nightlight, drone topview from back and 45 degrees angle in top right corner. Replace Lancia to Lacika and Alitalia to All Italia
Photorealistic RENAULT Rallycar in nightlight, drone topview from back and 45 degrees angle in top right corner.
Photorealistic red MINI COOPER Rallycar with something like British flag livery in nightlight, drone topview from back and 45 degrees angle in top right corner. Replace MINI to IMI and Cooper too Qoper.