/****
* 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.