/**** * Classes ****/ 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 }); 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; }; self.changeDirection = function () { self.direction = self.direction === 0 ? 1 : 0; carGraphics.scale.x *= -1; }; }); var DriftAndDodge = Container.expand(function () { var self = Container.call(this); }); var Obstacle = Container.expand(function () { var self = Container.call(this); var obstacleGraphics = self.attachAsset('rock', { anchorX: 0.5, anchorY: 0.5, scaleX: 0.5, scaleY: 0.5 }); self.active = true; self.update = function () { if (!self.active) { return; } // Initialize lastWasIntersecting if not defined if (self.lastWasIntersecting === undefined) { self.lastWasIntersecting = false; } // Check if car collides with obstacle var isIntersecting = self.intersects(car); if (!self.lastWasIntersecting && isIntersecting) { // Reduce speed on collision car.speed = Math.max(1, car.speed - 2); self.active = false; // Visual feedback LK.effects.flashObject(obstacleGraphics, 0xff0000, 500); } self.lastWasIntersecting = isIntersecting; }; 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(); } }; }); // Add the game logic for 'DriftAndDodge' here var PowerUp = Container.expand(function () { var self = Container.call(this); self.type = Math.random() < 0.5 ? 'speed' : 'score'; // Use different colors based on power-up type var color = self.type === 'speed' ? 0x00ffff : 0xffff00; var powerUpGraphics = self.attachAsset('speedometer', { anchorX: 0.5, anchorY: 0.5, tint: color, scaleX: 1.5, scaleY: 1.5 }); self.active = true; self.rotation = 0; self.update = function () { if (!self.active) { return; } // Make the power-up rotate for visual effect self.rotation += 0.05; powerUpGraphics.rotation = self.rotation; // Initialize lastWasIntersecting if not defined if (self.lastWasIntersecting === undefined) { self.lastWasIntersecting = false; } // Check if car collects the power-up var isIntersecting = self.intersects(car); if (!self.lastWasIntersecting && isIntersecting) { if (self.type === 'speed') { car.speed += 2; LK.effects.flashObject(car, 0x00ffff, 500); } else { score += 5; LK.setScore(score); scoreText.setText(score.toString()); LK.effects.flashObject(scoreText, 0xffff00, 500); } self.active = false; self.alpha = 0; } self.lastWasIntersecting = isIntersecting; }; return self; }); 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 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 }); segment.width = segmentWidth; segmentWidth = Math.max(350, segmentWidth - 15); 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 = 150; // 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 - 200 - i * treeSpacing; // Decrease the distance from the road by 100 units leftTree.y = segment.y + i * treeSpacing; roadContainer.addChild(leftTree); var rightTree = new Tree2(); rightTree.x = segment.x + segment.width + 200 + i * treeSpacing; // Decrease the distance from the road by 100 units 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); // Add random obstacles on the road if (Math.random() < 0.4) { // 40% chance to add obstacle var obstacle = new Obstacle(); // Position the obstacle randomly on the road segment var randomPosition = Math.random(); obstacle.x = segment.x + (Math.random() - 0.5) * segment.width * 0.7; obstacle.y = segment.y + randomPosition * segment.height * 0.8; roadContainer.addChild(obstacle); } // Add power-ups occasionally if (Math.random() < 0.25) { // 25% chance to add power-up var powerUp = new PowerUp(); // Position the power-up randomly on the road segment var randomPosition = Math.random(); powerUp.x = segment.x + (Math.random() - 0.5) * segment.width * 0.5; powerUp.y = segment.y + randomPosition * segment.height * 0.7; roadContainer.addChild(powerUp); } }; var wallpaper = game.attachAsset('wallpaper', { anchorX: 0.5, anchorY: 0.5, x: 2048 / 2, y: 2732 / 2 }); var particles = []; 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 <= 30; i++) { game.addRoadSegment(); } var scoreText = new Text2('0', { size: 150, fill: 0xFFFFFF, weight: '800', dropShadow: true, dropShadowColor: '#373330', dropShadowBlur: 4, dropShadowAngle: Math.PI / 6, dropShadowDistance: 6 }); scoreText.anchor.set(0.5, 0); LK.gui.top.addChild(scoreText); // Add a neon blue-colored speedometer to the bottom left corner of the map var speedometer = new Text2('Speed: 0', { size: 50, fill: 0x00FFFF, // Neon blue color weight: '800', dropShadow: true, dropShadowColor: '#000000', dropShadowBlur: 4, dropShadowAngle: Math.PI / 6, dropShadowDistance: 6 }); speedometer.anchor.set(0, 1); // Anchor to bottom left LK.gui.bottomLeft.addChild(speedometer); var car = mainContainer.addChild(new Car()); car.x = 2048 / 2; car.y = 2732 / 2; var isGameOver = false; var score = 0; var distance = 0; var distanceText = new Text2('Distance: 0m', { size: 50, fill: 0xFFFFFF, weight: '800', dropShadow: true, dropShadowColor: '#373330', dropShadowBlur: 4, dropShadowAngle: Math.PI / 6, dropShadowDistance: 6 }); distanceText.anchor.set(1, 1); // Anchor to bottom right LK.gui.bottomRight.addChild(distanceText); var closestSegment = null; game.on('down', function (x, y, obj) { car.changeDirection(); }); LK.on('tick', function () { car._move_migrated(); LK.playMusic('Car', { loop: true }); // Update all obstacles and power-ups roadContainer.children.forEach(function (child) { if (child instanceof Obstacle && child.active) { child.update(); } if (child instanceof PowerUp && child.active) { child.update(); } }); var carIsOnRoad = false; var carPosition = { x: car.x, y: car.y }; // Update the speedometer with the current speed var currentSpeed = Math.round(Math.sqrt(car.momentum.x * car.momentum.x + car.momentum.y * car.momentum.y) * 5); speedometer.setText('Speed: ' + currentSpeed + ' km/h'); // Update distance traveled distance += currentSpeed * 0.01; distanceText.setText('Distance: ' + Math.floor(distance) + 'm'); 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()); // Increase difficulty as score increases if (score % 10 === 0) { // Make road segments narrower over time for additional challenge segmentWidth = Math.max(300, segmentWidth - 5); // Increase car speed slightly if (car.speed < 10) { car.speed += 0.2; } } } 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); } particles.forEach(function (particle, index) { particle.tick(); if (particle.lifetime <= 0) { particles.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
@@ -67,8 +67,38 @@
});
var DriftAndDodge = Container.expand(function () {
var self = Container.call(this);
});
+var Obstacle = Container.expand(function () {
+ var self = Container.call(this);
+ var obstacleGraphics = self.attachAsset('rock', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ scaleX: 0.5,
+ scaleY: 0.5
+ });
+ self.active = true;
+ self.update = function () {
+ if (!self.active) {
+ return;
+ }
+ // Initialize lastWasIntersecting if not defined
+ if (self.lastWasIntersecting === undefined) {
+ self.lastWasIntersecting = false;
+ }
+ // Check if car collides with obstacle
+ var isIntersecting = self.intersects(car);
+ if (!self.lastWasIntersecting && isIntersecting) {
+ // Reduce speed on collision
+ car.speed = Math.max(1, car.speed - 2);
+ self.active = false;
+ // Visual feedback
+ LK.effects.flashObject(obstacleGraphics, 0xff0000, 500);
+ }
+ self.lastWasIntersecting = isIntersecting;
+ };
+ return self;
+});
var Particle = Container.expand(function () {
var self = Container.call(this);
var particleGraphics = self.attachAsset('particle', {
anchorX: 0.5,
@@ -81,8 +111,53 @@
self.destroy();
}
};
});
+// Add the game logic for 'DriftAndDodge' here
+var PowerUp = Container.expand(function () {
+ var self = Container.call(this);
+ self.type = Math.random() < 0.5 ? 'speed' : 'score';
+ // Use different colors based on power-up type
+ var color = self.type === 'speed' ? 0x00ffff : 0xffff00;
+ var powerUpGraphics = self.attachAsset('speedometer', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ tint: color,
+ scaleX: 1.5,
+ scaleY: 1.5
+ });
+ self.active = true;
+ self.rotation = 0;
+ self.update = function () {
+ if (!self.active) {
+ return;
+ }
+ // Make the power-up rotate for visual effect
+ self.rotation += 0.05;
+ powerUpGraphics.rotation = self.rotation;
+ // Initialize lastWasIntersecting if not defined
+ if (self.lastWasIntersecting === undefined) {
+ self.lastWasIntersecting = false;
+ }
+ // Check if car collects the power-up
+ var isIntersecting = self.intersects(car);
+ if (!self.lastWasIntersecting && isIntersecting) {
+ if (self.type === 'speed') {
+ car.speed += 2;
+ LK.effects.flashObject(car, 0x00ffff, 500);
+ } else {
+ score += 5;
+ LK.setScore(score);
+ scoreText.setText(score.toString());
+ LK.effects.flashObject(scoreText, 0xffff00, 500);
+ }
+ self.active = false;
+ self.alpha = 0;
+ }
+ self.lastWasIntersecting = isIntersecting;
+ };
+ return self;
+});
var Rock = Container.expand(function () {
var self = Container.call(this);
var rockGraphics = self.attachAsset('rock', {
anchorX: 0.5,
@@ -216,8 +291,28 @@
var rightEmbankment = new SnowyEmbankment();
rightEmbankment.x = segment.x + segment.width / 2 + 50; // Increase distance by 50 units
rightEmbankment.y = segment.y;
roadContainer.addChild(rightEmbankment);
+ // Add random obstacles on the road
+ if (Math.random() < 0.4) {
+ // 40% chance to add obstacle
+ var obstacle = new Obstacle();
+ // Position the obstacle randomly on the road segment
+ var randomPosition = Math.random();
+ obstacle.x = segment.x + (Math.random() - 0.5) * segment.width * 0.7;
+ obstacle.y = segment.y + randomPosition * segment.height * 0.8;
+ roadContainer.addChild(obstacle);
+ }
+ // Add power-ups occasionally
+ if (Math.random() < 0.25) {
+ // 25% chance to add power-up
+ var powerUp = new PowerUp();
+ // Position the power-up randomly on the road segment
+ var randomPosition = Math.random();
+ powerUp.x = segment.x + (Math.random() - 0.5) * segment.width * 0.5;
+ powerUp.y = segment.y + randomPosition * segment.height * 0.7;
+ roadContainer.addChild(powerUp);
+ }
};
var wallpaper = game.attachAsset('wallpaper', {
anchorX: 0.5,
anchorY: 0.5,
@@ -232,9 +327,9 @@
var segmentWidth = 1200;
var currentX = 2048 / 2;
var currentY = 2732 / 2;
var zigzag = true;
-for (var i = 1; i <= 15; i++) {
+for (var i = 1; i <= 30; i++) {
game.addRoadSegment();
}
var scoreText = new Text2('0', {
size: 150,
@@ -266,8 +361,21 @@
car.x = 2048 / 2;
car.y = 2732 / 2;
var isGameOver = false;
var score = 0;
+var distance = 0;
+var distanceText = new Text2('Distance: 0m', {
+ size: 50,
+ fill: 0xFFFFFF,
+ weight: '800',
+ dropShadow: true,
+ dropShadowColor: '#373330',
+ dropShadowBlur: 4,
+ dropShadowAngle: Math.PI / 6,
+ dropShadowDistance: 6
+});
+distanceText.anchor.set(1, 1); // Anchor to bottom right
+LK.gui.bottomRight.addChild(distanceText);
var closestSegment = null;
game.on('down', function (x, y, obj) {
car.changeDirection();
});
@@ -275,15 +383,28 @@
car._move_migrated();
LK.playMusic('Car', {
loop: true
});
+ // Update all obstacles and power-ups
+ roadContainer.children.forEach(function (child) {
+ if (child instanceof Obstacle && child.active) {
+ child.update();
+ }
+ if (child instanceof PowerUp && child.active) {
+ child.update();
+ }
+ });
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');
+ var currentSpeed = Math.round(Math.sqrt(car.momentum.x * car.momentum.x + car.momentum.y * car.momentum.y) * 5);
+ speedometer.setText('Speed: ' + currentSpeed + ' km/h');
+ // Update distance traveled
+ distance += currentSpeed * 0.01;
+ distanceText.setText('Distance: ' + Math.floor(distance) + 'm');
var currentClosestSegment = null;
var currentClosestDistance = Infinity;
roadSegments.forEach(function (segment) {
var segmentStart = {
@@ -313,8 +434,17 @@
closestSegment.used = true;
score++;
LK.setScore(score);
scoreText.setText(score.toString());
+ // Increase difficulty as score increases
+ if (score % 10 === 0) {
+ // Make road segments narrower over time for additional challenge
+ segmentWidth = Math.max(300, segmentWidth - 5);
+ // Increase car speed slightly
+ if (car.speed < 10) {
+ car.speed += 0.2;
+ }
+ }
}
if (!carIsOnRoad) {
LK.showGameOver();
} else {}
@@ -354,6 +484,5 @@
if (roadSegments[i].rightEmbankment && roadSegments[i].rightEmbankment.y < -50) {
roadSegments[i].rightEmbankment.destroy();
}
}
-});
-// Add the game logic for 'DriftAndDodge' here
\ No newline at end of file
+});
\ No newline at end of file
Hyperrealistic blue Subaru rally car with yellow liverys, top down view from the rear wing
realistic Snowy ground, top view
Real snowy ground top view. Single Game Texture. In-Game asset. 2d. Blank background. High contrast. No shadows.
snowy wheel track top view
Single Photorealistic snowy Pinewood
Photorealistic Yellow Checkpoint rally roadsignal covered by snow, drone view.