User prompt
Easy, normal, hard texts should not appear next to difficulty, but above them below each other in this order: Hard Normal Easy
User prompt
repair it
User prompt
Add pulse feedback animation to difficulty button when pressed ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
The start button must first give a pulse feedback if pressed ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
remove easy, normal, hard texts from the map
User prompt
make difficulty similar button as start game button
User prompt
move down difficulty to fit start menu heightheight
User prompt
change place difficulty and easy texts
User prompt
move start game down to fit easy and normal height
User prompt
swap place start game and hard
User prompt
Difficulty text should be the same size as the Start Game
User prompt
Difficulty, easy, normal, hard texts should be the same size as the Start Game
User prompt
The start button must first give a pulse feedback before the track loads ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Difficulty, easy, normal, hard texts should be the same size as the Start Game
User prompt
The start button must first give a pulsating feedback before the track loads ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
All texts should be the same size as the Start Game
User prompt
add MW3 asset to the slideshow ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Fix car sound bug
User prompt
Ensure slowly gradient Slideshow with mw1 and mw2 ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Add MW2 asset to the game
User prompt
Change menuwallpapper asset name to MW1
User prompt
Stil not ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Bothing happened with startbutton
User prompt
Do it ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Pulse startbutton if it touched ↪💡 Consider importing and using the following plugins: @upit/tween.v1
/**** * 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('MW1', { anchorX: 0.5, anchorY: 0.5, x: 2048 / 2 - 300, y: 2732 / 2 - 400 }); var wallpaper2 = menuContainer.attachAsset('MW2', { anchorX: 0.5, anchorY: 0.5, x: 2048 / 2 - 300, y: 2732 / 2 - 400, alpha: 0 }); var wallpaper3 = menuContainer.attachAsset('MW3', { anchorX: 0.5, anchorY: 0.5, x: 2048 / 2 - 300, y: 2732 / 2 - 400, alpha: 0 }); var menuBackground = menuContainer.addChild(new BlurBackground({ width: 2048, height: 2732, blur: 25 })); // Initialize slideshow variables var currentWallpaper = 0; // 0 for MW1, 1 for MW2, 2 for MW3 var slideshowTimer = 0; var slideshowInterval = 4000; // 4 seconds between transitions var transitionDuration = 2000; // 2 seconds for each transition // Start the slideshow gradient transition function startSlideshowTransition() { if (currentWallpaper === 0) { // Fade from MW1 to MW2 tween(wallpaper, { alpha: 0 }, { duration: transitionDuration, easing: tween.easeInOut }); tween(wallpaper2, { alpha: 1 }, { duration: transitionDuration, easing: tween.easeInOut, onFinish: function onFinish() { currentWallpaper = 1; slideshowTimer = 0; } }); } else if (currentWallpaper === 1) { // Fade from MW2 to MW3 tween(wallpaper2, { alpha: 0 }, { duration: transitionDuration, easing: tween.easeInOut }); tween(wallpaper3, { alpha: 1 }, { duration: transitionDuration, easing: tween.easeInOut, onFinish: function onFinish() { currentWallpaper = 2; slideshowTimer = 0; } }); } else { // Fade from MW3 to MW1 tween(wallpaper3, { alpha: 0 }, { duration: transitionDuration, easing: tween.easeInOut }); tween(wallpaper, { alpha: 1 }, { duration: transitionDuration, easing: tween.easeInOut, onFinish: function onFinish() { currentWallpaper = 0; slideshowTimer = 0; } }); } } // Effects removed from menu LK.playMusic('menuMusic', { loop: true }); var difficultyButtonContainer = new Container(); difficultyButtonContainer.x = 200; difficultyButtonContainer.y = 2732 / 2 + 380; var difficultyButtonAsset = difficultyButtonContainer.attachAsset('startbutton', { anchorX: 0.5, anchorY: 0.5 }); var difficultyText = new Text2('Difficulty:', { size: 60, fill: 0xFFFFFF, align: 'center' }); difficultyText.anchor.set(0.5, 0.5); difficultyButtonContainer.addChild(difficultyText); menuContainer.addChild(difficultyButtonContainer); // Difficulty level buttons removed // Add underline graphics for selected difficulty var startButtonContainer = new Container(); startButtonContainer.x = 2048 / 2 - 126 + 333; startButtonContainer.y = 2732 / 2 + 380; 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); // Click handlers for difficulty buttons removed startButtonContainer.down = function (x, y, obj) { // Add pulse feedback animation before loading track tween(startButtonContainer, { scaleX: 1.2, scaleY: 1.2 }, { duration: 150, easing: tween.easeOut, onFinish: function onFinish() { tween(startButtonContainer, { scaleX: 1.0, scaleY: 1.0 }, { duration: 150, easing: tween.easeOut, onFinish: function onFinish() { // Load track after pulse feedback completes 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) { // Update slideshow timer when menu is showing slideshowTimer += 16.67; // Approximate milliseconds per tick at 60fps if (slideshowTimer >= slideshowInterval) { startSlideshowTransition(); } return; } car._move_migrated(); 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