User prompt
Add a death mechanic when we touch the barricades
User prompt
Let the barricades be a separate object
User prompt
thin out the playing field a bit
User prompt
make barricades bigger
User prompt
expand the playing field and add occasional roadblocks. remove the division system
User prompt
Add a level system to the game and a new level will appear every 25 points you get
User prompt
Make golden apples and these apples will appear rarely and give you 5 points when they appear
User prompt
Place hearts on the road that double your score
User prompt
delete dialogue
User prompt
delete driver
Remix started
Copy Drifting Love
/**** * Classes ****/ var Barricade = Container.expand(function () { var self = Container.call(this); var blockGraphics = self.attachAsset('particle', { anchorX: 0.5, anchorY: 0.5 }); blockGraphics.width = 300; blockGraphics.height = 300; self.width = blockGraphics.width; self.height = blockGraphics.height; self.hit = false; 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 }); self.ORIGINAL_SPEED = 2; self.speed = self.ORIGINAL_SPEED; self.direction = 0; self.momentum = { x: 0, y: 0 }; self._move_migrated = function () { var momentumModifier = 0.1; self.speed *= 1.01; if (self.direction === 0) { self.momentum.x += self.speed * momentumModifier; } else { self.momentum.y -= self.speed * momentumModifier; } var projectedMovement = self.projectMovement(self.momentum); self.x += projectedMovement.x; self.y += projectedMovement.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; self.speed = self.ORIGINAL_SPEED; carGraphics.scale.x *= -1; LK.getSound('Skid').play(); }; }); var GoldenApple = Container.expand(function () { var self = Container.call(this); var appleGraphics = self.attachAsset('goldenApple', { anchorX: 0.5, anchorY: 0.5 }); self.width = appleGraphics.width; self.height = appleGraphics.height; self.collected = false; return self; }); var Heart = Container.expand(function () { var self = Container.call(this); var heartGraphics = self.attachAsset('heart', { anchorX: 0.5, anchorY: 0.5 }); self.width = heartGraphics.width; self.height = heartGraphics.height; self.collected = false; 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(); } }; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000000 }); /**** * Game Code ****/ 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(250, segmentWidth - 15); segment.height = i === 1 ? 3000 : Math.floor(Math.random() * (4000 - 1200 + 1)) + 1200; 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); }; game.setBackgroundColor(0xc39977); var particles = []; LK.playMusic('backgroundMusic'); var hearts = []; var goldenApples = []; var mainContainer = game.addChild(new Container()); var roadContainer = mainContainer.addChild(new Container()); var roadSegments = []; var roadblocks = []; 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 <= 25; i++) { game.addRoadSegment(); } // Place hearts on 5 random segments (not the first one) var heartSegments = []; while (heartSegments.length < 5) { var idx = Math.floor(Math.random() * (roadSegments.length - 2)) + 1; if (heartSegments.indexOf(idx) === -1) heartSegments.push(idx); } for (var h = 0; h < heartSegments.length; h++) { var seg = roadSegments[heartSegments[h]]; var heart = new Heart(); // Place heart at center of segment heart.x = seg.x; heart.y = seg.y; mainContainer.addChild(heart); hearts.push(heart); } // Place golden apples on 2 random segments (not the first one), rare var goldenAppleSegments = []; while (goldenAppleSegments.length < 2) { var idx = Math.floor(Math.random() * (roadSegments.length - 2)) + 1; if (goldenAppleSegments.indexOf(idx) === -1 && heartSegments.indexOf(idx) === -1) goldenAppleSegments.push(idx); } for (var g = 0; g < goldenAppleSegments.length; g++) { var seg = roadSegments[goldenAppleSegments[g]]; var goldenApple = new GoldenApple(); goldenApple.x = seg.x; goldenApple.y = seg.y; mainContainer.addChild(goldenApple); goldenApples.push(goldenApple); } // Place roadblocks on 4 random segments (not the first one) var roadblockSegments = []; while (roadblockSegments.length < 4) { var idx = Math.floor(Math.random() * (roadSegments.length - 2)) + 1; if (roadblockSegments.indexOf(idx) === -1 && heartSegments.indexOf(idx) === -1 && goldenAppleSegments.indexOf(idx) === -1) roadblockSegments.push(idx); } for (var r = 0; r < roadblockSegments.length; r++) { var seg = roadSegments[roadblockSegments[r]]; var barricade = new Barricade(); barricade.x = seg.x; barricade.y = seg.y; mainContainer.addChild(barricade); roadblocks.push(barricade); } 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, 0); LK.gui.top.addChild(scoreText); // Level system removed var car = mainContainer.addChild(new Car()); car.x = 2048 / 2; car.y = 2732 / 2; var isGameOver = false; var score = 0; var closestSegment = null; game.on('down', function (x, y, obj) { car.changeDirection(); }); LK.on('tick', function () { car._move_migrated(); var carIsOnRoad = false; var carPosition = { x: car.x, y: car.y }; 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) { closestSegment = currentClosestSegment; closestSegment.used = true; score++; car.ORIGINAL_SPEED += 0.1; scoreText.setText(score.toString()); } // Check for heart collection for (var h = 0; h < hearts.length; h++) { var heart = hearts[h]; if (!heart.collected && Math.abs(car.x - heart.x) < 80 && Math.abs(car.y - heart.y) < 80) { heart.collected = true; heart.visible = false; score = score * 2; scoreText.setText(score.toString()); } } // Check for golden apple collection for (var g = 0; g < goldenApples.length; g++) { var goldenApple = goldenApples[g]; if (!goldenApple.collected && Math.abs(car.x - goldenApple.x) < 80 && Math.abs(car.y - goldenApple.y) < 80) { goldenApple.collected = true; goldenApple.visible = false; score += 5; scoreText.setText(score.toString()); } } // Check for roadblock collision var hitRoadblock = false; for (var r = 0; r < roadblocks.length; r++) { var roadblock = roadblocks[r]; // Use .intersects for precise collision detection if (!roadblock.hit && car.intersects(roadblock)) { roadblock.hit = true; hitRoadblock = true; break; } } if (!carIsOnRoad || hitRoadblock) { LK.showGameOver(); } else {} var particleOffsets = [{ x: 20, y: 140 }, { x: 20 + 100, y: 140 - 100 }, { x: 20 - 150, y: 140 - 150 }, { x: 20 - 150 + 100, y: 140 - 150 - 100 }]; for (var i = 0; i < particleOffsets.length; i++) { var alphaValue = Math.max(0, Math.min(1, Math.abs(car.nonTravelMomentum) / 5 - 0.5)); if (alphaValue > 0) { var particle = new Particle(); particle.alpha = alphaValue; var noiseX = (Math.random() - 0.5) * 10; var noiseY = (Math.random() - 0.5) * 10; particle.x = car.x + (car.direction === 0 ? -1 : 1) * particleOffsets[i].x + noiseX; particle.y = car.y + particleOffsets[i].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(); } } });
===================================================================
--- original.js
+++ change.js
@@ -307,9 +307,10 @@
// Check for roadblock collision
var hitRoadblock = false;
for (var r = 0; r < roadblocks.length; r++) {
var roadblock = roadblocks[r];
- if (!roadblock.hit && Math.abs(car.x - roadblock.x) < 100 && Math.abs(car.y - roadblock.y) < 100) {
+ // Use .intersects for precise collision detection
+ if (!roadblock.hit && car.intersects(roadblock)) {
roadblock.hit = true;
hitRoadblock = true;
break;
}