User prompt
Kat ettiğim yolu gösteren sayacı biraz daha sola getir
User prompt
Boost teextinin ismini $ yap
User prompt
Boost textini biraz daha sola getir
User prompt
Please fix the bug: 'Cannot read properties of undefined (reading 'y')' in or related to this line: 'boostCollectedTxt.y = scoreTxt.y + scoreTxt.height + 10;' Line Number: 277
User prompt
Boost yazısı ekranın dışında kaldı hizala
User prompt
Topladigimda saysin
User prompt
Boostlari topladigimda şahsın $ işareti olarak yeşil renk
User prompt
6 kere de bir çalsın yanından geçtiğinde
User prompt
Gökgürültüsü sesi 5 saniyede bir defa çalsın ama sadece yağmurlu havayı sectiysem çalsın
User prompt
Add gokgurltsound
User prompt
Start texti yerine ekledigim start assetsini yükle oraya
User prompt
Basla textine animasyon ekle dans etsin ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Hava durumu seçme ekranında seçme butonunu değişebilir miyiz sarı bir buton var nasıl değişirim
User prompt
Hava durumu seçme ekranında ilk yagmurlu seçeneğini önerisin sonra karlı sonra güneşli sıralaması olsun
User prompt
Karlı havayı çalınca müzik çalsın kardeşi
User prompt
Oyunun içindeyken yağmur sesini looplama sürekli çalıyor çünkü
User prompt
Looplamayi iptal et
User prompt
Seçim ekranı bölümünde de yağmurluyu gösterdiğim de çalsın
User prompt
Yağmursesi çalmaya devam etsin yağmur sesini seçince loopla sürekli
User prompt
Add yagmursesi
User prompt
Kornasesini sürekli calmasin 56 kere yanından geçtikten sonra çalsın
User prompt
Güneşli havayı seçtiğimde seçim ekranında güneşli olsun hava karlı seçtiğimde kar yağsın
User prompt
Hava durumu ekledik seçim ekranında ama animasyonu yok örneğin yağmurlu seçersen yağmur yağsın
User prompt
obstacle_truck arabasının yanından geçerken korna çalsın kornasesi
User prompt
Hava durumu bende güzel fikir. Araba seçim ekranında hava durumu seçme özelliği getir ordan istedigimi seçebiliyor olayım karlı yağmurlu güneşli v.s
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// Boost class
var Boost = Container.expand(function () {
var self = Container.call(this);
var boostAsset = self.attachAsset('boost', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = boostAsset.width;
self.height = boostAsset.height;
self.update = function () {
self.y += roadSpeed;
};
return self;
});
// Car class
var Car = Container.expand(function () {
var self = Container.call(this);
var carAsset = self.attachAsset('car', {
anchorX: 0.5,
anchorY: 0.5
});
// For collision, use the container itself
self.width = carAsset.width;
self.height = carAsset.height;
// Car speed (pixels per tick)
self.speed = 10;
// Lateral speed (for smooth steering)
self.lateralSpeed = 0;
// Max lateral speed
self.maxLateralSpeed = 32;
// Steering target (x position)
self.targetX = self.x;
// Update method
self.update = function () {
// Smoothly move towards targetX
var dx = self.targetX - self.x;
if (Math.abs(dx) > 2) {
self.lateralSpeed = Math.max(-self.maxLateralSpeed, Math.min(self.maxLateralSpeed, dx * 0.25));
self.x += self.lateralSpeed;
} else {
self.lateralSpeed = 0;
self.x = self.targetX;
}
};
return self;
});
// Lane marker class
var Lane = Container.expand(function () {
var self = Container.call(this);
var laneAsset = self.attachAsset('lane', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = laneAsset.width;
self.height = laneAsset.height;
self.update = function () {
self.y += roadSpeed;
};
return self;
});
// Nitro class (collectible for nitro boost)
var Nitro = Container.expand(function () {
var self = Container.call(this);
var nitroAsset = self.attachAsset('Nitro', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = nitroAsset.width;
self.height = nitroAsset.height;
self.update = function () {
self.y += roadSpeed;
};
return self;
});
// Obstacle class (default car)
var Obstacle = Container.expand(function () {
var self = Container.call(this);
var obsAsset = self.attachAsset('obstacle', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = obsAsset.width;
self.height = obsAsset.height;
// Update method: move down by road speed
self.update = function () {
// Track lastY for scoring
if (self.lastY === undefined) self.lastY = self.y;
self.y += roadSpeed;
// No score for passing obstacles; scoring is handled by collecting boosts.
self.lastY = self.y;
};
return self;
});
// Motorcycle obstacle
var ObstacleMotorcycle = Container.expand(function () {
var self = Container.call(this);
var obsAsset = self.attachAsset('obstacle_motorcycle', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = obsAsset.width;
self.height = obsAsset.height;
self.update = function () {
if (self.lastY === undefined) self.lastY = self.y;
self.y += roadSpeed;
self.lastY = self.y;
};
return self;
});
// Sports car obstacle
var ObstacleSportsCar = Container.expand(function () {
var self = Container.call(this);
var obsAsset = self.attachAsset('obstacle_sportscar', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = obsAsset.width;
self.height = obsAsset.height;
self.update = function () {
if (self.lastY === undefined) self.lastY = self.y;
self.y += roadSpeed;
self.lastY = self.y;
};
return self;
});
// Truck obstacle
var ObstacleTruck = Container.expand(function () {
var self = Container.call(this);
var obsAsset = self.attachAsset('obstacle_truck', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = obsAsset.width;
self.height = obsAsset.height;
self.update = function () {
if (self.lastY === undefined) self.lastY = self.y;
self.y += roadSpeed;
self.lastY = self.y;
};
return self;
});
// Van obstacle
var ObstacleVan = Container.expand(function () {
var self = Container.call(this);
var obsAsset = self.attachAsset('obstacle_van', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = obsAsset.width;
self.height = obsAsset.height;
self.update = function () {
if (self.lastY === undefined) self.lastY = self.y;
self.y += roadSpeed;
self.lastY = self.y;
};
return self;
});
// Police Car class
var PolisCar = Container.expand(function () {
var self = Container.call(this);
var polisAsset = self.attachAsset('Polisecar', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = polisAsset.width;
self.height = polisAsset.height;
// Police car speed (moves down the road)
self.update = function () {
if (self.lastY === undefined) self.lastY = self.y;
self.y += roadSpeed;
self.lastY = self.y;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x222222
});
/****
* Game Code
****/
// Play start sound at the very beginning of the game
// Car (player)
// Obstacle
// Speed boost
// Road
// Lane marker
LK.getSound('Arabasssw').play();
LK.stopMusic(); // Stop any background music if playing
LK.playMusic('Aeabasec'); // Play only Aeabasec music on car selection
// Game constants
var GAME_WIDTH = 2048;
var GAME_HEIGHT = 2732;
var ROAD_WIDTH = 900;
var ROAD_X = (GAME_WIDTH - ROAD_WIDTH) / 2;
var ROAD_Y = 0;
var LANE_COUNT = 3;
var LANE_WIDTH = ROAD_WIDTH / LANE_COUNT;
var CAR_START_X = GAME_WIDTH / 2;
var CAR_START_Y = GAME_HEIGHT - 500;
var OBSTACLE_MIN_GAP = 600;
var OBSTACLE_MAX_GAP = 1100;
var BOOST_CHANCE = 0.25; // 25% chance to spawn a boost with an obstacle
// Road speed (pixels per tick)
var roadSpeed = 10;
var roadSpeedBase = 10;
var roadSpeedBoosted = 16;
var boostDuration = 90; // ticks (1.5 seconds)
var boostTicks = 0;
// Score
var score = 0;
// Boost collected counter
var boostCollectedCount = 0;
// Score text
var scoreTxt = new Text2('0', {
size: 120,
fill: "#fff"
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Boost collected text
var boostCollectedTxt = new Text2('$ 0', {
size: 80,
fill: 0x00FF00
});
boostCollectedTxt.anchor.set(0.5, 0);
// Position boostCollectedTxt below the score, always centered and with enough margin
boostCollectedTxt.x = LK.gui.width / 2 - 220;
boostCollectedTxt.y = scoreTxt.y + scoreTxt.height + 10;
LK.gui.top.addChild(boostCollectedTxt);
// Re-align on resize to keep it visible and centered
LK.on('resize', function () {
boostCollectedTxt.x = LK.gui.width / 2 - 220;
boostCollectedTxt.y = scoreTxt.y + scoreTxt.height + 10;
distanceText.x = LK.gui.width / 2 - 220;
});
function updateBoostCollectedTxt() {
boostCollectedTxt.setText('$ ' + boostCollectedCount);
}
// Arrays for game objects
var obstacles = [];
var boosts = [];
var lanes = [];
var nitros = []; // Nitro collectibles
// Track how many times the player passes close to a truck obstacle
var truckPassCount = 0;
// Nitro state
var nitroCount = 0;
var nitroActive = false;
var nitroTicks = 0;
// Weather effect globals
var weatherParticles = [];
var weatherOverlay = undefined;
// --- Thunder sound timer for rainy weather ---
var gokgurultuTimer = null;
function startGokgurultuTimer() {
if (gokgurultuTimer) LK.clearInterval(gokgurultuTimer);
gokgurultuTimer = LK.setInterval(function () {
// Only play if rainy weather is active and car selection overlay is hidden
if (typeof selectedWeather !== "undefined" && selectedWeather === "rainy" && carSelectOverlay && carSelectOverlay.visible === false) {
LK.getSound('Gokgurultu').play();
}
}, 5000);
}
function stopGokgurultuTimer() {
if (gokgurultuTimer) {
LK.clearInterval(gokgurultuTimer);
gokgurultuTimer = null;
}
}
// Road background
var road = LK.getAsset('road', {
anchorX: 0,
anchorY: 0,
x: ROAD_X,
y: ROAD_Y
});
// Score text
var scoreTxt = new Text2('0', {
size: 120,
fill: "#fff"
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Distance traveled (meters)
var distanceTraveled = 0;
// Distance text
var distanceText = new Text2('0 m', {
size: 80,
fill: 0xFFD700
});
distanceText.anchor.set(0.5, 0);
// Place at the very top center, with a small margin from the top
distanceText.x = LK.gui.width / 2 - 220;
distanceText.y = 0; // absolutely at the top
// Add distanceText as the first child so it appears above the score
LK.gui.top.addChild(distanceText);
// Nitro GUI icon and counter (must be after scoreTxt is created)
var nitroIcon = LK.getAsset('Nitro', {
anchorX: 0,
anchorY: 0,
width: 90,
height: 90
});
nitroIcon.x = LK.gui.width / 2 + scoreTxt.width / 2 + 350;
nitroIcon.y = 10;
LK.gui.top.addChild(nitroIcon);
var nitroLabel = new Text2('x' + nitroCount, {
size: 80,
fill: 0x00EAFF
});
nitroLabel.anchor.set(0, 0);
nitroLabel.x = nitroIcon.x + nitroIcon.width + 10;
nitroLabel.y = nitroIcon.y + 10;
LK.gui.top.addChild(nitroLabel);
function updateNitroLabel() {
nitroLabel.setText('x' + nitroCount);
}
// (El freni (brake) button and logic removed)
game.addChild(road);
// Lane markers
function spawnLaneMarkers() {
// Remove old lanes
for (var i = 0; i < lanes.length; i++) {
lanes[i].destroy();
}
lanes = [];
// For each lane (except the leftmost), draw a marker
for (var l = 1; l < LANE_COUNT; l++) {
for (var y = -200; y < GAME_HEIGHT + 200; y += 400) {
var lane = new Lane();
lane.x = ROAD_X + l * LANE_WIDTH;
lane.y = y;
lanes.push(lane);
game.addChild(lane);
}
}
}
spawnLaneMarkers();
// --- Car Selection Screen Implementation ---
// Available car options (asset id, display name)
var carOptions = [{
id: 'car',
name: 'Klasik'
}, {
id: 'obstacle_sportscar',
name: 'Spor'
}, {
id: 'obstacle_truck',
name: 'Motosiklet'
},
// Yeni arabalar eklendi
{
id: 'obstacle_motorcycle',
name: 'Lüks Araba'
}];
// Weather options
var weatherOptions = [{
id: 'rainy',
name: 'Yağmurlu'
}, {
id: 'snowy',
name: 'Karlı'
}, {
id: 'sunny',
name: 'Güneşli'
}];
var selectedWeatherIndex = 0;
// Selected car index (default 0)
var selectedCarIndex = 0;
// Car selection overlay container
var carSelectOverlay = new Container();
carSelectOverlay.zIndex = 10000; // Always on top
game.addChild(carSelectOverlay);
// Animated background for car selection overlay
var overlayBg = LK.getAsset('road', {
anchorX: 0,
anchorY: 0,
width: GAME_WIDTH,
height: GAME_HEIGHT
});
overlayBg.alpha = 0.85;
overlayBg.tint = 0x000000;
carSelectOverlay.addChild(overlayBg);
// Add a second, lighter overlay for animation effect
var overlayAnim = LK.getAsset('road', {
anchorX: 0,
anchorY: 0,
width: GAME_WIDTH,
height: GAME_HEIGHT
});
overlayAnim.alpha = 0.18;
overlayAnim.tint = 0x00EAFF;
carSelectOverlay.addChild(overlayAnim);
// Animate the overlayAnim's alpha and tint for a lively effect
function animateOverlayBg() {
tween(overlayAnim, {
alpha: 0.32
}, {
duration: 1200,
easing: tween.sineInOut,
onFinish: function onFinish() {
tween(overlayAnim, {
alpha: 0.18
}, {
duration: 1200,
easing: tween.sineInOut,
onFinish: animateOverlayBg
});
}
});
// Animate tint between two colors for a subtle color shift
var tints = [0x00EAFF, 0xFFD700, 0x00EAFF];
var idx = 0;
function nextTint() {
idx = (idx + 1) % tints.length;
tween(overlayAnim, {
tint: tints[idx]
}, {
duration: 1800,
easing: tween.linear,
onFinish: nextTint
});
}
nextTint();
}
animateOverlayBg();
// Title
var selectTitle = new Text2('Araba Seç', {
size: 180,
fill: 0xFFD700
});
selectTitle.anchor.set(0.5, 0);
selectTitle.x = GAME_WIDTH / 2;
selectTitle.y = 120;
carSelectOverlay.addChild(selectTitle);
// Car preview asset
var carPreview = LK.getAsset(carOptions[selectedCarIndex].id, {
anchorX: 0.5,
anchorY: 0.5,
width: 420,
height: 270
});
carPreview.x = GAME_WIDTH / 2;
carPreview.y = 700;
carSelectOverlay.addChild(carPreview);
// Car name label
var carNameLabel = new Text2(carOptions[selectedCarIndex].name, {
size: 120,
fill: "#fff"
});
carNameLabel.anchor.set(0.5, 0);
carNameLabel.x = GAME_WIDTH / 2;
carNameLabel.y = carPreview.y + carPreview.height / 2 + 40;
carSelectOverlay.addChild(carNameLabel);
// Weather selection UI
var weatherTitle = new Text2('Hava Durumu', {
size: 100,
fill: 0xFFD700
});
weatherTitle.anchor.set(0.5, 0);
weatherTitle.x = GAME_WIDTH / 2;
weatherTitle.y = carNameLabel.y + 180;
carSelectOverlay.addChild(weatherTitle);
var weatherLabel = new Text2(weatherOptions[selectedWeatherIndex].name, {
size: 100,
fill: "#fff"
});
weatherLabel.anchor.set(0.5, 0);
weatherLabel.x = GAME_WIDTH / 2;
weatherLabel.y = weatherTitle.y + 120;
carSelectOverlay.addChild(weatherLabel);
var leftWeatherArrow = LK.getAsset('lane', {
anchorX: 0.5,
anchorY: 0.5,
width: 60,
height: 120
});
leftWeatherArrow.x = weatherLabel.x - 250;
leftWeatherArrow.y = weatherLabel.y + 60;
leftWeatherArrow.rotation = Math.PI;
leftWeatherArrow.tint = 0xFFD700;
carSelectOverlay.addChild(leftWeatherArrow);
var rightWeatherArrow = LK.getAsset('lane', {
anchorX: 0.5,
anchorY: 0.5,
width: 60,
height: 120
});
rightWeatherArrow.x = weatherLabel.x + 250;
rightWeatherArrow.y = weatherLabel.y + 60;
rightWeatherArrow.tint = 0xFFD700;
carSelectOverlay.addChild(rightWeatherArrow);
leftWeatherArrow.interactive = true;
rightWeatherArrow.interactive = true;
// Helper to clear weather preview particles/overlay from car selection overlay
function clearWeatherPreview() {
if (typeof weatherPreviewOverlay !== "undefined" && weatherPreviewOverlay && weatherPreviewOverlay.parent) {
weatherPreviewOverlay.parent.removeChild(weatherPreviewOverlay);
weatherPreviewOverlay = undefined;
}
if (typeof weatherPreviewParticles !== "undefined" && Array.isArray(weatherPreviewParticles)) {
for (var wp = 0; wp < weatherPreviewParticles.length; wp++) {
if (weatherPreviewParticles[wp].parent) weatherPreviewParticles[wp].parent.removeChild(weatherPreviewParticles[wp]);
}
weatherPreviewParticles = [];
}
}
// Helper to show weather preview on car selection overlay
function showWeatherPreview() {
clearWeatherPreview();
var wx = weatherOptions[selectedWeatherIndex].id;
weatherPreviewParticles = [];
if (wx === "rainy") {
// Blue transparent overlay for rain
weatherPreviewOverlay = LK.getAsset('Background', {
anchorX: 0,
anchorY: 0,
width: GAME_WIDTH,
height: GAME_HEIGHT
});
weatherPreviewOverlay.alpha = 0.18;
weatherPreviewOverlay.tint = 0x00aaff;
carSelectOverlay.addChildAt(weatherPreviewOverlay, 1);
// Animated rain particles
var rainCount = 24;
for (var r = 0; r < rainCount; r++) {
var drop = LK.getAsset('lane', {
anchorX: 0.5,
anchorY: 0,
width: 8,
height: 60
});
drop.alpha = 0.32 + Math.random() * 0.18;
drop.tint = 0x00bfff;
drop.x = ROAD_X + Math.random() * ROAD_WIDTH;
drop.y = Math.random() * GAME_HEIGHT;
drop._rainSpeed = 18 + Math.random() * 10;
drop._rainDrift = (Math.random() - 0.5) * 4;
carSelectOverlay.addChild(drop);
weatherPreviewParticles.push(drop);
}
// Play rain sound (no loop) for preview
if (!carSelectOverlay._rainSoundPlaying) {
LK.getSound('Yagmursesi').play();
carSelectOverlay._rainSoundPlaying = true;
}
// Stop snow music if it was playing in preview
if (carSelectOverlay._snowMusicPlaying) {
LK.getSound('Karlihava').stop();
carSelectOverlay._snowMusicPlaying = false;
}
} else {
// Stop rain sound if it was playing in preview
if (carSelectOverlay._rainSoundPlaying) {
LK.getSound('Yagmursesi').stop();
carSelectOverlay._rainSoundPlaying = false;
}
// Stop snow music if it was playing in preview
if (carSelectOverlay._snowMusicPlaying) {
LK.getSound('Karlihava').stop();
carSelectOverlay._snowMusicPlaying = false;
}
}
if (wx === "snowy") {
// White transparent overlay for snow
weatherPreviewOverlay = LK.getAsset('Background', {
anchorX: 0,
anchorY: 0,
width: GAME_WIDTH,
height: GAME_HEIGHT
});
weatherPreviewOverlay.alpha = 0.22;
weatherPreviewOverlay.tint = 0xffffff;
carSelectOverlay.addChildAt(weatherPreviewOverlay, 1);
// Animated snow particles
var snowCount = 18;
for (var s = 0; s < snowCount; s++) {
var flake = LK.getAsset('Background', {
anchorX: 0.5,
anchorY: 0.5,
width: 18 + Math.random() * 18,
height: 18 + Math.random() * 18
});
flake.alpha = 0.18 + Math.random() * 0.18;
flake.tint = 0xffffff;
flake.x = ROAD_X + Math.random() * ROAD_WIDTH;
flake.y = Math.random() * GAME_HEIGHT;
flake._snowSpeed = 3 + Math.random() * 4;
flake._snowDrift = (Math.random() - 0.5) * 1.5;
flake._snowAngle = Math.random() * Math.PI * 2;
carSelectOverlay.addChild(flake);
weatherPreviewParticles.push(flake);
}
// Play snow music (no loop) for preview
if (!carSelectOverlay._snowMusicPlaying) {
LK.getSound('Karlihava').play();
carSelectOverlay._snowMusicPlaying = true;
}
}
// For sunny, nothing to add (clear)
}
// Animate weather preview particles on car selection overlay
function animateWeatherPreview() {
if (carSelectOverlay.visible && typeof weatherPreviewParticles !== "undefined" && Array.isArray(weatherPreviewParticles) && weatherPreviewParticles.length > 0) {
var wx = weatherOptions[selectedWeatherIndex].id;
for (var wp = 0; wp < weatherPreviewParticles.length; wp++) {
var p = weatherPreviewParticles[wp];
if (wx === "rainy") {
p.y += p._rainSpeed;
p.x += p._rainDrift;
if (p.y > GAME_HEIGHT + 40) {
p.y = -60;
p.x = ROAD_X + Math.random() * ROAD_WIDTH;
}
if (p.x < ROAD_X) p.x = ROAD_X + ROAD_WIDTH - 10;
if (p.x > ROAD_X + ROAD_WIDTH) p.x = ROAD_X + 10;
} else if (wx === "snowy") {
p.y += p._snowSpeed;
p.x += Math.sin(p._snowAngle) * p._snowDrift;
p._snowAngle += 0.02 + Math.random() * 0.01;
if (p.y > GAME_HEIGHT + 30) {
p.y = -20;
p.x = ROAD_X + Math.random() * ROAD_WIDTH;
}
if (p.x < ROAD_X) p.x = ROAD_X + ROAD_WIDTH - 10;
if (p.x > ROAD_X + ROAD_WIDTH) p.x = ROAD_X + 10;
}
}
}
LK.setTimeout(animateWeatherPreview, 33); // ~30fps
}
animateWeatherPreview();
leftWeatherArrow.down = function (x, y, obj) {
selectedWeatherIndex = (selectedWeatherIndex - 1 + weatherOptions.length) % weatherOptions.length;
weatherLabel.setText(weatherOptions[selectedWeatherIndex].name);
showWeatherPreview();
};
rightWeatherArrow.down = function (x, y, obj) {
selectedWeatherIndex = (selectedWeatherIndex + 1) % weatherOptions.length;
weatherLabel.setText(weatherOptions[selectedWeatherIndex].name);
showWeatherPreview();
};
// Show initial weather preview
showWeatherPreview();
// Left/right arrow assets
var leftArrow = LK.getAsset('lane', {
anchorX: 0.5,
anchorY: 0.5,
width: 80,
height: 180
});
leftArrow.x = carPreview.x - 350;
leftArrow.y = carPreview.y;
leftArrow.rotation = Math.PI; // Point left
leftArrow.tint = 0xFFD700;
carSelectOverlay.addChild(leftArrow);
var rightArrow = LK.getAsset('lane', {
anchorX: 0.5,
anchorY: 0.5,
width: 80,
height: 180
});
rightArrow.x = carPreview.x + 350;
rightArrow.y = carPreview.y;
rightArrow.tint = 0xFFD700;
carSelectOverlay.addChild(rightArrow);
// Start button as asset
var startBtn = LK.getAsset('Start', {
anchorX: 0.5,
anchorY: 0.5,
width: 400,
height: 140
});
startBtn.x = GAME_WIDTH / 2;
startBtn.y = weatherLabel.y + 220;
carSelectOverlay.addChild(startBtn);
// Dance animation for startBtn asset
function danceStartBtn() {
// Scale up and rotate right
tween(startBtn, {
scaleX: 1.18,
scaleY: 0.88,
rotation: 0.18
}, {
duration: 180,
easing: tween.sineInOut,
onFinish: function onFinish() {
// Scale down and rotate left
tween(startBtn, {
scaleX: 0.88,
scaleY: 1.18,
rotation: -0.18
}, {
duration: 180,
easing: tween.sineInOut,
onFinish: function onFinish() {
// Return to normal
tween(startBtn, {
scaleX: 1,
scaleY: 1,
rotation: 0
}, {
duration: 180,
easing: tween.sineInOut,
onFinish: danceStartBtn
});
}
});
}
});
}
danceStartBtn();
// Arrow touch logic
leftArrow.interactive = true;
rightArrow.interactive = true;
startBtn.interactive = true;
leftArrow.down = function (x, y, obj) {
selectedCarIndex = (selectedCarIndex - 1 + carOptions.length) % carOptions.length;
carSelectOverlay.removeChild(carPreview);
carPreview = LK.getAsset(carOptions[selectedCarIndex].id, {
anchorX: 0.5,
anchorY: 0.5,
width: 420,
height: 270
});
carPreview.x = GAME_WIDTH / 2;
carPreview.y = 700;
carSelectOverlay.addChildAt(carPreview, 2);
carNameLabel.setText(carOptions[selectedCarIndex].name);
};
rightArrow.down = function (x, y, obj) {
selectedCarIndex = (selectedCarIndex + 1) % carOptions.length;
carSelectOverlay.removeChild(carPreview);
carPreview = LK.getAsset(carOptions[selectedCarIndex].id, {
anchorX: 0.5,
anchorY: 0.5,
width: 420,
height: 270
});
carPreview.x = GAME_WIDTH / 2;
carPreview.y = 700;
carSelectOverlay.addChildAt(carPreview, 2);
carNameLabel.setText(carOptions[selectedCarIndex].name);
};
// Start button logic
var car; // Declare car globally for later use
var selectedWeather = weatherOptions[selectedWeatherIndex].id;
startBtn.down = function (x, y, obj) {
carSelectOverlay.visible = false;
LK.stopMusic();
LK.playMusic('Music');
car = new Car();
car.removeChildAt(0);
var carAsset = car.attachAsset(carOptions[selectedCarIndex].id, {
anchorX: 0.5,
anchorY: 0.5
});
car.width = carAsset.width;
car.height = carAsset.height;
car.x = CAR_START_X;
car.y = CAR_START_Y;
car.targetX = car.x;
game.addChild(car);
// Save selected weather for gameplay
selectedWeather = weatherOptions[selectedWeatherIndex].id;
};
// Show overlay at start, hide game controls until car is picked
carSelectOverlay.visible = true;
// LK.playMusic('Aeabasec'); // Already handled above, no need to call again
// --- End Car Selection Screen ---
// Score text
var scoreTxt = new Text2('0', {
size: 120,
fill: "#fff"
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Lives (hak) system
var lives = 3;
// Image-based lives display
var livesImages = [];
var LIVES_IMAGE_ID = 'car'; // Use car image for lives
var LIVES_IMAGE_SIZE = 90; // px
var LIVES_IMAGE_MARGIN = 20; // px between images
// Positioning: Place lives images to the right of the score counter
var LIVES_IMAGE_TOP_MARGIN = 10; // px from top of GUI
var LIVES_IMAGE_LEFT_MARGIN = 40; // px from left of score counter
function updateLivesImages() {
// Remove old images
for (var i = 0; i < livesImages.length; i++) {
livesImages[i].destroy();
}
livesImages = [];
// Place lives images to the right of the score counter
// Get scoreTxt position in GUI coordinates
var scoreX = scoreTxt.x * LK.gui.width;
var scoreY = scoreTxt.y * LK.gui.height;
// But since anchor is (0.5, 0), scoreTxt.x is centered in GUI width
var baseX = LK.gui.width / 2 + scoreTxt.width / 2 + LIVES_IMAGE_LEFT_MARGIN;
var baseY = LIVES_IMAGE_TOP_MARGIN;
for (var i = 0; i < lives; i++) {
var img = LK.getAsset(LIVES_IMAGE_ID, {
anchorX: 0,
anchorY: 0,
width: LIVES_IMAGE_SIZE,
height: LIVES_IMAGE_SIZE
});
// Position: right of score, stacked horizontally with margin
img.x = baseX + i * (LIVES_IMAGE_SIZE + LIVES_IMAGE_MARGIN);
img.y = baseY;
LK.gui.top.addChild(img);
livesImages.push(img);
}
}
// Helper to update lives text (legacy, keep for compatibility)
function updateLivesText() {
updateLivesImages();
if (typeof livesLabel !== "undefined") {
livesLabel.setText('Can: ' + lives);
}
}
updateLivesImages();
// Add a text label to show remaining lives (can/hak) on the GUI, next to the last life image
var livesLabel = new Text2('Can: ' + lives, {
size: 80,
fill: "#fff"
});
livesLabel.anchor.set(0, 0); // left-top
// Initial position: right of the last life image, will be updated on resize and updateLivesImages
function updateLivesLabelPosition() {
if (livesImages.length > 0) {
var lastImg = livesImages[livesImages.length - 1];
livesLabel.x = lastImg.x + lastImg.width + 20;
livesLabel.y = lastImg.y + 10;
} else {
// Fallback: right of score
livesLabel.x = LK.gui.width / 2 + scoreTxt.width / 2 + LIVES_IMAGE_LEFT_MARGIN;
livesLabel.y = LIVES_IMAGE_TOP_MARGIN + 10;
}
}
LK.gui.top.addChild(livesLabel);
updateLivesLabelPosition();
// Ensure lives images and label are always visible on resize
LK.on('resize', function () {
updateLivesImages();
updateLivesLabelPosition();
});
// Helper: get lane center x
function getLaneCenter(laneIdx) {
return ROAD_X + LANE_WIDTH * (laneIdx + 0.5);
}
// Helper: spawn an obstacle (and maybe a boost)
function spawnObstacle() {
// Random lane
var laneIdx = Math.floor(Math.random() * LANE_COUNT);
// Randomly select one of five obstacle types (NO police car here)
var type = Math.floor(Math.random() * 5);
var obs;
if (type === 0) {
obs = new Obstacle(); // default car
} else if (type === 1) {
obs = new ObstacleTruck();
} else if (type === 2) {
obs = new ObstacleMotorcycle();
} else if (type === 3) {
obs = new ObstacleSportsCar();
} else if (type === 4) {
obs = new ObstacleVan();
}
obs.x = getLaneCenter(laneIdx);
obs.y = -obs.height / 2;
obstacles.push(obs);
game.addChild(obs);
// Maybe spawn a boost in a different lane
if (Math.random() < BOOST_CHANCE) {
var boostLane = laneIdx;
// Try to pick a different lane
if (LANE_COUNT > 1) {
while (boostLane === laneIdx) {
boostLane = Math.floor(Math.random() * LANE_COUNT);
}
}
var boost = new Boost();
boost.x = getLaneCenter(boostLane);
boost.y = obs.y;
boosts.push(boost);
game.addChild(boost);
}
// Maybe spawn a nitro in a random lane (10% chance)
if (Math.random() < 0.10) {
var nitroLane = laneIdx;
if (LANE_COUNT > 1) {
while (nitroLane === laneIdx) {
nitroLane = Math.floor(Math.random() * LANE_COUNT);
}
}
var nitro = new Nitro();
nitro.x = getLaneCenter(nitroLane);
nitro.y = obs.y;
nitros.push(nitro);
game.addChild(nitro);
}
}
// Timer for spawning police car every 10 seconds
var polisCarTimer = LK.setInterval(function () {
// Spawn police car in a random lane
var laneIdx = Math.floor(Math.random() * LANE_COUNT);
var polis = new PolisCar();
polis.x = getLaneCenter(laneIdx);
polis.y = -polis.height / 2;
obstacles.push(polis);
game.addChild(polis);
}, 10000);
// Helper: spawn lane markers as they scroll
function updateLaneMarkers() {
for (var i = lanes.length - 1; i >= 0; i--) {
var lane = lanes[i];
lane.update();
if (lane.y > GAME_HEIGHT + 200) {
// Recycle to top
lane.y -= GAME_HEIGHT + 400;
}
}
}
// Dragging
var dragging = false;
var dragOffsetX = 0;
// Touch/mouse controls
game.down = function (x, y, obj) {
// (El freni (brake) button logic removed)
// Nitro activation: if touch is on nitro icon, activate nitro if available
if (x >= nitroIcon.x && x <= nitroIcon.x + nitroIcon.width && y >= nitroIcon.y && y <= nitroIcon.y + nitroIcon.height) {
if (nitroCount > 0 && !nitroActive) {
nitroCount--;
updateNitroLabel();
nitroActive = true;
nitroTicks = NITRO_DURATION;
roadSpeed = roadSpeedBoosted;
LK.effects.flashObject(car, 0x00eaff, 800);
// Optionally, flash screen blue for effect
LK.effects.flashScreen(0x00eaff, 300);
}
return;
}
// Only allow drag if car is selected and touch is on car or on road
if (car && x > ROAD_X && x < ROAD_X + ROAD_WIDTH && y > 0 && y < GAME_HEIGHT) {
dragging = true;
dragOffsetX = x - car.x;
// Set targetX immediately
car.targetX = Math.max(ROAD_X + car.width / 2, Math.min(ROAD_X + ROAD_WIDTH - car.width / 2, x - dragOffsetX));
}
};
game.up = function (x, y, obj) {
dragging = false;
// (El freni (brake) button logic removed)
};
game.move = function (x, y, obj) {
if (dragging && car) {
// Clamp to road
var tx = Math.max(ROAD_X + car.width / 2, Math.min(ROAD_X + ROAD_WIDTH - car.width / 2, x - dragOffsetX));
car.targetX = tx;
}
};
// Game update
var lastObstacleY = -OBSTACLE_MIN_GAP;
game.update = function () {
// (El freni (brake) effect removed)
if (!nitroActive) {
roadSpeed = roadSpeedBase;
}
// Update car (only if selected)
if (car) car.update();
// Weather effect (visual only, can be expanded for gameplay effects)
if (typeof selectedWeather !== "undefined" && car && carSelectOverlay.visible === false) {
// --- Rain and snow sound/music logic ---
if (selectedWeather === "rainy") {
if (!game._rainSoundPlaying) {
LK.getSound('Yagmursesi').play();
game._rainSoundPlaying = true;
}
// Start thunder timer if not already running and overlay is hidden
if (carSelectOverlay && carSelectOverlay.visible === false && !gokgurultuTimer) {
startGokgurultuTimer();
}
// Stop snow music if it was playing
if (game._snowMusicPlaying) {
LK.getSound('Karlihava').stop();
game._snowMusicPlaying = false;
}
} else if (selectedWeather === "snowy") {
stopGokgurultuTimer();
if (game._gokgurultuPlayed) game._gokgurultuPlayed = false;
// Stop rain sound if it was playing
if (game._rainSoundPlaying) {
LK.getSound('Yagmursesi').stop();
game._rainSoundPlaying = false;
}
// Play snow music if not already playing
if (!game._snowMusicPlaying) {
LK.getSound('Karlihava').play();
game._snowMusicPlaying = true;
}
} else {
stopGokgurultuTimer();
if (game._rainSoundPlaying) {
LK.getSound('Yagmursesi').stop();
game._rainSoundPlaying = false;
}
if (game._snowMusicPlaying) {
LK.getSound('Karlihava').stop();
game._snowMusicPlaying = false;
}
}
// Remove any previous weather overlays and particles
if (typeof weatherOverlay !== "undefined" && weatherOverlay.parent) {
weatherOverlay.parent.removeChild(weatherOverlay);
weatherOverlay = undefined;
}
if (typeof weatherParticles !== "undefined" && Array.isArray(weatherParticles)) {
for (var wp = 0; wp < weatherParticles.length; wp++) {
if (weatherParticles[wp].parent) weatherParticles[wp].parent.removeChild(weatherParticles[wp]);
}
weatherParticles = [];
}
// Add weather overlay and animated particles if needed
if (selectedWeather === "rainy") {
// Blue transparent overlay for rain
weatherOverlay = LK.getAsset('Background', {
anchorX: 0,
anchorY: 0,
width: GAME_WIDTH,
height: GAME_HEIGHT
});
weatherOverlay.alpha = 0.18;
weatherOverlay.tint = 0x00aaff;
game.addChild(weatherOverlay);
if (game.children && game.children.length > 0) {
game.setChildIndex(weatherOverlay, game.children.length - 1);
}
// Animated rain particles
if (typeof weatherParticles === "undefined") weatherParticles = [];
var rainCount = 32;
for (var r = 0; r < rainCount; r++) {
var drop = LK.getAsset('lane', {
anchorX: 0.5,
anchorY: 0,
width: 8,
height: 60
});
drop.alpha = 0.32 + Math.random() * 0.18;
drop.tint = 0x00bfff;
drop.x = ROAD_X + Math.random() * ROAD_WIDTH;
drop.y = Math.random() * GAME_HEIGHT;
drop._rainSpeed = 32 + Math.random() * 18;
drop._rainDrift = (Math.random() - 0.5) * 6;
game.addChild(drop);
weatherParticles.push(drop);
}
} else if (selectedWeather === "snowy") {
// White transparent overlay for snow
weatherOverlay = LK.getAsset('Background', {
anchorX: 0,
anchorY: 0,
width: GAME_WIDTH,
height: GAME_HEIGHT
});
weatherOverlay.alpha = 0.22;
weatherOverlay.tint = 0xffffff;
game.addChild(weatherOverlay);
if (game.children && game.children.length > 0) {
game.setChildIndex(weatherOverlay, game.children.length - 1);
}
// Animated snow particles
if (typeof weatherParticles === "undefined") weatherParticles = [];
var snowCount = 28;
for (var s = 0; s < snowCount; s++) {
var flake = LK.getAsset('Background', {
anchorX: 0.5,
anchorY: 0.5,
width: 18 + Math.random() * 18,
height: 18 + Math.random() * 18
});
flake.alpha = 0.18 + Math.random() * 0.18;
flake.tint = 0xffffff;
flake.x = ROAD_X + Math.random() * ROAD_WIDTH;
flake.y = Math.random() * GAME_HEIGHT;
flake._snowSpeed = 6 + Math.random() * 8;
flake._snowDrift = (Math.random() - 0.5) * 2.5;
flake._snowAngle = Math.random() * Math.PI * 2;
game.addChild(flake);
weatherParticles.push(flake);
}
}
// For sunny, no overlay or particles needed
if (selectedWeather === "sunny") {
if (typeof weatherOverlay !== "undefined" && weatherOverlay.parent) {
weatherOverlay.parent.removeChild(weatherOverlay);
weatherOverlay = undefined;
}
if (typeof weatherParticles !== "undefined" && Array.isArray(weatherParticles)) {
for (var wp = 0; wp < weatherParticles.length; wp++) {
if (weatherParticles[wp].parent) weatherParticles[wp].parent.removeChild(weatherParticles[wp]);
}
weatherParticles = [];
}
}
} else {
// If overlay/particles exist but weather is not active, remove them
if (typeof weatherOverlay !== "undefined" && weatherOverlay.parent) {
weatherOverlay.parent.removeChild(weatherOverlay);
weatherOverlay = undefined;
}
if (typeof weatherParticles !== "undefined" && Array.isArray(weatherParticles)) {
for (var wp = 0; wp < weatherParticles.length; wp++) {
if (weatherParticles[wp].parent) weatherParticles[wp].parent.removeChild(weatherParticles[wp]);
}
weatherParticles = [];
}
}
// Animate weather particles if present
if (typeof weatherParticles !== "undefined" && Array.isArray(weatherParticles) && weatherParticles.length > 0) {
for (var wp = 0; wp < weatherParticles.length; wp++) {
var p = weatherParticles[wp];
if (selectedWeather === "rainy") {
p.y += p._rainSpeed;
p.x += p._rainDrift;
if (p.y > GAME_HEIGHT + 40) {
p.y = -60;
p.x = ROAD_X + Math.random() * ROAD_WIDTH;
}
if (p.x < ROAD_X) p.x = ROAD_X + ROAD_WIDTH - 10;
if (p.x > ROAD_X + ROAD_WIDTH) p.x = ROAD_X + 10;
} else if (selectedWeather === "snowy") {
p.y += p._snowSpeed;
p.x += Math.sin(p._snowAngle) * p._snowDrift;
p._snowAngle += 0.02 + Math.random() * 0.01;
if (p.y > GAME_HEIGHT + 30) {
p.y = -20;
p.x = ROAD_X + Math.random() * ROAD_WIDTH;
}
if (p.x < ROAD_X) p.x = ROAD_X + ROAD_WIDTH - 10;
if (p.x > ROAD_X + ROAD_WIDTH) p.x = ROAD_X + 10;
}
}
}
// Update lane markers
updateLaneMarkers();
// Update distance traveled (add roadSpeed per tick, convert to meters)
distanceTraveled += roadSpeed;
if (distanceText) {
// Show as meters or km
if (distanceTraveled < 1000) {
distanceText.setText(Math.floor(distanceTraveled) + " m");
} else {
distanceText.setText((distanceTraveled / 1000).toFixed(2) + " km");
}
}
// Update obstacles
for (var i = obstacles.length - 1; i >= 0; i--) {
var obs = obstacles[i];
obs.update();
// --- Play police sound when passing close to a police car ---
if (obs instanceof PolisCar && car) {
// Track lastY for police car if not already
if (obs.lastYForSound === undefined) obs.lastYForSound = obs.y;
// Define "passing by" as car's y is within 100px above or below the police car's y (center to center)
var closeRange = 100;
var wasFar = Math.abs(car.y - obs.lastYForSound) > closeRange;
var isClose = Math.abs(car.y - obs.y) <= closeRange;
// Only play sound on the frame we enter the close range
if (wasFar && isClose) {
LK.getSound('Polissound').play();
}
obs.lastYForSound = obs.y;
}
// --- Play horn sound when passing close to a truck obstacle ---
if (obs instanceof ObstacleTruck && car) {
if (obs.lastYForHorn === undefined) obs.lastYForHorn = obs.y;
var hornRange = 120;
var wasFarHorn = Math.abs(car.y - obs.lastYForHorn) > hornRange;
var isCloseHorn = Math.abs(car.y - obs.y) <= hornRange;
if (wasFarHorn && isCloseHorn) {
truckPassCount++;
if (truckPassCount >= 6) {
LK.getSound('Kornasesi').play();
truckPassCount = 0;
}
}
obs.lastYForHorn = obs.y;
}
// Remove if off screen
if (obs.y - obs.height / 2 > GAME_HEIGHT + 100) {
obs.destroy();
obstacles.splice(i, 1);
continue;
}
// Collision with car
if (car && car.intersects(obs)) {
// Play damage sound
LK.getSound('Damage').play();
// Flash screen red
LK.effects.flashScreen(0xff0000, 800);
// Remove the obstacle so it doesn't trigger again
obs.destroy();
obstacles.splice(i, 1);
// Decrement lives
lives--;
updateLivesText();
if (lives <= 0) {
LK.showGameOver();
return;
}
// If not game over, briefly flash car and continue
LK.effects.flashObject(car, 0xff0000, 600);
continue;
}
}
// Update boosts
for (var i = boosts.length - 1; i >= 0; i--) {
var boost = boosts[i];
boost.update();
// Remove if off screen
if (boost.y - boost.height / 2 > GAME_HEIGHT + 100) {
boost.destroy();
boosts.splice(i, 1);
continue;
}
// Collect boost
if (car && car.intersects(boost)) {
boost.destroy();
boosts.splice(i, 1);
// Add score for collecting boost
score += 100;
scoreTxt.setText(score);
// Increment boost collected counter and update GUI
boostCollectedCount++;
updateBoostCollectedTxt();
// Play coin sound
LK.getSound('Coinsound').play();
// Flash car yellow
LK.effects.flashObject(car, 0xffeb3b, 400);
// Show green $ sign effect on car
var dollarText = new Text2('$', {
size: 180,
fill: 0x00ff00
});
dollarText.anchor.set(0.5, 0.5);
dollarText.x = car.x;
dollarText.y = car.y - car.height / 2 - 40;
game.addChild(dollarText);
tween(dollarText, {
y: dollarText.y - 120,
alpha: 0
}, {
duration: 700,
easing: tween.sineInOut,
onFinish: function onFinish() {
if (dollarText.parent) dollarText.parent.removeChild(dollarText);
}
});
}
}
// Update nitros
for (var i = nitros.length - 1; i >= 0; i--) {
var nitro = nitros[i];
nitro.update();
// Remove if off screen
if (nitro.y - nitro.height / 2 > GAME_HEIGHT + 100) {
nitro.destroy();
nitros.splice(i, 1);
continue;
}
// Collect nitro
if (car && car.intersects(nitro)) {
nitro.destroy();
nitros.splice(i, 1);
nitroCount++;
updateNitroLabel();
// Play nitro sound
LK.getSound('Nitrosound').play();
// Flash car cyan
LK.effects.flashObject(car, 0x00eaff, 400);
// Activate nitro immediately for 4 seconds (240 ticks at 60fps)
nitroActive = true;
nitroTicks = 240;
roadSpeed = roadSpeedBoosted;
}
}
// Handle boost timer
if (boostTicks > 0) {
boostTicks--;
if (boostTicks === 0) {
roadSpeed = roadSpeedBase;
}
}
// Handle nitro timer
if (nitroActive) {
nitroTicks--;
if (nitroTicks <= 0) {
nitroActive = false;
roadSpeed = roadSpeedBase;
}
}
// Spawn new obstacles
if (obstacles.length === 0 || obstacles[obstacles.length - 1].y > OBSTACLE_MIN_GAP + Math.random() * (OBSTACLE_MAX_GAP - OBSTACLE_MIN_GAP)) {
spawnObstacle();
}
// Score is only updated by collecting boosts.
// Check if car is off the road
if (car && (car.x - car.width / 2 < ROAD_X || car.x + car.width / 2 > ROAD_X + ROAD_WIDTH)) {
// Play damage sound before game over
LK.getSound('Damage').play();
LK.effects.flashScreen(0xff0000, 800);
// Decrement lives
lives--;
updateLivesText();
if (lives <= 0) {
// Delay game over slightly to ensure sound plays
LK.setTimeout(function () {
LK.showGameOver();
}, 100);
return;
}
// If not game over, flash car and move car back to road center
LK.effects.flashObject(car, 0xff0000, 600);
car.x = CAR_START_X;
car.targetX = car.x;
// Don't return, let the game continue
}
};
// Reset game state on new game
LK.on('gameStart', function () {
// Stop thunder timer on game start
stopGokgurultuTimer();
// Clear and restart police car timer to avoid multiple timers
if (typeof polisCarTimer !== "undefined") {
LK.clearInterval(polisCarTimer);
}
polisCarTimer = LK.setInterval(function () {
var laneIdx = Math.floor(Math.random() * LANE_COUNT);
var polis = new PolisCar();
polis.x = getLaneCenter(laneIdx);
polis.y = -polis.height / 2;
obstacles.push(polis);
game.addChild(polis);
}, 10000);
// Play start sound
LK.getSound('Arabasssw').play();
LK.playMusic('Music');
game._gokgurultuPlayed = false;
// Remove all obstacles and boosts
for (var i = 0; i < obstacles.length; i++) obstacles[i].destroy();
for (var i = 0; i < boosts.length; i++) boosts[i].destroy();
obstacles = [];
boosts = [];
// Show car selection overlay again
if (carSelectOverlay) {
carSelectOverlay.visible = true;
}
// Reset weather selection to default (sunny)
selectedWeatherIndex = 0;
if (typeof weatherLabel !== "undefined") {
weatherLabel.setText(weatherOptions[selectedWeatherIndex].name);
}
selectedWeather = weatherOptions[selectedWeatherIndex].id;
// Remove weather overlay if exists
if (typeof weatherOverlay !== "undefined" && weatherOverlay.parent) {
weatherOverlay.parent.removeChild(weatherOverlay);
weatherOverlay = undefined;
}
// Remove weather particles if exist
if (typeof weatherParticles !== "undefined" && Array.isArray(weatherParticles)) {
for (var wp = 0; wp < weatherParticles.length; wp++) {
if (weatherParticles[wp].parent) weatherParticles[wp].parent.removeChild(weatherParticles[wp]);
}
weatherParticles = [];
}
// Remove car from game if exists
if (car && car.parent) {
car.parent.removeChild(car);
}
car = undefined;
// Reset score and speed
score = 0;
scoreTxt.setText(score);
roadSpeed = roadSpeedBase;
boostTicks = 0;
// Reset boost collected counter and GUI
boostCollectedCount = 0;
if (typeof updateBoostCollectedTxt === "function") updateBoostCollectedTxt();
// Reset truck pass count for horn
truckPassCount = 0;
// Stop rain sound if playing
if (game._rainSoundPlaying) {
LK.getSound('Yagmursesi').stop();
game._rainSoundPlaying = false;
}
// Stop snow music if playing
if (game._snowMusicPlaying) {
LK.getSound('Karlihava').stop();
game._snowMusicPlaying = false;
}
// Reset distance traveled
distanceTraveled = 0;
if (distanceText) {
distanceText.setText("0 m");
}
// Reset lane markers
spawnLaneMarkers();
// Reset lives
lives = 3;
updateLivesText();
if (typeof livesLabel !== "undefined") {
livesLabel.setText('Can: ' + lives);
}
// Reset nitro state
nitroCount = 0;
nitroActive = false;
nitroTicks = 0;
updateNitroLabel();
}); ===================================================================
--- original.js
+++ change.js
@@ -243,8 +243,9 @@
// Re-align on resize to keep it visible and centered
LK.on('resize', function () {
boostCollectedTxt.x = LK.gui.width / 2 - 220;
boostCollectedTxt.y = scoreTxt.y + scoreTxt.height + 10;
+ distanceText.x = LK.gui.width / 2 - 220;
});
function updateBoostCollectedTxt() {
boostCollectedTxt.setText('$ ' + boostCollectedCount);
}
@@ -301,9 +302,9 @@
fill: 0xFFD700
});
distanceText.anchor.set(0.5, 0);
// Place at the very top center, with a small margin from the top
-distanceText.x = LK.gui.width / 2;
+distanceText.x = LK.gui.width / 2 - 220;
distanceText.y = 0; // absolutely at the top
// Add distanceText as the first child so it appears above the score
LK.gui.top.addChild(distanceText);
// Nitro GUI icon and counter (must be after scoreTxt is created)