/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ // Engel (ör: taş) var Engel = Container.expand(function () { var self = Container.call(this); var engel = self.attachAsset('engel', { anchorX: 0.5, anchorY: 0.5 }); self.lane = 1; self.speed = 0; self.lastIntersecting = false; return self; }); // Kömür (toplanacak obje) var Komur = Container.expand(function () { var self = Container.call(this); var komur = self.attachAsset('komur', { anchorX: 0.5, anchorY: 0.5 }); // Şerit (0,1,2) self.lane = 1; // Hız self.speed = 0; // Son çarpışma durumu self.lastIntersecting = false; return self; }); // Vagon ve köpek karakteri var VagonKopek = Container.expand(function () { var self = Container.call(this); // Vagon var vagon = self.attachAsset('vagon', { anchorX: 0.5, anchorY: 0.5, y: 40 }); // Köpek var kopek = self.attachAsset('kopek', { anchorX: 0.5, anchorY: 1, y: -20 }); // Şerit (0: sol, 1: orta, 2: sağ) self.lane = 1; // Hareket animasyonu sırasında başka hareketi engelle self.isMoving = false; // Hedef şerit self.targetLane = 1; // Şerit pozisyonlarını hesapla self.getLaneX = function (lane) { // 3 şerit: sol, orta, sağ var lanes = [512, 1024, 1536]; return lanes[lane]; }; // Şeride geçiş animasyonu self.moveToLane = function (lane) { if (self.isMoving || lane < 0 || lane > 2) return; self.isMoving = true; self.targetLane = lane; tween(self, { x: self.getLaneX(lane) }, { duration: 180, easing: tween.cubicOut, onFinish: function onFinish() { self.lane = lane; self.isMoving = false; } }); }; // Başlangıç pozisyonu self.x = self.getLaneX(1); self.y = 2100; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x181c24 // Koyu mağara rengi }); /**** * Game Code ****/ // Ray (zemin) - sadece görsel amaçlı // Kömür vagonu (vagon) - ana karakter // Köpek (vagonun üstünde) // Kömür (toplanacak) // Engel (ör: taş) // Ray (zemin) var ray = LK.getAsset('ray', { anchorX: 0, anchorY: 0.5, x: 0, y: 2200 }); game.addChild(ray); // Ana karakteri oluştur var vagonKopek = new VagonKopek(); game.addChild(vagonKopek); // Skor var score = 0; var scoreTxt = new Text2('0', { size: 120, fill: 0xFFFFFF }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); // Oyun hızı (her tick'te objelerin aşağıya kayma hızı) var baseSpeed = 13; var speed = baseSpeed; var maxSpeed = 38; var speedIncreaseInterval = 600; // Her 600 tick'te hız artar (~10sn) var lastSpeedUpTick = 0; // Objeler var komurler = []; var engeller = []; // Spawn zamanlayıcıları var komurSpawnTick = 0; var engelSpawnTick = 0; var komurSpawnInterval = 60; // 1 sn var engelSpawnInterval = 90; // 1.5 sn // Oyun alanı şeritleri (0: sol, 1: orta, 2: sağ) function getLaneX(lane) { var lanes = [512, 1024, 1536]; return lanes[lane]; } // Ekran dışı kontrolü function isOutOfScreen(obj) { return obj.y > 2800; } // Oyun bitti mi? var isGameOver = false; // Hareket kontrolü (sağa/sola kaydırma) var touchStartX = null; var touchStartY = null; var touchActive = false; var swipeThreshold = 80; // px // Ekrana dokunulduğunda game.down = function (x, y, obj) { if (isGameOver) return; touchStartX = x; touchStartY = y; touchActive = true; }; // Parmağı kaydırırken game.move = function (x, y, obj) { if (isGameOver) return; if (!touchActive) return; if (touchStartX === null) return; var dx = x - touchStartX; var dy = y - touchStartY; // Yalnızca yatay kaydırma if (Math.abs(dx) > swipeThreshold && Math.abs(dx) > Math.abs(dy)) { if (dx > 0 && vagonKopek.lane < 2) { vagonKopek.moveToLane(vagonKopek.lane + 1); } else if (dx < 0 && vagonKopek.lane > 0) { vagonKopek.moveToLane(vagonKopek.lane - 1); } touchActive = false; // Bir kaydırmada bir hareket } }; // Parmağı kaldırınca game.up = function (x, y, obj) { touchStartX = null; touchStartY = null; touchActive = false; }; // Oyun güncelleme döngüsü game.update = function () { if (isGameOver) return; // Hız artırma if (LK.ticks - lastSpeedUpTick > speedIncreaseInterval && speed < maxSpeed) { speed += 1.5; lastSpeedUpTick = LK.ticks; } // Kömür spawn if (LK.ticks - komurSpawnTick > komurSpawnInterval) { var lane = Math.floor(Math.random() * 3); var komur = new Komur(); komur.lane = lane; komur.x = getLaneX(lane); komur.y = -100; komur.speed = speed; komurler.push(komur); game.addChild(komur); komurSpawnTick = LK.ticks; } // Engel spawn if (LK.ticks - engelSpawnTick > engelSpawnInterval) { var lane = Math.floor(Math.random() * 3); var engel = new Engel(); engel.lane = lane; engel.x = getLaneX(lane); engel.y = -160; engel.speed = speed; engeller.push(engel); game.addChild(engel); engelSpawnTick = LK.ticks; } // Kömürleri güncelle for (var i = komurler.length - 1; i >= 0; i--) { var komur = komurler[i]; komur.y += komur.speed; var intersecting = vagonKopek.intersects(komur); if (!komur.lastIntersecting && intersecting) { // Toplandı score += 1; LK.setScore(score); scoreTxt.setText(score); LK.effects.flashObject(komur, 0xffff00, 200); komur.destroy(); komurler.splice(i, 1); continue; } if (isOutOfScreen(komur)) { komur.destroy(); komurler.splice(i, 1); continue; } komur.lastIntersecting = intersecting; } // Engelleri güncelle for (var j = engeller.length - 1; j >= 0; j--) { var engel = engeller[j]; engel.y += engel.speed; var intersecting = vagonKopek.intersects(engel); if (!engel.lastIntersecting && intersecting) { // Oyun bitti isGameOver = true; LK.effects.flashScreen(0xff0000, 800); LK.showGameOver(); return; } if (isOutOfScreen(engel)) { engel.destroy(); engeller.splice(j, 1); continue; } engel.lastIntersecting = intersecting; } }; // Skoru başlat LK.setScore(0); scoreTxt.setText(0);
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// Engel (ör: taş)
var Engel = Container.expand(function () {
var self = Container.call(this);
var engel = self.attachAsset('engel', {
anchorX: 0.5,
anchorY: 0.5
});
self.lane = 1;
self.speed = 0;
self.lastIntersecting = false;
return self;
});
// Kömür (toplanacak obje)
var Komur = Container.expand(function () {
var self = Container.call(this);
var komur = self.attachAsset('komur', {
anchorX: 0.5,
anchorY: 0.5
});
// Şerit (0,1,2)
self.lane = 1;
// Hız
self.speed = 0;
// Son çarpışma durumu
self.lastIntersecting = false;
return self;
});
// Vagon ve köpek karakteri
var VagonKopek = Container.expand(function () {
var self = Container.call(this);
// Vagon
var vagon = self.attachAsset('vagon', {
anchorX: 0.5,
anchorY: 0.5,
y: 40
});
// Köpek
var kopek = self.attachAsset('kopek', {
anchorX: 0.5,
anchorY: 1,
y: -20
});
// Şerit (0: sol, 1: orta, 2: sağ)
self.lane = 1;
// Hareket animasyonu sırasında başka hareketi engelle
self.isMoving = false;
// Hedef şerit
self.targetLane = 1;
// Şerit pozisyonlarını hesapla
self.getLaneX = function (lane) {
// 3 şerit: sol, orta, sağ
var lanes = [512, 1024, 1536];
return lanes[lane];
};
// Şeride geçiş animasyonu
self.moveToLane = function (lane) {
if (self.isMoving || lane < 0 || lane > 2) return;
self.isMoving = true;
self.targetLane = lane;
tween(self, {
x: self.getLaneX(lane)
}, {
duration: 180,
easing: tween.cubicOut,
onFinish: function onFinish() {
self.lane = lane;
self.isMoving = false;
}
});
};
// Başlangıç pozisyonu
self.x = self.getLaneX(1);
self.y = 2100;
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x181c24 // Koyu mağara rengi
});
/****
* Game Code
****/
// Ray (zemin) - sadece görsel amaçlı
// Kömür vagonu (vagon) - ana karakter
// Köpek (vagonun üstünde)
// Kömür (toplanacak)
// Engel (ör: taş)
// Ray (zemin)
var ray = LK.getAsset('ray', {
anchorX: 0,
anchorY: 0.5,
x: 0,
y: 2200
});
game.addChild(ray);
// Ana karakteri oluştur
var vagonKopek = new VagonKopek();
game.addChild(vagonKopek);
// Skor
var score = 0;
var scoreTxt = new Text2('0', {
size: 120,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Oyun hızı (her tick'te objelerin aşağıya kayma hızı)
var baseSpeed = 13;
var speed = baseSpeed;
var maxSpeed = 38;
var speedIncreaseInterval = 600; // Her 600 tick'te hız artar (~10sn)
var lastSpeedUpTick = 0;
// Objeler
var komurler = [];
var engeller = [];
// Spawn zamanlayıcıları
var komurSpawnTick = 0;
var engelSpawnTick = 0;
var komurSpawnInterval = 60; // 1 sn
var engelSpawnInterval = 90; // 1.5 sn
// Oyun alanı şeritleri (0: sol, 1: orta, 2: sağ)
function getLaneX(lane) {
var lanes = [512, 1024, 1536];
return lanes[lane];
}
// Ekran dışı kontrolü
function isOutOfScreen(obj) {
return obj.y > 2800;
}
// Oyun bitti mi?
var isGameOver = false;
// Hareket kontrolü (sağa/sola kaydırma)
var touchStartX = null;
var touchStartY = null;
var touchActive = false;
var swipeThreshold = 80; // px
// Ekrana dokunulduğunda
game.down = function (x, y, obj) {
if (isGameOver) return;
touchStartX = x;
touchStartY = y;
touchActive = true;
};
// Parmağı kaydırırken
game.move = function (x, y, obj) {
if (isGameOver) return;
if (!touchActive) return;
if (touchStartX === null) return;
var dx = x - touchStartX;
var dy = y - touchStartY;
// Yalnızca yatay kaydırma
if (Math.abs(dx) > swipeThreshold && Math.abs(dx) > Math.abs(dy)) {
if (dx > 0 && vagonKopek.lane < 2) {
vagonKopek.moveToLane(vagonKopek.lane + 1);
} else if (dx < 0 && vagonKopek.lane > 0) {
vagonKopek.moveToLane(vagonKopek.lane - 1);
}
touchActive = false; // Bir kaydırmada bir hareket
}
};
// Parmağı kaldırınca
game.up = function (x, y, obj) {
touchStartX = null;
touchStartY = null;
touchActive = false;
};
// Oyun güncelleme döngüsü
game.update = function () {
if (isGameOver) return;
// Hız artırma
if (LK.ticks - lastSpeedUpTick > speedIncreaseInterval && speed < maxSpeed) {
speed += 1.5;
lastSpeedUpTick = LK.ticks;
}
// Kömür spawn
if (LK.ticks - komurSpawnTick > komurSpawnInterval) {
var lane = Math.floor(Math.random() * 3);
var komur = new Komur();
komur.lane = lane;
komur.x = getLaneX(lane);
komur.y = -100;
komur.speed = speed;
komurler.push(komur);
game.addChild(komur);
komurSpawnTick = LK.ticks;
}
// Engel spawn
if (LK.ticks - engelSpawnTick > engelSpawnInterval) {
var lane = Math.floor(Math.random() * 3);
var engel = new Engel();
engel.lane = lane;
engel.x = getLaneX(lane);
engel.y = -160;
engel.speed = speed;
engeller.push(engel);
game.addChild(engel);
engelSpawnTick = LK.ticks;
}
// Kömürleri güncelle
for (var i = komurler.length - 1; i >= 0; i--) {
var komur = komurler[i];
komur.y += komur.speed;
var intersecting = vagonKopek.intersects(komur);
if (!komur.lastIntersecting && intersecting) {
// Toplandı
score += 1;
LK.setScore(score);
scoreTxt.setText(score);
LK.effects.flashObject(komur, 0xffff00, 200);
komur.destroy();
komurler.splice(i, 1);
continue;
}
if (isOutOfScreen(komur)) {
komur.destroy();
komurler.splice(i, 1);
continue;
}
komur.lastIntersecting = intersecting;
}
// Engelleri güncelle
for (var j = engeller.length - 1; j >= 0; j--) {
var engel = engeller[j];
engel.y += engel.speed;
var intersecting = vagonKopek.intersects(engel);
if (!engel.lastIntersecting && intersecting) {
// Oyun bitti
isGameOver = true;
LK.effects.flashScreen(0xff0000, 800);
LK.showGameOver();
return;
}
if (isOutOfScreen(engel)) {
engel.destroy();
engeller.splice(j, 1);
continue;
}
engel.lastIntersecting = intersecting;
}
};
// Skoru başlat
LK.setScore(0);
scoreTxt.setText(0);