/****
* 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);