/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ // Oyuncu arabası var Car = Container.expand(function () { var self = Container.call(this); var carAsset = self.attachAsset('car', { anchorX: 0.5, anchorY: 0.5 }); self.width = carAsset.width; self.height = carAsset.height; // Hareket limiti (ekran dışına çıkmasın) self.minX = self.width / 2 + 40; self.maxX = 2048 - self.width / 2 - 40; // Arabayı verilen x konumuna kaydır self.moveToX = function (targetX) { // Sınırlar içinde tut if (targetX < self.minX) targetX = self.minX; if (targetX > self.maxX) targetX = self.maxX; // Tween ile yumuşak kaydır tween.stop(self, { x: true }); tween(self, { x: targetX }, { duration: 180, easing: tween.cubicOut }); }; return self; }); // Yol çizgisi (dekoratif) 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.speed = 12; self.update = function () { self.y += self.speed; }; return self; }); var ObstacleBar = Container.expand(function () { var self = Container.call(this); var obsAsset = self.attachAsset('obstacle_bar', { anchorX: 0.5, anchorY: 0.5 }); self.width = obsAsset.width; self.height = obsAsset.height; self.type = "bar"; self.speed = 12; self.update = function () { self.y += self.speed; }; return self; }); // Kırmızı kutu engel (klasik) var ObstacleBox = 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; self.type = "box"; self.speed = 12; self.update = function () { self.y += self.speed; }; return self; }); // Daire engel (yuvarlak, farklı renk) var ObstacleCircle = Container.expand(function () { var self = Container.call(this); var obsAsset = self.attachAsset('obstacle_circle', { anchorX: 0.5, anchorY: 0.5 }); self.width = obsAsset.width; self.height = obsAsset.height; self.type = "circle"; self.speed = 12; self.update = function () { self.y += self.speed; }; return self; }); /**** * Initialize Game ****/ // Uzun dikdörtgen engel (bariyer) var game = new LK.Game({ backgroundColor: 0x222222 }); /**** * Game Code ****/ // Uzun dikdörtgen engel (bariyer) // Daire engel (yuvarlak, farklı renk) // Yol çizgisi için ince kutu // Engeller için kutu şeklinde bir asset // Araba (oyuncu) için kutu şeklinde bir asset // Oyun alanı: 2048x2732 // Pist genişliği (kenarlardan boşluk bırak) var trackMargin = 220; var trackWidth = 2048 - 2 * trackMargin; // Şerit çizgileri için var laneCount = 3; var laneX = []; for (var i = 0; i < laneCount; i++) { laneX[i] = trackMargin + (i + 0.5) * (trackWidth / laneCount); } // Arabayı başlat var car = new Car(); car.x = laneX[1]; // Ortadaki şerit car.y = 2732 - 400; game.addChild(car); // Skor var score = 0; var scoreTxt = new Text2('0', { size: 120, fill: "#fff" }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); // Engeller ve yol çizgileri dizileri var obstacles = []; var lanes = []; // Yol çizgileri için özel bir container (her zaman en altta olacak) var laneContainer = new Container(); game.addChild(laneContainer); // Oyun sahnesinin en altına ekle // Oyun hızı ve zorluk var baseSpeed = 12; var speed = baseSpeed; var fastSpeed = 32; // Nitro ile gidecek hız var spawnInterval = 60; // Kaç frame'de bir engel gelsin var laneSpawnInterval = 36; // Yol çizgisi aralığı var ticksSinceLastObstacle = 0; var ticksSinceLastLane = 0; // Oyun bitti mi? var isGameOver = false; // Basılı tutma kontrolü var isPressing = false; // Yol çizgilerini başlat for (var i = 0; i < laneCount; i++) { for (var j = 0; j < 6; j++) { var lane = new Lane(); lane.x = laneX[i]; lane.y = j * 500 + 200; lanes.push(lane); laneContainer.addChild(lane); } } // Hareket kontrolü (sürükleme veya dokunulan yere kayma) var dragActive = false; var dragOffsetX = 0; // Oyun alanı dışında kalan engelleri ve çizgileri sil function cleanupObstaclesAndLanes() { for (var i = obstacles.length - 1; i >= 0; i--) { if (obstacles[i].y - obstacles[i].height / 2 > 2732 + 100) { obstacles[i].destroy(); obstacles.splice(i, 1); } } for (var i = lanes.length - 1; i >= 0; i--) { if (lanes[i].y - lanes[i].height / 2 > 2732 + 100) { lanes[i].destroy(); lanes.splice(i, 1); } } } // Oyun güncelleme fonksiyonu game.update = function () { if (isGameOver) return; // Hız sabit, skor arttıkça artar if (isPressing) { speed = fastSpeed; } else { speed = baseSpeed + Math.floor(score / 600) * 1.5; if (speed > 32) speed = 32; } // Engelleri ve yol çizgilerini hareket ettir for (var i = 0; i < obstacles.length; i++) { obstacles[i].speed = speed; obstacles[i].update(); } for (var i = 0; i < lanes.length; i++) { lanes[i].speed = speed; lanes[i].update(); } // Engelleri ve çizgileri temizle cleanupObstaclesAndLanes(); // Yeni engel oluştur ticksSinceLastObstacle++; if (ticksSinceLastObstacle >= spawnInterval) { ticksSinceLastObstacle = 0; // Rastgele bir şeride engel koy, farklı tiplerden seç var laneIdx = Math.floor(Math.random() * laneCount); var obsTypeRand = Math.random(); var obs; if (obsTypeRand < 0.5) { obs = new ObstacleBox(); } else if (obsTypeRand < 0.8) { obs = new ObstacleCircle(); } else { obs = new ObstacleBar(); // Bariyer engelini iki şeride yaymak için ortadaki şeritte çıkarsa, biraz sola/sağa kaydır if (laneIdx == 0) obs.x = laneX[0] + (laneX[1] - laneX[0]) / 2;else if (laneIdx == 2) obs.x = laneX[2] - (laneX[2] - laneX[1]) / 2;else obs.x = laneX[1]; } if (!obs.x) obs.x = laneX[laneIdx]; obs.y = -obs.height / 2 - 40; obs.speed = speed; obstacles.push(obs); game.addChild(obs); } // Yeni yol çizgisi oluştur ticksSinceLastLane++; if (ticksSinceLastLane >= laneSpawnInterval) { ticksSinceLastLane = 0; for (var i = 0; i < laneCount; i++) { var lane = new Lane(); lane.x = laneX[i]; lane.y = -lane.height / 2; lane.speed = speed; lanes.push(lane); laneContainer.addChild(lane); } } // Skor: her frame biraz artar (hayatta kalma süresi) score += 1; scoreTxt.setText(score); // Zorluk: skor arttıkça hız ve engel sıklığı artsın if (score % 600 == 0 && !isPressing && speed < 32) { speed += 1.5; if (spawnInterval > 28) spawnInterval -= 2; } // Çarpışma kontrolü for (var i = 0; i < obstacles.length; i++) { if (car.intersects(obstacles[i])) { isGameOver = true; LK.effects.flashScreen(0xff0000, 800); LK.showGameOver(); return; } } }; // Oyun alanında dokunma veya sürükleme ile araba kontrolü function getNearestLaneX(x) { // En yakın şerit merkezini bul var minDist = 99999; var bestX = laneX[0]; for (var i = 0; i < laneCount; i++) { var dist = Math.abs(x - laneX[i]); if (dist < minDist) { minDist = dist; bestX = laneX[i]; } } return bestX; } // Sürükleme başlat game.down = function (x, y, obj) { isPressing = true; // Basılı tutuluyor // Arabaya dokunulduysa sürükleme başlat if (Math.abs(x - car.x) < car.width / 2 + 40 && Math.abs(y - car.y) < car.height / 2 + 40) { dragActive = true; dragOffsetX = car.x - x; } else { // Pistte bir yere dokunulduysa arabayı o şeride kaydır var targetX = getNearestLaneX(x); car.moveToX(targetX); } }; // Sürükleme devamı game.move = function (x, y, obj) { if (dragActive) { var newX = x + dragOffsetX; car.moveToX(newX); } }; // Sürükleme bırakıldı game.up = function (x, y, obj) { dragActive = false; isPressing = false; // Basılı tutma bitti }; /**** END OF FILE ****/
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// Oyuncu arabası
var Car = Container.expand(function () {
var self = Container.call(this);
var carAsset = self.attachAsset('car', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = carAsset.width;
self.height = carAsset.height;
// Hareket limiti (ekran dışına çıkmasın)
self.minX = self.width / 2 + 40;
self.maxX = 2048 - self.width / 2 - 40;
// Arabayı verilen x konumuna kaydır
self.moveToX = function (targetX) {
// Sınırlar içinde tut
if (targetX < self.minX) targetX = self.minX;
if (targetX > self.maxX) targetX = self.maxX;
// Tween ile yumuşak kaydır
tween.stop(self, {
x: true
});
tween(self, {
x: targetX
}, {
duration: 180,
easing: tween.cubicOut
});
};
return self;
});
// Yol çizgisi (dekoratif)
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.speed = 12;
self.update = function () {
self.y += self.speed;
};
return self;
});
var ObstacleBar = Container.expand(function () {
var self = Container.call(this);
var obsAsset = self.attachAsset('obstacle_bar', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = obsAsset.width;
self.height = obsAsset.height;
self.type = "bar";
self.speed = 12;
self.update = function () {
self.y += self.speed;
};
return self;
});
// Kırmızı kutu engel (klasik)
var ObstacleBox = 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;
self.type = "box";
self.speed = 12;
self.update = function () {
self.y += self.speed;
};
return self;
});
// Daire engel (yuvarlak, farklı renk)
var ObstacleCircle = Container.expand(function () {
var self = Container.call(this);
var obsAsset = self.attachAsset('obstacle_circle', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = obsAsset.width;
self.height = obsAsset.height;
self.type = "circle";
self.speed = 12;
self.update = function () {
self.y += self.speed;
};
return self;
});
/****
* Initialize Game
****/
// Uzun dikdörtgen engel (bariyer)
var game = new LK.Game({
backgroundColor: 0x222222
});
/****
* Game Code
****/
// Uzun dikdörtgen engel (bariyer)
// Daire engel (yuvarlak, farklı renk)
// Yol çizgisi için ince kutu
// Engeller için kutu şeklinde bir asset
// Araba (oyuncu) için kutu şeklinde bir asset
// Oyun alanı: 2048x2732
// Pist genişliği (kenarlardan boşluk bırak)
var trackMargin = 220;
var trackWidth = 2048 - 2 * trackMargin;
// Şerit çizgileri için
var laneCount = 3;
var laneX = [];
for (var i = 0; i < laneCount; i++) {
laneX[i] = trackMargin + (i + 0.5) * (trackWidth / laneCount);
}
// Arabayı başlat
var car = new Car();
car.x = laneX[1]; // Ortadaki şerit
car.y = 2732 - 400;
game.addChild(car);
// Skor
var score = 0;
var scoreTxt = new Text2('0', {
size: 120,
fill: "#fff"
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Engeller ve yol çizgileri dizileri
var obstacles = [];
var lanes = [];
// Yol çizgileri için özel bir container (her zaman en altta olacak)
var laneContainer = new Container();
game.addChild(laneContainer); // Oyun sahnesinin en altına ekle
// Oyun hızı ve zorluk
var baseSpeed = 12;
var speed = baseSpeed;
var fastSpeed = 32; // Nitro ile gidecek hız
var spawnInterval = 60; // Kaç frame'de bir engel gelsin
var laneSpawnInterval = 36; // Yol çizgisi aralığı
var ticksSinceLastObstacle = 0;
var ticksSinceLastLane = 0;
// Oyun bitti mi?
var isGameOver = false;
// Basılı tutma kontrolü
var isPressing = false;
// Yol çizgilerini başlat
for (var i = 0; i < laneCount; i++) {
for (var j = 0; j < 6; j++) {
var lane = new Lane();
lane.x = laneX[i];
lane.y = j * 500 + 200;
lanes.push(lane);
laneContainer.addChild(lane);
}
}
// Hareket kontrolü (sürükleme veya dokunulan yere kayma)
var dragActive = false;
var dragOffsetX = 0;
// Oyun alanı dışında kalan engelleri ve çizgileri sil
function cleanupObstaclesAndLanes() {
for (var i = obstacles.length - 1; i >= 0; i--) {
if (obstacles[i].y - obstacles[i].height / 2 > 2732 + 100) {
obstacles[i].destroy();
obstacles.splice(i, 1);
}
}
for (var i = lanes.length - 1; i >= 0; i--) {
if (lanes[i].y - lanes[i].height / 2 > 2732 + 100) {
lanes[i].destroy();
lanes.splice(i, 1);
}
}
}
// Oyun güncelleme fonksiyonu
game.update = function () {
if (isGameOver) return;
// Hız sabit, skor arttıkça artar
if (isPressing) {
speed = fastSpeed;
} else {
speed = baseSpeed + Math.floor(score / 600) * 1.5;
if (speed > 32) speed = 32;
}
// Engelleri ve yol çizgilerini hareket ettir
for (var i = 0; i < obstacles.length; i++) {
obstacles[i].speed = speed;
obstacles[i].update();
}
for (var i = 0; i < lanes.length; i++) {
lanes[i].speed = speed;
lanes[i].update();
}
// Engelleri ve çizgileri temizle
cleanupObstaclesAndLanes();
// Yeni engel oluştur
ticksSinceLastObstacle++;
if (ticksSinceLastObstacle >= spawnInterval) {
ticksSinceLastObstacle = 0;
// Rastgele bir şeride engel koy, farklı tiplerden seç
var laneIdx = Math.floor(Math.random() * laneCount);
var obsTypeRand = Math.random();
var obs;
if (obsTypeRand < 0.5) {
obs = new ObstacleBox();
} else if (obsTypeRand < 0.8) {
obs = new ObstacleCircle();
} else {
obs = new ObstacleBar();
// Bariyer engelini iki şeride yaymak için ortadaki şeritte çıkarsa, biraz sola/sağa kaydır
if (laneIdx == 0) obs.x = laneX[0] + (laneX[1] - laneX[0]) / 2;else if (laneIdx == 2) obs.x = laneX[2] - (laneX[2] - laneX[1]) / 2;else obs.x = laneX[1];
}
if (!obs.x) obs.x = laneX[laneIdx];
obs.y = -obs.height / 2 - 40;
obs.speed = speed;
obstacles.push(obs);
game.addChild(obs);
}
// Yeni yol çizgisi oluştur
ticksSinceLastLane++;
if (ticksSinceLastLane >= laneSpawnInterval) {
ticksSinceLastLane = 0;
for (var i = 0; i < laneCount; i++) {
var lane = new Lane();
lane.x = laneX[i];
lane.y = -lane.height / 2;
lane.speed = speed;
lanes.push(lane);
laneContainer.addChild(lane);
}
}
// Skor: her frame biraz artar (hayatta kalma süresi)
score += 1;
scoreTxt.setText(score);
// Zorluk: skor arttıkça hız ve engel sıklığı artsın
if (score % 600 == 0 && !isPressing && speed < 32) {
speed += 1.5;
if (spawnInterval > 28) spawnInterval -= 2;
}
// Çarpışma kontrolü
for (var i = 0; i < obstacles.length; i++) {
if (car.intersects(obstacles[i])) {
isGameOver = true;
LK.effects.flashScreen(0xff0000, 800);
LK.showGameOver();
return;
}
}
};
// Oyun alanında dokunma veya sürükleme ile araba kontrolü
function getNearestLaneX(x) {
// En yakın şerit merkezini bul
var minDist = 99999;
var bestX = laneX[0];
for (var i = 0; i < laneCount; i++) {
var dist = Math.abs(x - laneX[i]);
if (dist < minDist) {
minDist = dist;
bestX = laneX[i];
}
}
return bestX;
}
// Sürükleme başlat
game.down = function (x, y, obj) {
isPressing = true; // Basılı tutuluyor
// Arabaya dokunulduysa sürükleme başlat
if (Math.abs(x - car.x) < car.width / 2 + 40 && Math.abs(y - car.y) < car.height / 2 + 40) {
dragActive = true;
dragOffsetX = car.x - x;
} else {
// Pistte bir yere dokunulduysa arabayı o şeride kaydır
var targetX = getNearestLaneX(x);
car.moveToX(targetX);
}
};
// Sürükleme devamı
game.move = function (x, y, obj) {
if (dragActive) {
var newX = x + dragOffsetX;
car.moveToX(newX);
}
};
// Sürükleme bırakıldı
game.up = function (x, y, obj) {
dragActive = false;
isPressing = false; // Basılı tutma bitti
};
/**** END OF FILE ****/