/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * 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.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 Driver = Container.expand(function () { var self = Container.call(this); self.x = +1500; self.y = +1500; var driverGraphics = self.attachAsset('driver', { anchorX: 0.5, anchorY: 0.5 }); }); 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.tint = roadColors[currentRoadColorIndex]; segment.width = segmentWidth; segmentWidth = Math.max(350, 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 = []; var roadColors = [0xae6066, 0x66ae8f, 0x8f66ae, 0xae8f66, 0x66aeae, 0xae6666]; var currentRoadColorIndex = 0; var lastScoreForColorChange = 0; LK.playMusic('backgroundMusic'); 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 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); var notificationTexts = ['Yanla yanla, yola hükmet!', 'Şahinim, gazla kralım!', 'Viraj bizde, rakip tozda!', 'Yolda dost, kaputta taş!', 'Benzin sende, keyfim bende!', 'Şahin aşkı, durmaz asla!', 'Gaz pedalına, hayat sana!', 'Tofaş ruhu, sokak gururu!', 'Yanla bitmez bu sevda!', 'Şahine bin, dünyaya kin!']; var usedNotificationTexts = []; function getRandomNotificationText() { if (notificationTexts.length === 0) { notificationTexts = usedNotificationTexts.splice(0, usedNotificationTexts.length); } var index = Math.floor(Math.random() * notificationTexts.length); var text = notificationTexts.splice(index, 1)[0]; usedNotificationTexts.push(text); return text; } var notificationText = new Text2(getRandomNotificationText(), { size: 60, fill: 0xFFFFFF, weight: '400', align: 'center', stroke: '#000000', strokeThickness: 8 }); notificationText.anchor.set(0, 4); notificationText.x -= 350; LK.gui.bottom.addChild(notificationText); var car = mainContainer.addChild(new Car()); car.x = 2048 / 2; car.y = 2732 / 2; var driver = LK.gui.addChild(new Driver()); driver.x = 250; driver.y = 1800; 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()); notificationText.setText(getRandomNotificationText()); // Change road color every 5 points if (score - lastScoreForColorChange >= 5) { lastScoreForColorChange = score; currentRoadColorIndex = (currentRoadColorIndex + 1) % roadColors.length; var newColor = roadColors[currentRoadColorIndex]; // Animate all existing road segments to new color roadSegments.forEach(function (segment) { tween(segment, { tint: newColor }, { duration: 1000, easing: tween.easeInOut }); }); } } if (!carIsOnRoad) { 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(); } } });
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* 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.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 Driver = Container.expand(function () {
var self = Container.call(this);
self.x = +1500;
self.y = +1500;
var driverGraphics = self.attachAsset('driver', {
anchorX: 0.5,
anchorY: 0.5
});
});
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.tint = roadColors[currentRoadColorIndex];
segment.width = segmentWidth;
segmentWidth = Math.max(350, 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 = [];
var roadColors = [0xae6066, 0x66ae8f, 0x8f66ae, 0xae8f66, 0x66aeae, 0xae6666];
var currentRoadColorIndex = 0;
var lastScoreForColorChange = 0;
LK.playMusic('backgroundMusic');
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 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);
var notificationTexts = ['Yanla yanla, yola hükmet!', 'Şahinim, gazla kralım!', 'Viraj bizde, rakip tozda!', 'Yolda dost, kaputta taş!', 'Benzin sende, keyfim bende!', 'Şahin aşkı, durmaz asla!', 'Gaz pedalına, hayat sana!', 'Tofaş ruhu, sokak gururu!', 'Yanla bitmez bu sevda!', 'Şahine bin, dünyaya kin!'];
var usedNotificationTexts = [];
function getRandomNotificationText() {
if (notificationTexts.length === 0) {
notificationTexts = usedNotificationTexts.splice(0, usedNotificationTexts.length);
}
var index = Math.floor(Math.random() * notificationTexts.length);
var text = notificationTexts.splice(index, 1)[0];
usedNotificationTexts.push(text);
return text;
}
var notificationText = new Text2(getRandomNotificationText(), {
size: 60,
fill: 0xFFFFFF,
weight: '400',
align: 'center',
stroke: '#000000',
strokeThickness: 8
});
notificationText.anchor.set(0, 4);
notificationText.x -= 350;
LK.gui.bottom.addChild(notificationText);
var car = mainContainer.addChild(new Car());
car.x = 2048 / 2;
car.y = 2732 / 2;
var driver = LK.gui.addChild(new Driver());
driver.x = 250;
driver.y = 1800;
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());
notificationText.setText(getRandomNotificationText());
// Change road color every 5 points
if (score - lastScoreForColorChange >= 5) {
lastScoreForColorChange = score;
currentRoadColorIndex = (currentRoadColorIndex + 1) % roadColors.length;
var newColor = roadColors[currentRoadColorIndex];
// Animate all existing road segments to new color
roadSegments.forEach(function (segment) {
tween(segment, {
tint: newColor
}, {
duration: 1000,
easing: tween.easeInOut
});
});
}
}
if (!carIsOnRoad) {
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();
}
}
});