/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// Arkadan kovalayan düşman araba
var ChaserCar = Container.expand(function () {
var self = Container.call(this);
var car = self.attachAsset('chaserCar', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = car.width;
self.height = car.height;
self.speed = 12; // Başlangıç hızı
self.targetY = 0; // Hedef y (player'ın arkasında başlar)
self.update = function () {
// Oyuncuya yaklaş
if (self.y < self.targetY) {
self.y += self.speed;
if (self.y > self.targetY) self.y = self.targetY;
}
};
return self;
});
// Düz ve ters giden engel arabalar
var EnemyCar = Container.expand(function () {
var self = Container.call(this);
// Farklı tipte araba şekilleri ve renkleri
var carTypes = [{
asset: 'enemyCar',
shape: 'box'
}, {
asset: 'enemyCarRed',
shape: 'box'
}, {
asset: 'enemyCarBlue',
shape: 'box'
}, {
asset: 'enemyCarYellow',
shape: 'box'
}, {
asset: 'enemyCarGreen',
shape: 'ellipse'
}, {
asset: 'enemyCarPurple',
shape: 'box'
}, {
asset: 'enemyCar',
shape: 'ellipse'
}, {
asset: 'enemyCarRed',
shape: 'ellipse'
}, {
asset: 'enemyCarBlue',
shape: 'ellipse'
}, {
asset: 'enemyCarYellow',
shape: 'ellipse'
}, {
asset: 'enemyCarGreen',
shape: 'box'
}, {
asset: 'enemyCarPurple',
shape: 'ellipse'
}, {
asset: 'enemyCar',
shape: 'box'
}, {
asset: 'enemyCarRed',
shape: 'box'
}, {
asset: 'enemyCarBlue',
shape: 'box'
}, {
asset: 'enemyCarYellow',
shape: 'box'
},
// 10 yeni çeşit
{
asset: 'enemyCarOrange',
shape: 'box'
}, {
asset: 'enemyCarPink',
shape: 'ellipse'
}, {
asset: 'enemyCarCyan',
shape: 'box'
}, {
asset: 'enemyCarBlack',
shape: 'ellipse'
}, {
asset: 'enemyCarWhite',
shape: 'box'
}, {
asset: 'enemyCarBrown',
shape: 'ellipse'
}, {
asset: 'enemyCarSilver',
shape: 'box'
}, {
asset: 'enemyCarGold',
shape: 'ellipse'
}, {
asset: 'enemyCarNavy',
shape: 'box'
}, {
asset: 'enemyCarLime',
shape: 'ellipse'
},
// 3 yeni çeşit (arttırıldı)
{
asset: 'enemyCarBlack',
shape: 'box'
}, {
asset: 'enemyCarCyan',
shape: 'ellipse'
}, {
asset: 'enemyCarBrown',
shape: 'box'
}];
// If selectedEnemyCarAssets is set, filter carTypes
if (typeof selectedEnemyCarAssets !== 'undefined' && selectedEnemyCarAssets && selectedEnemyCarAssets.length > 0) {
var filtered = [];
for (var i = 0; i < carTypes.length; i++) {
if (selectedEnemyCarAssets.indexOf(carTypes[i].asset) !== -1) {
filtered.push(carTypes[i]);
}
}
if (filtered.length > 0) carTypes = filtered;
}
// Rastgele bir tip seç
var typeIdx = Math.floor(Math.random() * carTypes.length);
var carType = carTypes[typeIdx];
var car = self.attachAsset(carType.asset, {
anchorX: 0.5,
anchorY: 0.5
});
self.width = car.width;
self.height = car.height;
self.speed = 18; // Varsayılan hız (aşağı)
self.direction = 1; // 1: aşağı, -1: yukarı (ters)
self.update = function () {
self.y += self.speed * self.direction;
};
return self;
});
// Benzin bidonu (yolda çıkan, toplanınca yakıt artırır)
var FuelCan = Container.expand(function () {
var self = Container.call(this);
// Benzin bidonu için görsel asset kullan
var can = self.attachAsset('fuelCan', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = can.width;
self.height = can.height;
self.speed = 24;
self.lane = 1;
self.update = function () {
self.y += self.speed;
};
return self;
});
// Nitro power-up
var Nitro = Container.expand(function () {
var self = Container.call(this);
var nitro = self.attachAsset('nitro', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = nitro.width;
self.height = nitro.height;
self.speed = 24;
self.lane = 1;
self.update = function () {
self.y += self.speed;
};
return self;
});
// Oyuncu arabası
var PlayerCar = Container.expand(function () {
var self = Container.call(this);
// Use selectedPlayerCarAsset if set, fallback to 'playerCar'
var asset = typeof selectedPlayerCarAsset !== 'undefined' && selectedPlayerCarAsset ? selectedPlayerCarAsset : 'playerCar';
var car = self.attachAsset(asset, {
anchorX: 0.5,
anchorY: 0.5
});
self.width = car.width;
self.height = car.height;
return self;
});
// Yol çizgisi (hareketli)
var RoadLine = Container.expand(function () {
var self = Container.call(this);
var line = self.attachAsset('roadLine', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = line.width;
self.height = line.height;
self.speed = 24;
self.update = function () {
self.y += self.speed;
};
return self;
});
// Yan ağaçlar (sol ve sağ)
var TreeLeft = Container.expand(function () {
var self = Container.call(this);
var tree = self.attachAsset('treeLeft', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = tree.width;
self.height = tree.height;
self.speed = 24;
self.update = function () {
self.y += self.speed;
};
return self;
});
var TreeRight = Container.expand(function () {
var self = Container.call(this);
var tree = self.attachAsset('treeRight', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = tree.width;
self.height = tree.height;
self.speed = 24;
self.update = function () {
self.y += self.speed;
};
return self;
});
// Tree bottom zone (left)
var TreeZoneLeft = Container.expand(function () {
var self = Container.call(this);
var zone = self.attachAsset('treeZoneLeft', {
anchorX: 0.5,
anchorY: 0.0
});
self.width = zone.width;
self.height = zone.height;
self.speed = 24;
self.update = function () {
self.y += self.speed;
};
return self;
});
// Tree bottom zone (right)
var TreeZoneRight = Container.expand(function () {
var self = Container.call(this);
var zone = self.attachAsset('treeZoneRight', {
anchorX: 0.5,
anchorY: 0.0
});
self.width = zone.width;
self.height = zone.height;
self.speed = 24;
self.update = function () {
self.y += self.speed;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x222222
});
/****
* Game Code
****/
// Nitro asset
// Chasing enemy car asset (arkadan kovalayan düşman)
// Köprü ve arka plan için özelleştirilebilir assetler
// 10 yeni çeşit için ek varlıklar
// Oyun alanı boyutları
// Köprü ve arka planı ekle
// Tree bottom zone assets (customize these IDs as needed)
// Fuel bar yan sembolü
var backgroundImg = LK.getAsset('background', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 2732 / 2
});
game.addChild(backgroundImg);
var bridgeImg = LK.getAsset('bridge', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 2732 / 2
});
game.addChild(bridgeImg);
// Oyuncu arabası (kırmızı kutu)
// Engeller (gri kutu)
// Yol çizgisi (beyaz ince kutu)
// Yan ağaçlar için basit şekil (dilerseniz image ile de değiştirebilirsiniz)
// Play button asset (customizable)
var GAME_WIDTH = 2048;
var GAME_HEIGHT = 2732;
// Yolun genişliği ve şeritler
var ROAD_WIDTH = 1200;
var ROAD_LEFT = (GAME_WIDTH - ROAD_WIDTH) / 2;
var ROAD_RIGHT = ROAD_LEFT + ROAD_WIDTH;
// Şerit sayısı ve pozisyonları
var LANE_COUNT = 4;
var LANE_WIDTH = ROAD_WIDTH / LANE_COUNT;
var LANE_X = [ROAD_LEFT + LANE_WIDTH * 0.5, ROAD_LEFT + LANE_WIDTH * 1.5, ROAD_LEFT + LANE_WIDTH * 2.5, ROAD_LEFT + LANE_WIDTH * 3.5];
// Yol çizgileri
var roadLines = [];
// Yan ağaçlar
var leftTrees = [];
var rightTrees = [];
// Tree bottom zones
var leftTreeZones = [];
var rightTreeZones = [];
function spawnRoadLines() {
// Her şeridin ortasına, aralıklı çizgiler
for (var lane = 0; lane < LANE_COUNT; lane++) {
for (var i = 0; i < 8; i++) {
var line = new RoadLine();
line.x = ROAD_LEFT + LANE_WIDTH * (lane + 0.5);
line.y = i * 400;
roadLines.push(line);
game.addChild(line);
}
}
// Sol ve sağ kenara ağaçlar ve altındaki bölgeler
for (var i = 0; i < 8; i++) {
var leftTree = new TreeLeft();
leftTree.x = ROAD_LEFT - 120; // Sol kenarın biraz dışında
leftTree.y = i * 400;
leftTrees.push(leftTree);
game.addChild(leftTree);
var rightTree = new TreeRight();
rightTree.x = ROAD_RIGHT + 120; // Sağ kenarın biraz dışında
rightTree.y = i * 400;
rightTrees.push(rightTree);
game.addChild(rightTree);
// Tree bottom zones
var leftZone = new TreeZoneLeft();
leftZone.x = ROAD_LEFT - 120;
leftZone.y = leftTree.y + leftTree.height / 2; // Ağacın altına hizala
leftTreeZones.push(leftZone);
game.addChild(leftZone);
var rightZone = new TreeZoneRight();
rightZone.x = ROAD_RIGHT + 120;
rightZone.y = rightTree.y + rightTree.height / 2;
rightTreeZones.push(rightZone);
game.addChild(rightZone);
}
}
spawnRoadLines();
// Oyuncu arabası
var player = new PlayerCar();
player.lane = 1; // Ortadaki şerit
player.x = LANE_X[player.lane];
player.y = GAME_HEIGHT - 500;
game.addChild(player);
// Arkadan kovalayan düşman araba
var chaserCar = new ChaserCar();
chaserCar.x = player.x;
chaserCar.y = GAME_HEIGHT + 400; // Ekranın dışında başlat
chaserCar.targetY = player.y + 600; // Oyuncunun arkasında başlat
game.addChild(chaserCar);
// Nitro power-up'lar
var nitros = [];
var nitroSpawnTick = 0;
var NITRO_SPAWN_INTERVAL = 180; // 3 saniyede bir
var nitroActive = false;
var nitroTimer = 0;
var NITRO_DURATION = 120; // 2 saniye
var playerSpeedBoost = 0;
// --- FuelCan (yolda benzin) değişkenleri ---
var fuelCans = [];
var fuelCanSpawnTick = 0;
var FUELCAN_SPAWN_INTERVAL = 300; // Her 5 saniyede bir (60fps)
var FUELCAN_AMOUNT = 250; // Toplayınca eklenecek yakıt miktarı
// Engeller
var enemyCars = [];
var ENEMY_SPAWN_INTERVAL_BASE = 60; // Başlangıçta 60 tickte bir (1 sn)
var ENEMY_SPAWN_INTERVAL_MIN = 18; // Minimum 0.3 sn (18 tick)
var enemySpawnTick = 0;
function getEnemySpawnInterval() {
// Mesafe arttıkça interval azalır, minimuma kadar iner
// 0-2000 arası 60, 2000'den sonra 30'a kadar iner, 6000'den sonra tekrar 60'a döner (normalleşir)
if (distance < 2000) return ENEMY_SPAWN_INTERVAL_BASE;
if (distance < 6000) return Math.max(ENEMY_SPAWN_INTERVAL_BASE - Math.floor((distance - 2000) / 133), 30);
// 6000 ve sonrası: tekrar normal (60 tick) aralığına döner
return ENEMY_SPAWN_INTERVAL_BASE;
}
// Skor
var distance = 0;
var scoreTxt = new Text2('0', {
size: 120,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// --- Fuel Bar Variables and UI ---
var FUEL_MAX = 1000;
var fuel = FUEL_MAX;
// Benzin daha yavaş azalsın
var FUEL_DECREASE_PER_TICK = 0.3; // daha yavaş azalsın
var fuelBarWidth = 600;
var fuelBarHeight = 40;
var fuelBarBg = LK.getAsset('fuelBarBgAsset', {
anchorX: 1.0,
// right edge
anchorY: 1.0,
// bottom edge
x: 0,
y: 8
});
var fuelBar = LK.getAsset('fuelBarAsset', {
width: fuelBarWidth,
height: fuelBarHeight,
anchorX: 1.0,
// right edge
anchorY: 1.0,
// bottom edge
x: 0,
y: 0
});
// Add to bottomRight GUI overlay so it stays in the bottom right corner
LK.gui.bottomRight.addChild(fuelBarBg);
LK.gui.bottomRight.addChild(fuelBar);
// Fuel bar icon (sembol) ekle
var fuelBarIcon = LK.getAsset('fuelBarIcon', {
anchorX: 1.0,
anchorY: 1.0,
x: -fuelBarWidth - 32,
// Barın hemen soluna
y: 0
});
LK.gui.bottomRight.addChild(fuelBarIcon);
// En yüksek skor (oyun başında sıfır)
var highScore = 0;
// --- Fuel Warning Icon (center, hidden by default) ---
var fuelWarningIcon = LK.getAsset('fuelWarningIcon', {
anchorX: 0.5,
anchorY: 0.5,
x: GAME_WIDTH / 2,
y: GAME_HEIGHT / 2,
alpha: 0 // Start hidden
});
game.addChild(fuelWarningIcon);
var highScoreTxt = new Text2('', {
size: 60,
fill: 0xFFFF00
});
highScoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(highScoreTxt);
function updateHighScore() {
if (distance > highScore) highScore = distance;
highScoreTxt.setText('En Yüksek: ' + highScore);
}
updateHighScore();
// Sürükleme için
var dragStartX = null;
var dragStartLane = null;
// Oyun bitti mi?
var isGameOver = false;
// Menu state
var isMenu = true;
var isCarSelect = false;
var selectedPlayerCarAsset = 'playerCar'; // default
var selectedEnemyCarAssets = []; // if empty, all types used
// Car asset list for selection (player and enemy)
var allCarAssets = ['playerCar', 'enemyCar', 'enemyCarRed', 'enemyCarBlue', 'enemyCarYellow', 'enemyCarGreen', 'enemyCarPurple', 'enemyCarOrange', 'enemyCarPink', 'enemyCarCyan', 'enemyCarBlack', 'enemyCarWhite', 'enemyCarBrown', 'enemyCarSilver', 'enemyCarGold', 'enemyCarNavy', 'enemyCarLime'];
// Menu overlay and play button
var menuOverlay = new Container();
var playButton = LK.getAsset('playButton', {
anchorX: 0.5,
anchorY: 0.5,
x: GAME_WIDTH / 2,
y: GAME_HEIGHT / 2 + 200
});
menuOverlay.addChild(playButton);
// Car select button
var carSelectButton = LK.getAsset('carSelectButton', {
anchorX: 0.5,
anchorY: 0.5,
x: GAME_WIDTH / 2,
y: GAME_HEIGHT / 2 + 800 // moved further down
});
menuOverlay.addChild(carSelectButton);
// Optionally, add a game title
var titleText = new Text2('ARABA YARIŞI', {
size: 140,
fill: 0xFFF700
});
titleText.anchor.set(0.5, 0.5);
titleText.x = GAME_WIDTH / 2;
titleText.y = GAME_HEIGHT / 2 - 200;
menuOverlay.addChild(titleText);
game.addChild(menuOverlay);
// Car select overlay
var carSelectOverlay = new Container();
carSelectOverlay.visible = false;
game.addChild(carSelectOverlay);
// Car select grid
var carSelectButtons = [];
var carSelectTitle = new Text2('ARABA SEÇ', {
size: 120,
fill: 0xFFF700
});
carSelectTitle.anchor.set(0.5, 0.5);
carSelectTitle.x = GAME_WIDTH / 2;
carSelectTitle.y = 300;
carSelectOverlay.addChild(carSelectTitle);
// Layout grid
var gridCols = 4;
var gridRows = Math.ceil(allCarAssets.length / gridCols);
var gridStartX = GAME_WIDTH / 2 - gridCols * 350 / 2 + 175;
var gridStartY = 500;
for (var i = 0; i < allCarAssets.length; i++) {
var asset = allCarAssets[i];
var btn = LK.getAsset(asset, {
anchorX: 0.5,
anchorY: 0.5,
x: gridStartX + i % gridCols * 350,
y: gridStartY + Math.floor(i / gridCols) * 400
});
carSelectOverlay.addChild(btn);
carSelectButtons.push({
btn: btn,
asset: asset
});
}
// Car select back button
var carSelectBackBtn = new Text2('GERİ', {
size: 80,
fill: 0xFFFFFF
});
carSelectBackBtn.anchor.set(0.5, 0.5);
carSelectBackBtn.x = GAME_WIDTH / 2;
carSelectBackBtn.y = GAME_HEIGHT - 300;
carSelectOverlay.addChild(carSelectBackBtn);
// Only handle tap for menu or game or car select
game.down = function (x, y, obj) {
if (isMenu) {
// Play button
var bx = playButton.x,
by = playButton.y,
bw = playButton.width,
bh = playButton.height;
if (x >= bx - bw / 2 && x <= bx + bw / 2 && y >= by - bh / 2 && y <= by + bh / 2) {
isMenu = false;
menuOverlay.visible = false;
return;
}
// Car select button
var csx = carSelectButton.x,
csy = carSelectButton.y,
csw = carSelectButton.width,
csh = carSelectButton.height;
if (x >= csx - csw / 2 && x <= csx + csw / 2 && y >= csy - csh / 2 && y <= csy + csh / 2) {
isMenu = false;
isCarSelect = true;
menuOverlay.visible = false;
carSelectOverlay.visible = true;
return;
}
return;
}
if (isCarSelect) {
// Car select grid
for (var i = 0; i < carSelectButtons.length; i++) {
var btn = carSelectButtons[i].btn;
var bx = btn.x,
by = btn.y,
bw = btn.width,
bh = btn.height;
if (x >= bx - bw / 2 && x <= bx + bw / 2 && y >= by - bh / 2 && y <= by + bh / 2) {
selectedPlayerCarAsset = carSelectButtons[i].asset;
isCarSelect = false;
carSelectOverlay.visible = false;
// Reset player car
player.destroy();
player = new PlayerCar();
player.lane = 1;
player.x = LANE_X[player.lane];
player.y = GAME_HEIGHT - 500;
game.addChild(player);
menuOverlay.visible = false;
isMenu = false;
return;
}
}
// Back button
var bbx = carSelectBackBtn.x,
bby = carSelectBackBtn.y;
var bbw = 200,
bbh = 120;
if (x >= bbx - bbw / 2 && x <= bbx + bbw / 2 && y >= bby - bbh / 2 && y <= bby + bbh / 2) {
isCarSelect = false;
carSelectOverlay.visible = false;
isMenu = true;
menuOverlay.visible = true;
return;
}
return;
}
// Game controls
if (x > GAME_WIDTH / 2) {
movePlayerToLane(player.lane + 1);
} else {
movePlayerToLane(player.lane - 1);
}
};
// Oyun hareketleri
function movePlayerToLane(lane) {
if (lane < 0) lane = 0;
if (lane > LANE_COUNT - 1) lane = LANE_COUNT - 1;
if (lane !== player.lane) {
player.lane = lane;
// Yumuşak geçiş animasyonu
tween(player, {
x: LANE_X[lane]
}, {
duration: 120,
easing: tween.cubicOut
});
// Araba hareket sesi çal
LK.getSound('Carsound').play();
}
}
// Dokunma ile sağ/sola bir şerit hareket
// (removed duplicate game.down, handled above with overlay forwarding)
game.move = function (x, y, obj) {
// Hareket gerekmez, tap ile kontrol
};
game.up = function (x, y, obj) {
// Gerekli değil, tap ile kontrol
};
// Çarpışma kontrolü
function checkCollision(a, b) {
// Basit dikdörtgen çarpışma
return Math.abs(a.x - b.x) < (a.width + b.width) / 2 - 20 && Math.abs(a.y - b.y) < (a.height + b.height) / 2 - 20;
}
// Oyun güncelleme
game.update = function () {
if (isMenu) {
return;
}
if (isCarSelect) {
return;
}
if (isGameOver) {
return;
}
// Müzik başlat (her zaman)
if (!LK.isMusicPlaying || !LK.isMusicPlaying('A')) {
LK.playMusic('A', {
loop: true
});
}
// Skor: mesafe arttıkça artar
distance += 1;
scoreTxt.setText(distance);
updateHighScore();
// --- Fuel decrease and bar update ---
if (!isGameOver && !isMenu && !isCarSelect) {
fuel -= FUEL_DECREASE_PER_TICK;
if (fuel < 0) fuel = 0;
// Update fuel bar width
var fuelRatio = fuel / FUEL_MAX;
if (fuelRatio < 0) fuelRatio = 0;
fuelBar.width = fuelBarWidth * fuelRatio;
// Show/hide and blink fuel warning icon if below/above 20%
if (fuelRatio < 0.2) {
// Blink: fade in/out using a sine wave based on LK.ticks
var blinkAlpha = 0.5 + 0.5 * Math.sin(LK.ticks * 0.2);
fuelWarningIcon.alpha = blinkAlpha;
} else {
if (fuelWarningIcon.alpha !== 0) fuelWarningIcon.alpha = 0;
}
// Fuel bar color and flash effect when low
if (fuelRatio <= 0.15) {
// Change color to bright red and flash
if (!fuelBar._isFlashing) {
fuelBar._isFlashing = true;
LK.effects.flashObject(fuelBar, 0xffffff, 200);
}
fuelBar.tint = 0xff0000;
} else if (fuelRatio <= 0.35) {
fuelBar.tint = 0xff8800;
fuelBar._isFlashing = false;
} else {
fuelBar.tint = 0xff2222;
fuelBar._isFlashing = false;
}
// Game over if fuel is empty
if (fuel <= 0) {
isGameOver = true;
LK.effects.flashScreen(0xff0000, 800);
LK.showGameOver();
return;
}
} else {
// Reset tint and flash state if not in game
if (fuelBar) {
fuelBar.tint = 0xff2222;
fuelBar._isFlashing = false;
}
// Hide fuel warning icon if not in game
if (fuelWarningIcon && fuelWarningIcon.alpha !== 0) fuelWarningIcon.alpha = 0;
}
// Yol çizgilerini hareket ettir
for (var i = 0; i < roadLines.length; i++) {
var line = roadLines[i];
line.update();
if (line.y > GAME_HEIGHT + 100) {
line.y -= 8 * 400;
}
}
// Sol ağaçları hareket ettir
for (var i = 0; i < leftTrees.length; i++) {
var tree = leftTrees[i];
tree.update();
if (tree.y > GAME_HEIGHT + 100) {
tree.y -= 8 * 400;
}
}
// Sağ ağaçları hareket ettir
for (var i = 0; i < rightTrees.length; i++) {
var tree = rightTrees[i];
tree.update();
if (tree.y > GAME_HEIGHT + 100) {
tree.y -= 8 * 400;
}
}
// Sol ağaç altı bölgeleri hareket ettir
for (var i = 0; i < leftTreeZones.length; i++) {
var zone = leftTreeZones[i];
zone.update();
if (zone.y > GAME_HEIGHT + 100) {
zone.y -= 8 * 400;
}
}
// Sağ ağaç altı bölgeleri hareket ettir
for (var i = 0; i < rightTreeZones.length; i++) {
var zone = rightTreeZones[i];
zone.update();
if (zone.y > GAME_HEIGHT + 100) {
zone.y -= 8 * 400;
}
}
// Engelleri hareket ettir
for (var i = enemyCars.length - 1; i >= 0; i--) {
var enemy = enemyCars[i];
enemy.update();
// Ekrandan çıktıysa sil
if (enemy.direction === 1 && enemy.y > GAME_HEIGHT + 200 || enemy.direction === -1 && enemy.y < -200) {
enemy.destroy();
enemyCars.splice(i, 1);
continue;
}
// Çarpışma kontrolü
if (checkCollision(player, enemy)) {
isGameOver = true;
// Çarpışma anında oyuncu arabasına görsel efekt uygula
LK.effects.flashObject(player, 0xff0000, 800);
LK.effects.flashScreen(0xff0000, 800);
LK.showGameOver();
return;
}
}
// Arkadan kovalayan düşman araba hareketi ve çarpışma
chaserCar.x = player.x;
chaserCar.targetY = player.y + 600 - distance / 10; // Mesafe arttıkça yaklaşsın
if (chaserCar.targetY < player.y + 200) chaserCar.targetY = player.y + 200; // Minimum mesafe
chaserCar.update();
// Çarpışma kontrolü (chaserCar)
if (checkCollision(player, chaserCar)) {
isGameOver = true;
LK.effects.flashObject(player, 0xff0000, 800);
LK.effects.flashScreen(0xff0000, 800);
LK.showGameOver();
return;
}
// Nitro spawn ve hareket
nitroSpawnTick++;
if (nitroSpawnTick >= NITRO_SPAWN_INTERVAL) {
nitroSpawnTick = 0;
// Rastgele bir şeride nitro koy
var lane = Math.floor(Math.random() * LANE_COUNT);
var nitro = new Nitro();
nitro.x = LANE_X[lane];
nitro.y = -150;
nitro.lane = lane;
game.addChild(nitro);
nitros.push(nitro);
}
// Nitro'ları hareket ettir ve topla
for (var i = nitros.length - 1; i >= 0; i--) {
var n = nitros[i];
n.update();
if (n.y > GAME_HEIGHT + 200) {
n.destroy();
nitros.splice(i, 1);
continue;
}
// Toplama kontrolü
if (!nitroActive && checkCollision(player, n)) {
nitroActive = true;
nitroTimer = NITRO_DURATION;
playerSpeedBoost = 18; // Hız artışı
// Nitro alınca benzin azalsın
fuel -= 200;
if (fuel < 0) fuel = 0;
n.destroy();
nitros.splice(i, 1);
// Görsel efekt: arabayı maviye flashla
LK.effects.flashObject(player, 0x00cfff, 400);
continue;
}
}
// --- FuelCan spawn ve hareket ---
fuelCanSpawnTick++;
if (fuelCanSpawnTick >= FUELCAN_SPAWN_INTERVAL) {
fuelCanSpawnTick = 0;
// Rastgele bir şeride benzin koy
var lane = Math.floor(Math.random() * LANE_COUNT);
var fuelCan = new FuelCan();
fuelCan.x = LANE_X[lane];
fuelCan.y = -120;
fuelCan.lane = lane;
game.addChild(fuelCan);
fuelCans.push(fuelCan);
}
// FuelCan'ları hareket ettir ve topla
for (var i = fuelCans.length - 1; i >= 0; i--) {
var f = fuelCans[i];
f.update();
if (f.y > GAME_HEIGHT + 200) {
f.destroy();
fuelCans.splice(i, 1);
continue;
}
// Toplama kontrolü
if (checkCollision(player, f)) {
// Yakıtı artır, maksimumu geçmesin
fuel += FUELCAN_AMOUNT;
if (fuel > FUEL_MAX) fuel = FUEL_MAX;
// Görsel efekt: fuel barı beyaza flashla
LK.effects.flashObject(fuelBar, 0xffffff, 200);
f.destroy();
fuelCans.splice(i, 1);
continue;
}
}
// Nitro etkisi
if (nitroActive) {
nitroTimer--;
if (nitroTimer > 0) {
// Hızlı ilerle: yol, ağaçlar, düşmanlar, chaserCar daha hızlı hareket eder
for (var i = 0; i < roadLines.length; i++) roadLines[i].y += playerSpeedBoost;
for (var i = 0; i < leftTrees.length; i++) leftTrees[i].y += playerSpeedBoost;
for (var i = 0; i < rightTrees.length; i++) rightTrees[i].y += playerSpeedBoost;
for (var i = 0; i < leftTreeZones.length; i++) leftTreeZones[i].y += playerSpeedBoost;
for (var i = 0; i < rightTreeZones.length; i++) rightTreeZones[i].y += playerSpeedBoost;
for (var i = 0; i < enemyCars.length; i++) enemyCars[i].y += playerSpeedBoost;
chaserCar.y += playerSpeedBoost * 0.7;
// Araba kadrajdan çıkmasın: player.y görsel olarak ileri kayarken sınırla
var playerVisualMove = playerSpeedBoost * 0.5;
var playerMinY = 300 + player.height / 2; // Üst sınır (ekranda kalacak şekilde)
var playerMaxY = GAME_HEIGHT - 500; // Alt sınır (başlangıç pozisyonu)
var newPlayerY = player.y + playerVisualMove;
if (newPlayerY < playerMinY) {
player.y = playerMinY;
} else if (newPlayerY > playerMaxY) {
player.y = playerMaxY;
} else {
player.y = newPlayerY;
}
distance += Math.floor(playerSpeedBoost * 0.7);
} else {
nitroActive = false;
playerSpeedBoost = 0;
}
} else {
// Nitro aktif değilse hiçbir blur overlay kodu çalışmasın
}
// Yeni engel oluştur
enemySpawnTick++;
var currentSpawnInterval = getEnemySpawnInterval();
if (enemySpawnTick >= currentSpawnInterval) {
enemySpawnTick = 0;
// Rastgele bir veya iki şeride engel koy
var lanes = [0, 1, 2, 3];
// %60 tek araba, %40 iki araba
var count = Math.random() < 0.6 ? 1 : 2;
for (var j = 0; j < count; j++) {
if (lanes.length === 0) break;
var idx = Math.floor(Math.random() * lanes.length);
var lane = lanes[idx];
lanes.splice(idx, 1);
var enemy = new EnemyCar();
enemy.x = LANE_X[lane];
// Soldaki iki şerit (0 ve 1) için de aşağı doğru giden araba oluştur
enemy.y = -200;
enemy.direction = 1; // Aşağı hareket
game.addChild(enemy);
enemyCars.push(enemy);
}
}
};
// Oyun yeniden başlatıldığında sıfırla
game.on('reset', function () {
// Arabaları ve çizgileri sil
for (var i = 0; i < enemyCars.length; i++) {
enemyCars[i].destroy();
}
enemyCars = [];
// Nitro'ları sil
for (var i = 0; i < nitros.length; i++) {
nitros[i].destroy();
}
nitros = [];
// ChaserCar'ı sıfırla
chaserCar.x = player.x;
chaserCar.y = GAME_HEIGHT + 400;
chaserCar.targetY = player.y + 600;
nitroActive = false;
nitroTimer = 0;
playerSpeedBoost = 0;
distance = 0;
scoreTxt.setText('0');
isGameOver = false;
player.lane = 1;
player.x = LANE_X[1];
player.y = GAME_HEIGHT - 500;
updateHighScore();
// --- Reset fuel ---
fuel = FUEL_MAX;
fuelBar.width = fuelBarWidth;
// Menüye geri dön
isMenu = true;
isCarSelect = false;
if (menuOverlay) menuOverlay.visible = true;
// Reset car selection to default
selectedPlayerCarAsset = 'playerCar';
selectedEnemyCarAssets = [];
// Müzik başlat (menüde)
}); /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// Arkadan kovalayan düşman araba
var ChaserCar = Container.expand(function () {
var self = Container.call(this);
var car = self.attachAsset('chaserCar', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = car.width;
self.height = car.height;
self.speed = 12; // Başlangıç hızı
self.targetY = 0; // Hedef y (player'ın arkasında başlar)
self.update = function () {
// Oyuncuya yaklaş
if (self.y < self.targetY) {
self.y += self.speed;
if (self.y > self.targetY) self.y = self.targetY;
}
};
return self;
});
// Düz ve ters giden engel arabalar
var EnemyCar = Container.expand(function () {
var self = Container.call(this);
// Farklı tipte araba şekilleri ve renkleri
var carTypes = [{
asset: 'enemyCar',
shape: 'box'
}, {
asset: 'enemyCarRed',
shape: 'box'
}, {
asset: 'enemyCarBlue',
shape: 'box'
}, {
asset: 'enemyCarYellow',
shape: 'box'
}, {
asset: 'enemyCarGreen',
shape: 'ellipse'
}, {
asset: 'enemyCarPurple',
shape: 'box'
}, {
asset: 'enemyCar',
shape: 'ellipse'
}, {
asset: 'enemyCarRed',
shape: 'ellipse'
}, {
asset: 'enemyCarBlue',
shape: 'ellipse'
}, {
asset: 'enemyCarYellow',
shape: 'ellipse'
}, {
asset: 'enemyCarGreen',
shape: 'box'
}, {
asset: 'enemyCarPurple',
shape: 'ellipse'
}, {
asset: 'enemyCar',
shape: 'box'
}, {
asset: 'enemyCarRed',
shape: 'box'
}, {
asset: 'enemyCarBlue',
shape: 'box'
}, {
asset: 'enemyCarYellow',
shape: 'box'
},
// 10 yeni çeşit
{
asset: 'enemyCarOrange',
shape: 'box'
}, {
asset: 'enemyCarPink',
shape: 'ellipse'
}, {
asset: 'enemyCarCyan',
shape: 'box'
}, {
asset: 'enemyCarBlack',
shape: 'ellipse'
}, {
asset: 'enemyCarWhite',
shape: 'box'
}, {
asset: 'enemyCarBrown',
shape: 'ellipse'
}, {
asset: 'enemyCarSilver',
shape: 'box'
}, {
asset: 'enemyCarGold',
shape: 'ellipse'
}, {
asset: 'enemyCarNavy',
shape: 'box'
}, {
asset: 'enemyCarLime',
shape: 'ellipse'
},
// 3 yeni çeşit (arttırıldı)
{
asset: 'enemyCarBlack',
shape: 'box'
}, {
asset: 'enemyCarCyan',
shape: 'ellipse'
}, {
asset: 'enemyCarBrown',
shape: 'box'
}];
// If selectedEnemyCarAssets is set, filter carTypes
if (typeof selectedEnemyCarAssets !== 'undefined' && selectedEnemyCarAssets && selectedEnemyCarAssets.length > 0) {
var filtered = [];
for (var i = 0; i < carTypes.length; i++) {
if (selectedEnemyCarAssets.indexOf(carTypes[i].asset) !== -1) {
filtered.push(carTypes[i]);
}
}
if (filtered.length > 0) carTypes = filtered;
}
// Rastgele bir tip seç
var typeIdx = Math.floor(Math.random() * carTypes.length);
var carType = carTypes[typeIdx];
var car = self.attachAsset(carType.asset, {
anchorX: 0.5,
anchorY: 0.5
});
self.width = car.width;
self.height = car.height;
self.speed = 18; // Varsayılan hız (aşağı)
self.direction = 1; // 1: aşağı, -1: yukarı (ters)
self.update = function () {
self.y += self.speed * self.direction;
};
return self;
});
// Benzin bidonu (yolda çıkan, toplanınca yakıt artırır)
var FuelCan = Container.expand(function () {
var self = Container.call(this);
// Benzin bidonu için görsel asset kullan
var can = self.attachAsset('fuelCan', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = can.width;
self.height = can.height;
self.speed = 24;
self.lane = 1;
self.update = function () {
self.y += self.speed;
};
return self;
});
// Nitro power-up
var Nitro = Container.expand(function () {
var self = Container.call(this);
var nitro = self.attachAsset('nitro', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = nitro.width;
self.height = nitro.height;
self.speed = 24;
self.lane = 1;
self.update = function () {
self.y += self.speed;
};
return self;
});
// Oyuncu arabası
var PlayerCar = Container.expand(function () {
var self = Container.call(this);
// Use selectedPlayerCarAsset if set, fallback to 'playerCar'
var asset = typeof selectedPlayerCarAsset !== 'undefined' && selectedPlayerCarAsset ? selectedPlayerCarAsset : 'playerCar';
var car = self.attachAsset(asset, {
anchorX: 0.5,
anchorY: 0.5
});
self.width = car.width;
self.height = car.height;
return self;
});
// Yol çizgisi (hareketli)
var RoadLine = Container.expand(function () {
var self = Container.call(this);
var line = self.attachAsset('roadLine', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = line.width;
self.height = line.height;
self.speed = 24;
self.update = function () {
self.y += self.speed;
};
return self;
});
// Yan ağaçlar (sol ve sağ)
var TreeLeft = Container.expand(function () {
var self = Container.call(this);
var tree = self.attachAsset('treeLeft', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = tree.width;
self.height = tree.height;
self.speed = 24;
self.update = function () {
self.y += self.speed;
};
return self;
});
var TreeRight = Container.expand(function () {
var self = Container.call(this);
var tree = self.attachAsset('treeRight', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = tree.width;
self.height = tree.height;
self.speed = 24;
self.update = function () {
self.y += self.speed;
};
return self;
});
// Tree bottom zone (left)
var TreeZoneLeft = Container.expand(function () {
var self = Container.call(this);
var zone = self.attachAsset('treeZoneLeft', {
anchorX: 0.5,
anchorY: 0.0
});
self.width = zone.width;
self.height = zone.height;
self.speed = 24;
self.update = function () {
self.y += self.speed;
};
return self;
});
// Tree bottom zone (right)
var TreeZoneRight = Container.expand(function () {
var self = Container.call(this);
var zone = self.attachAsset('treeZoneRight', {
anchorX: 0.5,
anchorY: 0.0
});
self.width = zone.width;
self.height = zone.height;
self.speed = 24;
self.update = function () {
self.y += self.speed;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x222222
});
/****
* Game Code
****/
// Nitro asset
// Chasing enemy car asset (arkadan kovalayan düşman)
// Köprü ve arka plan için özelleştirilebilir assetler
// 10 yeni çeşit için ek varlıklar
// Oyun alanı boyutları
// Köprü ve arka planı ekle
// Tree bottom zone assets (customize these IDs as needed)
// Fuel bar yan sembolü
var backgroundImg = LK.getAsset('background', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 2732 / 2
});
game.addChild(backgroundImg);
var bridgeImg = LK.getAsset('bridge', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 2732 / 2
});
game.addChild(bridgeImg);
// Oyuncu arabası (kırmızı kutu)
// Engeller (gri kutu)
// Yol çizgisi (beyaz ince kutu)
// Yan ağaçlar için basit şekil (dilerseniz image ile de değiştirebilirsiniz)
// Play button asset (customizable)
var GAME_WIDTH = 2048;
var GAME_HEIGHT = 2732;
// Yolun genişliği ve şeritler
var ROAD_WIDTH = 1200;
var ROAD_LEFT = (GAME_WIDTH - ROAD_WIDTH) / 2;
var ROAD_RIGHT = ROAD_LEFT + ROAD_WIDTH;
// Şerit sayısı ve pozisyonları
var LANE_COUNT = 4;
var LANE_WIDTH = ROAD_WIDTH / LANE_COUNT;
var LANE_X = [ROAD_LEFT + LANE_WIDTH * 0.5, ROAD_LEFT + LANE_WIDTH * 1.5, ROAD_LEFT + LANE_WIDTH * 2.5, ROAD_LEFT + LANE_WIDTH * 3.5];
// Yol çizgileri
var roadLines = [];
// Yan ağaçlar
var leftTrees = [];
var rightTrees = [];
// Tree bottom zones
var leftTreeZones = [];
var rightTreeZones = [];
function spawnRoadLines() {
// Her şeridin ortasına, aralıklı çizgiler
for (var lane = 0; lane < LANE_COUNT; lane++) {
for (var i = 0; i < 8; i++) {
var line = new RoadLine();
line.x = ROAD_LEFT + LANE_WIDTH * (lane + 0.5);
line.y = i * 400;
roadLines.push(line);
game.addChild(line);
}
}
// Sol ve sağ kenara ağaçlar ve altındaki bölgeler
for (var i = 0; i < 8; i++) {
var leftTree = new TreeLeft();
leftTree.x = ROAD_LEFT - 120; // Sol kenarın biraz dışında
leftTree.y = i * 400;
leftTrees.push(leftTree);
game.addChild(leftTree);
var rightTree = new TreeRight();
rightTree.x = ROAD_RIGHT + 120; // Sağ kenarın biraz dışında
rightTree.y = i * 400;
rightTrees.push(rightTree);
game.addChild(rightTree);
// Tree bottom zones
var leftZone = new TreeZoneLeft();
leftZone.x = ROAD_LEFT - 120;
leftZone.y = leftTree.y + leftTree.height / 2; // Ağacın altına hizala
leftTreeZones.push(leftZone);
game.addChild(leftZone);
var rightZone = new TreeZoneRight();
rightZone.x = ROAD_RIGHT + 120;
rightZone.y = rightTree.y + rightTree.height / 2;
rightTreeZones.push(rightZone);
game.addChild(rightZone);
}
}
spawnRoadLines();
// Oyuncu arabası
var player = new PlayerCar();
player.lane = 1; // Ortadaki şerit
player.x = LANE_X[player.lane];
player.y = GAME_HEIGHT - 500;
game.addChild(player);
// Arkadan kovalayan düşman araba
var chaserCar = new ChaserCar();
chaserCar.x = player.x;
chaserCar.y = GAME_HEIGHT + 400; // Ekranın dışında başlat
chaserCar.targetY = player.y + 600; // Oyuncunun arkasında başlat
game.addChild(chaserCar);
// Nitro power-up'lar
var nitros = [];
var nitroSpawnTick = 0;
var NITRO_SPAWN_INTERVAL = 180; // 3 saniyede bir
var nitroActive = false;
var nitroTimer = 0;
var NITRO_DURATION = 120; // 2 saniye
var playerSpeedBoost = 0;
// --- FuelCan (yolda benzin) değişkenleri ---
var fuelCans = [];
var fuelCanSpawnTick = 0;
var FUELCAN_SPAWN_INTERVAL = 300; // Her 5 saniyede bir (60fps)
var FUELCAN_AMOUNT = 250; // Toplayınca eklenecek yakıt miktarı
// Engeller
var enemyCars = [];
var ENEMY_SPAWN_INTERVAL_BASE = 60; // Başlangıçta 60 tickte bir (1 sn)
var ENEMY_SPAWN_INTERVAL_MIN = 18; // Minimum 0.3 sn (18 tick)
var enemySpawnTick = 0;
function getEnemySpawnInterval() {
// Mesafe arttıkça interval azalır, minimuma kadar iner
// 0-2000 arası 60, 2000'den sonra 30'a kadar iner, 6000'den sonra tekrar 60'a döner (normalleşir)
if (distance < 2000) return ENEMY_SPAWN_INTERVAL_BASE;
if (distance < 6000) return Math.max(ENEMY_SPAWN_INTERVAL_BASE - Math.floor((distance - 2000) / 133), 30);
// 6000 ve sonrası: tekrar normal (60 tick) aralığına döner
return ENEMY_SPAWN_INTERVAL_BASE;
}
// Skor
var distance = 0;
var scoreTxt = new Text2('0', {
size: 120,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// --- Fuel Bar Variables and UI ---
var FUEL_MAX = 1000;
var fuel = FUEL_MAX;
// Benzin daha yavaş azalsın
var FUEL_DECREASE_PER_TICK = 0.3; // daha yavaş azalsın
var fuelBarWidth = 600;
var fuelBarHeight = 40;
var fuelBarBg = LK.getAsset('fuelBarBgAsset', {
anchorX: 1.0,
// right edge
anchorY: 1.0,
// bottom edge
x: 0,
y: 8
});
var fuelBar = LK.getAsset('fuelBarAsset', {
width: fuelBarWidth,
height: fuelBarHeight,
anchorX: 1.0,
// right edge
anchorY: 1.0,
// bottom edge
x: 0,
y: 0
});
// Add to bottomRight GUI overlay so it stays in the bottom right corner
LK.gui.bottomRight.addChild(fuelBarBg);
LK.gui.bottomRight.addChild(fuelBar);
// Fuel bar icon (sembol) ekle
var fuelBarIcon = LK.getAsset('fuelBarIcon', {
anchorX: 1.0,
anchorY: 1.0,
x: -fuelBarWidth - 32,
// Barın hemen soluna
y: 0
});
LK.gui.bottomRight.addChild(fuelBarIcon);
// En yüksek skor (oyun başında sıfır)
var highScore = 0;
// --- Fuel Warning Icon (center, hidden by default) ---
var fuelWarningIcon = LK.getAsset('fuelWarningIcon', {
anchorX: 0.5,
anchorY: 0.5,
x: GAME_WIDTH / 2,
y: GAME_HEIGHT / 2,
alpha: 0 // Start hidden
});
game.addChild(fuelWarningIcon);
var highScoreTxt = new Text2('', {
size: 60,
fill: 0xFFFF00
});
highScoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(highScoreTxt);
function updateHighScore() {
if (distance > highScore) highScore = distance;
highScoreTxt.setText('En Yüksek: ' + highScore);
}
updateHighScore();
// Sürükleme için
var dragStartX = null;
var dragStartLane = null;
// Oyun bitti mi?
var isGameOver = false;
// Menu state
var isMenu = true;
var isCarSelect = false;
var selectedPlayerCarAsset = 'playerCar'; // default
var selectedEnemyCarAssets = []; // if empty, all types used
// Car asset list for selection (player and enemy)
var allCarAssets = ['playerCar', 'enemyCar', 'enemyCarRed', 'enemyCarBlue', 'enemyCarYellow', 'enemyCarGreen', 'enemyCarPurple', 'enemyCarOrange', 'enemyCarPink', 'enemyCarCyan', 'enemyCarBlack', 'enemyCarWhite', 'enemyCarBrown', 'enemyCarSilver', 'enemyCarGold', 'enemyCarNavy', 'enemyCarLime'];
// Menu overlay and play button
var menuOverlay = new Container();
var playButton = LK.getAsset('playButton', {
anchorX: 0.5,
anchorY: 0.5,
x: GAME_WIDTH / 2,
y: GAME_HEIGHT / 2 + 200
});
menuOverlay.addChild(playButton);
// Car select button
var carSelectButton = LK.getAsset('carSelectButton', {
anchorX: 0.5,
anchorY: 0.5,
x: GAME_WIDTH / 2,
y: GAME_HEIGHT / 2 + 800 // moved further down
});
menuOverlay.addChild(carSelectButton);
// Optionally, add a game title
var titleText = new Text2('ARABA YARIŞI', {
size: 140,
fill: 0xFFF700
});
titleText.anchor.set(0.5, 0.5);
titleText.x = GAME_WIDTH / 2;
titleText.y = GAME_HEIGHT / 2 - 200;
menuOverlay.addChild(titleText);
game.addChild(menuOverlay);
// Car select overlay
var carSelectOverlay = new Container();
carSelectOverlay.visible = false;
game.addChild(carSelectOverlay);
// Car select grid
var carSelectButtons = [];
var carSelectTitle = new Text2('ARABA SEÇ', {
size: 120,
fill: 0xFFF700
});
carSelectTitle.anchor.set(0.5, 0.5);
carSelectTitle.x = GAME_WIDTH / 2;
carSelectTitle.y = 300;
carSelectOverlay.addChild(carSelectTitle);
// Layout grid
var gridCols = 4;
var gridRows = Math.ceil(allCarAssets.length / gridCols);
var gridStartX = GAME_WIDTH / 2 - gridCols * 350 / 2 + 175;
var gridStartY = 500;
for (var i = 0; i < allCarAssets.length; i++) {
var asset = allCarAssets[i];
var btn = LK.getAsset(asset, {
anchorX: 0.5,
anchorY: 0.5,
x: gridStartX + i % gridCols * 350,
y: gridStartY + Math.floor(i / gridCols) * 400
});
carSelectOverlay.addChild(btn);
carSelectButtons.push({
btn: btn,
asset: asset
});
}
// Car select back button
var carSelectBackBtn = new Text2('GERİ', {
size: 80,
fill: 0xFFFFFF
});
carSelectBackBtn.anchor.set(0.5, 0.5);
carSelectBackBtn.x = GAME_WIDTH / 2;
carSelectBackBtn.y = GAME_HEIGHT - 300;
carSelectOverlay.addChild(carSelectBackBtn);
// Only handle tap for menu or game or car select
game.down = function (x, y, obj) {
if (isMenu) {
// Play button
var bx = playButton.x,
by = playButton.y,
bw = playButton.width,
bh = playButton.height;
if (x >= bx - bw / 2 && x <= bx + bw / 2 && y >= by - bh / 2 && y <= by + bh / 2) {
isMenu = false;
menuOverlay.visible = false;
return;
}
// Car select button
var csx = carSelectButton.x,
csy = carSelectButton.y,
csw = carSelectButton.width,
csh = carSelectButton.height;
if (x >= csx - csw / 2 && x <= csx + csw / 2 && y >= csy - csh / 2 && y <= csy + csh / 2) {
isMenu = false;
isCarSelect = true;
menuOverlay.visible = false;
carSelectOverlay.visible = true;
return;
}
return;
}
if (isCarSelect) {
// Car select grid
for (var i = 0; i < carSelectButtons.length; i++) {
var btn = carSelectButtons[i].btn;
var bx = btn.x,
by = btn.y,
bw = btn.width,
bh = btn.height;
if (x >= bx - bw / 2 && x <= bx + bw / 2 && y >= by - bh / 2 && y <= by + bh / 2) {
selectedPlayerCarAsset = carSelectButtons[i].asset;
isCarSelect = false;
carSelectOverlay.visible = false;
// Reset player car
player.destroy();
player = new PlayerCar();
player.lane = 1;
player.x = LANE_X[player.lane];
player.y = GAME_HEIGHT - 500;
game.addChild(player);
menuOverlay.visible = false;
isMenu = false;
return;
}
}
// Back button
var bbx = carSelectBackBtn.x,
bby = carSelectBackBtn.y;
var bbw = 200,
bbh = 120;
if (x >= bbx - bbw / 2 && x <= bbx + bbw / 2 && y >= bby - bbh / 2 && y <= bby + bbh / 2) {
isCarSelect = false;
carSelectOverlay.visible = false;
isMenu = true;
menuOverlay.visible = true;
return;
}
return;
}
// Game controls
if (x > GAME_WIDTH / 2) {
movePlayerToLane(player.lane + 1);
} else {
movePlayerToLane(player.lane - 1);
}
};
// Oyun hareketleri
function movePlayerToLane(lane) {
if (lane < 0) lane = 0;
if (lane > LANE_COUNT - 1) lane = LANE_COUNT - 1;
if (lane !== player.lane) {
player.lane = lane;
// Yumuşak geçiş animasyonu
tween(player, {
x: LANE_X[lane]
}, {
duration: 120,
easing: tween.cubicOut
});
// Araba hareket sesi çal
LK.getSound('Carsound').play();
}
}
// Dokunma ile sağ/sola bir şerit hareket
// (removed duplicate game.down, handled above with overlay forwarding)
game.move = function (x, y, obj) {
// Hareket gerekmez, tap ile kontrol
};
game.up = function (x, y, obj) {
// Gerekli değil, tap ile kontrol
};
// Çarpışma kontrolü
function checkCollision(a, b) {
// Basit dikdörtgen çarpışma
return Math.abs(a.x - b.x) < (a.width + b.width) / 2 - 20 && Math.abs(a.y - b.y) < (a.height + b.height) / 2 - 20;
}
// Oyun güncelleme
game.update = function () {
if (isMenu) {
return;
}
if (isCarSelect) {
return;
}
if (isGameOver) {
return;
}
// Müzik başlat (her zaman)
if (!LK.isMusicPlaying || !LK.isMusicPlaying('A')) {
LK.playMusic('A', {
loop: true
});
}
// Skor: mesafe arttıkça artar
distance += 1;
scoreTxt.setText(distance);
updateHighScore();
// --- Fuel decrease and bar update ---
if (!isGameOver && !isMenu && !isCarSelect) {
fuel -= FUEL_DECREASE_PER_TICK;
if (fuel < 0) fuel = 0;
// Update fuel bar width
var fuelRatio = fuel / FUEL_MAX;
if (fuelRatio < 0) fuelRatio = 0;
fuelBar.width = fuelBarWidth * fuelRatio;
// Show/hide and blink fuel warning icon if below/above 20%
if (fuelRatio < 0.2) {
// Blink: fade in/out using a sine wave based on LK.ticks
var blinkAlpha = 0.5 + 0.5 * Math.sin(LK.ticks * 0.2);
fuelWarningIcon.alpha = blinkAlpha;
} else {
if (fuelWarningIcon.alpha !== 0) fuelWarningIcon.alpha = 0;
}
// Fuel bar color and flash effect when low
if (fuelRatio <= 0.15) {
// Change color to bright red and flash
if (!fuelBar._isFlashing) {
fuelBar._isFlashing = true;
LK.effects.flashObject(fuelBar, 0xffffff, 200);
}
fuelBar.tint = 0xff0000;
} else if (fuelRatio <= 0.35) {
fuelBar.tint = 0xff8800;
fuelBar._isFlashing = false;
} else {
fuelBar.tint = 0xff2222;
fuelBar._isFlashing = false;
}
// Game over if fuel is empty
if (fuel <= 0) {
isGameOver = true;
LK.effects.flashScreen(0xff0000, 800);
LK.showGameOver();
return;
}
} else {
// Reset tint and flash state if not in game
if (fuelBar) {
fuelBar.tint = 0xff2222;
fuelBar._isFlashing = false;
}
// Hide fuel warning icon if not in game
if (fuelWarningIcon && fuelWarningIcon.alpha !== 0) fuelWarningIcon.alpha = 0;
}
// Yol çizgilerini hareket ettir
for (var i = 0; i < roadLines.length; i++) {
var line = roadLines[i];
line.update();
if (line.y > GAME_HEIGHT + 100) {
line.y -= 8 * 400;
}
}
// Sol ağaçları hareket ettir
for (var i = 0; i < leftTrees.length; i++) {
var tree = leftTrees[i];
tree.update();
if (tree.y > GAME_HEIGHT + 100) {
tree.y -= 8 * 400;
}
}
// Sağ ağaçları hareket ettir
for (var i = 0; i < rightTrees.length; i++) {
var tree = rightTrees[i];
tree.update();
if (tree.y > GAME_HEIGHT + 100) {
tree.y -= 8 * 400;
}
}
// Sol ağaç altı bölgeleri hareket ettir
for (var i = 0; i < leftTreeZones.length; i++) {
var zone = leftTreeZones[i];
zone.update();
if (zone.y > GAME_HEIGHT + 100) {
zone.y -= 8 * 400;
}
}
// Sağ ağaç altı bölgeleri hareket ettir
for (var i = 0; i < rightTreeZones.length; i++) {
var zone = rightTreeZones[i];
zone.update();
if (zone.y > GAME_HEIGHT + 100) {
zone.y -= 8 * 400;
}
}
// Engelleri hareket ettir
for (var i = enemyCars.length - 1; i >= 0; i--) {
var enemy = enemyCars[i];
enemy.update();
// Ekrandan çıktıysa sil
if (enemy.direction === 1 && enemy.y > GAME_HEIGHT + 200 || enemy.direction === -1 && enemy.y < -200) {
enemy.destroy();
enemyCars.splice(i, 1);
continue;
}
// Çarpışma kontrolü
if (checkCollision(player, enemy)) {
isGameOver = true;
// Çarpışma anında oyuncu arabasına görsel efekt uygula
LK.effects.flashObject(player, 0xff0000, 800);
LK.effects.flashScreen(0xff0000, 800);
LK.showGameOver();
return;
}
}
// Arkadan kovalayan düşman araba hareketi ve çarpışma
chaserCar.x = player.x;
chaserCar.targetY = player.y + 600 - distance / 10; // Mesafe arttıkça yaklaşsın
if (chaserCar.targetY < player.y + 200) chaserCar.targetY = player.y + 200; // Minimum mesafe
chaserCar.update();
// Çarpışma kontrolü (chaserCar)
if (checkCollision(player, chaserCar)) {
isGameOver = true;
LK.effects.flashObject(player, 0xff0000, 800);
LK.effects.flashScreen(0xff0000, 800);
LK.showGameOver();
return;
}
// Nitro spawn ve hareket
nitroSpawnTick++;
if (nitroSpawnTick >= NITRO_SPAWN_INTERVAL) {
nitroSpawnTick = 0;
// Rastgele bir şeride nitro koy
var lane = Math.floor(Math.random() * LANE_COUNT);
var nitro = new Nitro();
nitro.x = LANE_X[lane];
nitro.y = -150;
nitro.lane = lane;
game.addChild(nitro);
nitros.push(nitro);
}
// Nitro'ları hareket ettir ve topla
for (var i = nitros.length - 1; i >= 0; i--) {
var n = nitros[i];
n.update();
if (n.y > GAME_HEIGHT + 200) {
n.destroy();
nitros.splice(i, 1);
continue;
}
// Toplama kontrolü
if (!nitroActive && checkCollision(player, n)) {
nitroActive = true;
nitroTimer = NITRO_DURATION;
playerSpeedBoost = 18; // Hız artışı
// Nitro alınca benzin azalsın
fuel -= 200;
if (fuel < 0) fuel = 0;
n.destroy();
nitros.splice(i, 1);
// Görsel efekt: arabayı maviye flashla
LK.effects.flashObject(player, 0x00cfff, 400);
continue;
}
}
// --- FuelCan spawn ve hareket ---
fuelCanSpawnTick++;
if (fuelCanSpawnTick >= FUELCAN_SPAWN_INTERVAL) {
fuelCanSpawnTick = 0;
// Rastgele bir şeride benzin koy
var lane = Math.floor(Math.random() * LANE_COUNT);
var fuelCan = new FuelCan();
fuelCan.x = LANE_X[lane];
fuelCan.y = -120;
fuelCan.lane = lane;
game.addChild(fuelCan);
fuelCans.push(fuelCan);
}
// FuelCan'ları hareket ettir ve topla
for (var i = fuelCans.length - 1; i >= 0; i--) {
var f = fuelCans[i];
f.update();
if (f.y > GAME_HEIGHT + 200) {
f.destroy();
fuelCans.splice(i, 1);
continue;
}
// Toplama kontrolü
if (checkCollision(player, f)) {
// Yakıtı artır, maksimumu geçmesin
fuel += FUELCAN_AMOUNT;
if (fuel > FUEL_MAX) fuel = FUEL_MAX;
// Görsel efekt: fuel barı beyaza flashla
LK.effects.flashObject(fuelBar, 0xffffff, 200);
f.destroy();
fuelCans.splice(i, 1);
continue;
}
}
// Nitro etkisi
if (nitroActive) {
nitroTimer--;
if (nitroTimer > 0) {
// Hızlı ilerle: yol, ağaçlar, düşmanlar, chaserCar daha hızlı hareket eder
for (var i = 0; i < roadLines.length; i++) roadLines[i].y += playerSpeedBoost;
for (var i = 0; i < leftTrees.length; i++) leftTrees[i].y += playerSpeedBoost;
for (var i = 0; i < rightTrees.length; i++) rightTrees[i].y += playerSpeedBoost;
for (var i = 0; i < leftTreeZones.length; i++) leftTreeZones[i].y += playerSpeedBoost;
for (var i = 0; i < rightTreeZones.length; i++) rightTreeZones[i].y += playerSpeedBoost;
for (var i = 0; i < enemyCars.length; i++) enemyCars[i].y += playerSpeedBoost;
chaserCar.y += playerSpeedBoost * 0.7;
// Araba kadrajdan çıkmasın: player.y görsel olarak ileri kayarken sınırla
var playerVisualMove = playerSpeedBoost * 0.5;
var playerMinY = 300 + player.height / 2; // Üst sınır (ekranda kalacak şekilde)
var playerMaxY = GAME_HEIGHT - 500; // Alt sınır (başlangıç pozisyonu)
var newPlayerY = player.y + playerVisualMove;
if (newPlayerY < playerMinY) {
player.y = playerMinY;
} else if (newPlayerY > playerMaxY) {
player.y = playerMaxY;
} else {
player.y = newPlayerY;
}
distance += Math.floor(playerSpeedBoost * 0.7);
} else {
nitroActive = false;
playerSpeedBoost = 0;
}
} else {
// Nitro aktif değilse hiçbir blur overlay kodu çalışmasın
}
// Yeni engel oluştur
enemySpawnTick++;
var currentSpawnInterval = getEnemySpawnInterval();
if (enemySpawnTick >= currentSpawnInterval) {
enemySpawnTick = 0;
// Rastgele bir veya iki şeride engel koy
var lanes = [0, 1, 2, 3];
// %60 tek araba, %40 iki araba
var count = Math.random() < 0.6 ? 1 : 2;
for (var j = 0; j < count; j++) {
if (lanes.length === 0) break;
var idx = Math.floor(Math.random() * lanes.length);
var lane = lanes[idx];
lanes.splice(idx, 1);
var enemy = new EnemyCar();
enemy.x = LANE_X[lane];
// Soldaki iki şerit (0 ve 1) için de aşağı doğru giden araba oluştur
enemy.y = -200;
enemy.direction = 1; // Aşağı hareket
game.addChild(enemy);
enemyCars.push(enemy);
}
}
};
// Oyun yeniden başlatıldığında sıfırla
game.on('reset', function () {
// Arabaları ve çizgileri sil
for (var i = 0; i < enemyCars.length; i++) {
enemyCars[i].destroy();
}
enemyCars = [];
// Nitro'ları sil
for (var i = 0; i < nitros.length; i++) {
nitros[i].destroy();
}
nitros = [];
// ChaserCar'ı sıfırla
chaserCar.x = player.x;
chaserCar.y = GAME_HEIGHT + 400;
chaserCar.targetY = player.y + 600;
nitroActive = false;
nitroTimer = 0;
playerSpeedBoost = 0;
distance = 0;
scoreTxt.setText('0');
isGameOver = false;
player.lane = 1;
player.x = LANE_X[1];
player.y = GAME_HEIGHT - 500;
updateHighScore();
// --- Reset fuel ---
fuel = FUEL_MAX;
fuelBar.width = fuelBarWidth;
// Menüye geri dön
isMenu = true;
isCarSelect = false;
if (menuOverlay) menuOverlay.visible = true;
// Reset car selection to default
selectedPlayerCarAsset = 'playerCar';
selectedEnemyCarAssets = [];
// Müzik başlat (menüde)
});
Peugeot pars arkasi ama yukaridan. In-Game asset. 2d. High contrast. No shadows
Bmw e60 arkasi ama yukaridan. In-Game asset. 2d. High contrast. No shadows
Renault l90 arkasi ama yukaridan. In-Game asset. 2d. High contrast. No shadows
Gri Dodge challenger 2014 arkasi ama yukaridan. In-Game asset. 2d. High contrast. No shadows
Beyaz Peugeot 405 arkasi ama yukaridan. In-Game asset. 2d. High contrast. No shadows
Kirmizi Irankhodro samand arkasi ama yukaridan. In-Game asset. 2d. High contrast. No shadows
Beyaz saipa pride 131 arkasi ama yukaridan. In-Game asset. 2d. High contrast. No shadows
Turuncu mazda rx7 arkasi ama yukaridan In-Game asset. 2d. High contrast. No shadows
Cheverleot camaro ss arkasi ama yukaridan In-Game asset. 2d. High contrast. No shadows
Yeni porche 911 arkasi ama yukaridan In-Game asset. 2d. High contrast. No shadows
Yeni ford mustang arkasi ama yukaridan In-Game asset. 2d. High contrast. No shadows
Citroen xantia arkasi ama yukaridan In-Game asset. 2d. High contrast. No shadows
Zamyad neysan arkasi ama yukaridan In-Game asset. 2d. High contrast. No shadows
Lambirghini aventador arkasi ama yukaridan In-Game asset. 2d. High contrast. No shadows
Gri mercedes benz cls arkasi ama yukaridan In-Game asset. 2d. High contrast. No shadows
Acik mavi Bmw m4 arkasi ama yukaridan In-Game asset. 2d. High contrast. No shadows
Usntunde play yazan araba temali mavi bir dugme. In-Game asset. 2d. High contrast. No shadows
Car yazili araba temali turuncu ve daire bir dugme. In-Game asset. 2d. High contrast. No shadows
Mavi ve asiri Spor olarak ozellestirilmis bir peugeot 206 arkasi ama yukaridan. In-Game asset. 2d. High contrast. No shadows
Tam olarak yukaridan gorunen seritsiz duz bir yol. In-Game asset. 2d. High contrast. No shadows
Modern sokak lambasi. In-Game asset. 2d. High contrast. No shadows
Nitro. In-Game asset. 2d. High contrast. No shadows
Kirmizi benzin bidonu. In-Game asset. 2d. High contrast. No shadows
Altinda arka plansiz "very little gasoline" yazan kirmizi ünlem isareti. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat