/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1", {
highScore: 0
});
/****
* Classes
****/
// Bonus
var Bonus = Container.expand(function () {
var self = Container.call(this);
var bonusGfx = self.attachAsset('bonus', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = bonusGfx.width;
self.height = bonusGfx.height;
self.speed = 0;
self.update = function () {
self.y += self.speed;
};
return self;
});
// Oyuncu arabası
var Car = Container.expand(function () {
var self = Container.call(this);
var carGfx = self.attachAsset('car', {
anchorX: 0.5,
anchorY: 0.5
});
// Arabayı merkeze hizala
self.width = carGfx.width;
self.height = carGfx.height;
// Arabaya çarpma efekti
self.flash = function () {
tween(self, {
tint: 0xffe082
}, {
duration: 120,
onFinish: function onFinish() {
tween(self, {
tint: 0xffffff
}, {
duration: 120
});
}
});
};
return self;
});
// Engel
var Obstacle = Container.expand(function () {
var self = Container.call(this);
var obsGfx = self.attachAsset('obstacle', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = obsGfx.width;
self.height = obsGfx.height;
self.speed = 0; // Her engel için hız atanacak
self.update = function () {
self.y += self.speed;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x222222
});
/****
* Game Code
****/
// Oyun alanı boyutları
var GAME_WIDTH = 2048;
var GAME_HEIGHT = 2732;
var ROAD_WIDTH = 700;
var roadX = (GAME_WIDTH - ROAD_WIDTH) / 2;
// Ana Menü ve Level Seçimi
var MENU_STATE = "menu";
var GAME_STATE = "game";
var state = GAME_STATE;
var selectedLevel = 1;
var MAX_LEVEL = 5; // 5. level sonsuz olacak
// Oyuna doğrudan başla
LK.setTimeout(function () {
startGameWithLevel(selectedLevel);
}, 0);
// Oyun arayüzü ve objeleri
var road = LK.getAsset('road', {
anchorX: 0,
anchorY: 0,
x: roadX,
y: 0
});
game.addChild(road);
var score = 0;
var highScore = storage.highScore || 0;
var bonusCount = 0; // Toplanan para sayısı
var scoreTxt = new Text2('0', {
size: 120,
fill: "#fff"
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
var bonusTxt = new Text2('Paralar: 0', {
size: 60,
fill: 0xFFE082
});
bonusTxt.anchor.set(0, 0);
// Move 60 pixels below the top
bonusTxt.y = 60;
LK.gui.top.addChild(bonusTxt);
var highScoreTxt = new Text2('En Yüksek: ' + highScore, {
size: 60,
fill: "#fff"
});
highScoreTxt.anchor.set(1, 0);
LK.gui.topRight.addChild(highScoreTxt);
var car = new Car();
car.x = GAME_WIDTH / 2;
car.y = GAME_HEIGHT - 400;
game.addChild(car);
var obstacles = [];
var bonuses = [];
// Oyun hızı ve zorluk
var baseSpeed = 16;
var speed = baseSpeed;
var spawnInterval = 80;
var bonusInterval = 180;
var ticksSinceLastObstacle = 0;
var ticksSinceLastBonus = 0;
// Level ve alan sistemi
var level = 1;
var levelArea = 1;
var levelTick = 0;
var LEVEL_TICK_LENGTH = 1200;
var AREA_LENGTH = 3;
// Level ve alan metni
var levelTxt = new Text2('Level: 1', {
size: 60,
fill: "#fff"
});
levelTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(levelTxt);
var areaTxt = new Text2('Alan: 1', {
size: 60,
fill: 0xB3E5FC
});
areaTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(areaTxt);
// Sürükleme
var dragNode = null;
var dragOffsetX = 0;
// Oyun durumu
// Basit mesaj gösterme fonksiyonu (Text2 ile ekrana ortalanmış mesaj)
function showMessage(text, opts) {
opts = opts || {};
var duration = opts.duration || 1200;
var color = opts.color || 0xffffff;
var msg = new Text2(text, {
size: 90,
fill: color
});
msg.anchor.set(0.5, 0.5);
msg.x = GAME_WIDTH / 2;
msg.y = GAME_HEIGHT / 2;
game.addChild(msg);
tween(msg, {
alpha: 0
}, {
delay: duration - 400,
duration: 400,
onFinish: function onFinish() {
msg.destroy();
}
});
}
// Oyun başlatma fonksiyonu
function startGameWithLevel(lvl) {
// Menü arayüzünü gizle
// Menü arayüzü kaldırıldığı için burada bir şey yapmaya gerek yok
// Oyun arayüzünü göster
scoreTxt.visible = true;
bonusTxt.visible = true;
highScoreTxt.visible = true;
levelTxt.visible = true;
areaTxt.visible = true;
car.visible = true;
road.visible = true;
// Level ve area ayarla
level = lvl;
levelArea = Math.floor((level - 1) / AREA_LENGTH) + 1;
levelTick = 0;
levelTxt.setText('Level: ' + (level === MAX_LEVEL ? "Sonsuz" : level));
areaTxt.setText('Alan: ' + levelArea);
// Sonsuz modda level ilerlemesi durur
if (level === MAX_LEVEL) {
LEVEL_TICK_LENGTH = Infinity;
} else {
LEVEL_TICK_LENGTH = 1200;
}
// Oyun objelerini sıfırla
for (var i = 0; i < obstacles.length; i++) obstacles[i].destroy();
for (var j = 0; j < bonuses.length; j++) bonuses[j].destroy();
obstacles = [];
bonuses = [];
score = 0;
bonusCount = 0;
bonusTxt.setText('Paralar: 0');
isGameOver = false;
car.x = GAME_WIDTH / 2;
car.y = GAME_HEIGHT - 400;
updateScore(0);
// Hız ve zorluk ayarla
baseSpeed = 16 + (level - 1) * 2;
speed = baseSpeed;
spawnInterval = Math.max(32, 80 - (level - 1) * 6);
state = GAME_STATE;
}
// Oyun bittiğinde menüye dön
// showMenu fonksiyonu ve başlangıçta menü gösterme kaldırıldı
// Skoru güncelle
function updateScore(val) {
score = val;
scoreTxt.setText(score);
if (score > highScore) {
highScore = score;
storage.highScore = highScore;
highScoreTxt.setText('En Yüksek: ' + highScore);
}
}
// Arabayı sürükleme
function handleMove(x, y, obj) {
if (dragNode) {
// Arabayı sadece yolun içinde hareket ettir
var minX = roadX + dragNode.width / 2;
var maxX = roadX + ROAD_WIDTH - dragNode.width / 2;
var newX = x - dragOffsetX;
if (newX < minX) newX = minX;
if (newX > maxX) newX = maxX;
dragNode.x = newX;
}
}
game.move = handleMove;
game.down = function (x, y, obj) {
// Arabaya dokunulduysa sürüklemeye başla
if (x >= car.x - car.width / 2 && x <= car.x + car.width / 2 && y >= car.y - car.height / 2 && y <= car.y + car.height / 2) {
dragNode = car;
dragOffsetX = x - car.x;
}
};
game.up = function (x, y, obj) {
dragNode = null;
};
// Oyun güncelleme döngüsü
game.update = function () {
if (state === MENU_STATE) {
// Menüdeyken oyun güncellenmez
return;
}
if (isGameOver) return;
// Level ve alan sistemi
if (level !== MAX_LEVEL) {
levelTick++;
if (levelTick >= LEVEL_TICK_LENGTH) {
levelTick = 0;
level += 1;
levelTxt.setText('Level: ' + level);
// Alan değişimi
if ((level - 1) % AREA_LENGTH === 0 && level !== 1) {
levelArea += 1;
areaTxt.setText('Alan: ' + levelArea);
LK.effects.flashScreen(0x00bcd4, 600);
}
// Sonsuz moda geçiş
if (level === MAX_LEVEL) {
levelTxt.setText('Level: Sonsuz');
LEVEL_TICK_LENGTH = Infinity;
}
}
}
// Zorluk: Level arttıkça hız ve engel sıklığı artar
if (level !== MAX_LEVEL) {
speed = baseSpeed + (level - 1) * 2;
spawnInterval = Math.max(32, 80 - (level - 1) * 6);
} else {
speed = baseSpeed + (MAX_LEVEL - 1) * 2;
spawnInterval = Math.max(24, 80 - (MAX_LEVEL - 1) * 6);
}
// Engelleri güncelle
for (var i = obstacles.length - 1; i >= 0; i--) {
var obs = obstacles[i];
obs.update();
if (obs.y - obs.height / 2 > GAME_HEIGHT + 100) {
obs.destroy();
obstacles.splice(i, 1);
continue;
}
if (car.intersects(obs)) {
car.flash();
LK.effects.flashScreen(0xff0000, 600);
isGameOver = true;
// Oyun bittiğinde mesaj göster
showMessage("Oyun bitti! Skor: " + score + " | Paralar: " + bonusCount + " | Level: " + (level === MAX_LEVEL ? "Sonsuz" : level), {
duration: 2000,
color: 0xff0000
});
LK.showGameOver();
return;
}
}
// Bonusları güncelle
for (var j = bonuses.length - 1; j >= 0; j--) {
var bon = bonuses[j];
bon.update();
if (bon.y - bon.height / 2 > GAME_HEIGHT + 100) {
bon.destroy();
bonuses.splice(j, 1);
continue;
}
if (car.intersects(bon)) {
updateScore(score + 5);
bonusCount += 1;
bonusTxt.setText('Paralar: ' + bonusCount);
bon.destroy();
bonuses.splice(j, 1);
LK.effects.flashObject(car, 0x43a047, 300);
// Parayı topladığında mesaj göster
showMessage("Para topladın! Toplam: " + bonusCount + " | Level: " + (level === MAX_LEVEL ? "Sonsuz" : level), {
duration: 1200,
color: 0x43a047
});
continue;
}
}
// Engel üret
ticksSinceLastObstacle++;
if (ticksSinceLastObstacle >= spawnInterval) {
ticksSinceLastObstacle = 0;
var obs = new Obstacle();
var minX = roadX + obs.width / 2;
var maxX = roadX + ROAD_WIDTH - obs.width / 2;
obs.x = minX + Math.floor(Math.random() * (maxX - minX));
obs.y = -obs.height / 2;
obs.speed = speed;
obstacles.push(obs);
game.addChild(obs);
}
// Bonus üret
ticksSinceLastBonus++;
if (ticksSinceLastBonus >= bonusInterval) {
ticksSinceLastBonus = 0;
var bon = new Bonus();
var minXb = roadX + bon.width / 2;
var maxXb = roadX + ROAD_WIDTH - bon.width / 2;
bon.x = minXb + Math.floor(Math.random() * (maxXb - minXb));
bon.y = -bon.height / 2;
bon.speed = speed;
bonuses.push(bon);
game.addChild(bon);
}
// Skoru artır (her tick başına az bir miktar)
if (LK.ticks % 6 === 0) {
updateScore(score + 1);
}
};
// Oyun yeniden başlatıldığında sıfırla
game.on('reset', function () {
// Tüm engelleri ve bonusları sil
for (var i = 0; i < obstacles.length; i++) {
obstacles[i].destroy();
}
for (var j = 0; j < bonuses.length; j++) {
bonuses[j].destroy();
}
obstacles = [];
bonuses = [];
score = 0;
bonusCount = 0;
bonusTxt.setText('Paralar: 0');
isGameOver = false;
car.x = GAME_WIDTH / 2;
car.y = GAME_HEIGHT - 400;
updateScore(0);
// Level ve alanı sıfırla
level = 1;
levelArea = 1;
levelTick = 0;
levelTxt.setText('Level: 1');
areaTxt.setText('Alan: 1');
// Menüye dön
}); /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1", {
highScore: 0
});
/****
* Classes
****/
// Bonus
var Bonus = Container.expand(function () {
var self = Container.call(this);
var bonusGfx = self.attachAsset('bonus', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = bonusGfx.width;
self.height = bonusGfx.height;
self.speed = 0;
self.update = function () {
self.y += self.speed;
};
return self;
});
// Oyuncu arabası
var Car = Container.expand(function () {
var self = Container.call(this);
var carGfx = self.attachAsset('car', {
anchorX: 0.5,
anchorY: 0.5
});
// Arabayı merkeze hizala
self.width = carGfx.width;
self.height = carGfx.height;
// Arabaya çarpma efekti
self.flash = function () {
tween(self, {
tint: 0xffe082
}, {
duration: 120,
onFinish: function onFinish() {
tween(self, {
tint: 0xffffff
}, {
duration: 120
});
}
});
};
return self;
});
// Engel
var Obstacle = Container.expand(function () {
var self = Container.call(this);
var obsGfx = self.attachAsset('obstacle', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = obsGfx.width;
self.height = obsGfx.height;
self.speed = 0; // Her engel için hız atanacak
self.update = function () {
self.y += self.speed;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x222222
});
/****
* Game Code
****/
// Oyun alanı boyutları
var GAME_WIDTH = 2048;
var GAME_HEIGHT = 2732;
var ROAD_WIDTH = 700;
var roadX = (GAME_WIDTH - ROAD_WIDTH) / 2;
// Ana Menü ve Level Seçimi
var MENU_STATE = "menu";
var GAME_STATE = "game";
var state = GAME_STATE;
var selectedLevel = 1;
var MAX_LEVEL = 5; // 5. level sonsuz olacak
// Oyuna doğrudan başla
LK.setTimeout(function () {
startGameWithLevel(selectedLevel);
}, 0);
// Oyun arayüzü ve objeleri
var road = LK.getAsset('road', {
anchorX: 0,
anchorY: 0,
x: roadX,
y: 0
});
game.addChild(road);
var score = 0;
var highScore = storage.highScore || 0;
var bonusCount = 0; // Toplanan para sayısı
var scoreTxt = new Text2('0', {
size: 120,
fill: "#fff"
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
var bonusTxt = new Text2('Paralar: 0', {
size: 60,
fill: 0xFFE082
});
bonusTxt.anchor.set(0, 0);
// Move 60 pixels below the top
bonusTxt.y = 60;
LK.gui.top.addChild(bonusTxt);
var highScoreTxt = new Text2('En Yüksek: ' + highScore, {
size: 60,
fill: "#fff"
});
highScoreTxt.anchor.set(1, 0);
LK.gui.topRight.addChild(highScoreTxt);
var car = new Car();
car.x = GAME_WIDTH / 2;
car.y = GAME_HEIGHT - 400;
game.addChild(car);
var obstacles = [];
var bonuses = [];
// Oyun hızı ve zorluk
var baseSpeed = 16;
var speed = baseSpeed;
var spawnInterval = 80;
var bonusInterval = 180;
var ticksSinceLastObstacle = 0;
var ticksSinceLastBonus = 0;
// Level ve alan sistemi
var level = 1;
var levelArea = 1;
var levelTick = 0;
var LEVEL_TICK_LENGTH = 1200;
var AREA_LENGTH = 3;
// Level ve alan metni
var levelTxt = new Text2('Level: 1', {
size: 60,
fill: "#fff"
});
levelTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(levelTxt);
var areaTxt = new Text2('Alan: 1', {
size: 60,
fill: 0xB3E5FC
});
areaTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(areaTxt);
// Sürükleme
var dragNode = null;
var dragOffsetX = 0;
// Oyun durumu
// Basit mesaj gösterme fonksiyonu (Text2 ile ekrana ortalanmış mesaj)
function showMessage(text, opts) {
opts = opts || {};
var duration = opts.duration || 1200;
var color = opts.color || 0xffffff;
var msg = new Text2(text, {
size: 90,
fill: color
});
msg.anchor.set(0.5, 0.5);
msg.x = GAME_WIDTH / 2;
msg.y = GAME_HEIGHT / 2;
game.addChild(msg);
tween(msg, {
alpha: 0
}, {
delay: duration - 400,
duration: 400,
onFinish: function onFinish() {
msg.destroy();
}
});
}
// Oyun başlatma fonksiyonu
function startGameWithLevel(lvl) {
// Menü arayüzünü gizle
// Menü arayüzü kaldırıldığı için burada bir şey yapmaya gerek yok
// Oyun arayüzünü göster
scoreTxt.visible = true;
bonusTxt.visible = true;
highScoreTxt.visible = true;
levelTxt.visible = true;
areaTxt.visible = true;
car.visible = true;
road.visible = true;
// Level ve area ayarla
level = lvl;
levelArea = Math.floor((level - 1) / AREA_LENGTH) + 1;
levelTick = 0;
levelTxt.setText('Level: ' + (level === MAX_LEVEL ? "Sonsuz" : level));
areaTxt.setText('Alan: ' + levelArea);
// Sonsuz modda level ilerlemesi durur
if (level === MAX_LEVEL) {
LEVEL_TICK_LENGTH = Infinity;
} else {
LEVEL_TICK_LENGTH = 1200;
}
// Oyun objelerini sıfırla
for (var i = 0; i < obstacles.length; i++) obstacles[i].destroy();
for (var j = 0; j < bonuses.length; j++) bonuses[j].destroy();
obstacles = [];
bonuses = [];
score = 0;
bonusCount = 0;
bonusTxt.setText('Paralar: 0');
isGameOver = false;
car.x = GAME_WIDTH / 2;
car.y = GAME_HEIGHT - 400;
updateScore(0);
// Hız ve zorluk ayarla
baseSpeed = 16 + (level - 1) * 2;
speed = baseSpeed;
spawnInterval = Math.max(32, 80 - (level - 1) * 6);
state = GAME_STATE;
}
// Oyun bittiğinde menüye dön
// showMenu fonksiyonu ve başlangıçta menü gösterme kaldırıldı
// Skoru güncelle
function updateScore(val) {
score = val;
scoreTxt.setText(score);
if (score > highScore) {
highScore = score;
storage.highScore = highScore;
highScoreTxt.setText('En Yüksek: ' + highScore);
}
}
// Arabayı sürükleme
function handleMove(x, y, obj) {
if (dragNode) {
// Arabayı sadece yolun içinde hareket ettir
var minX = roadX + dragNode.width / 2;
var maxX = roadX + ROAD_WIDTH - dragNode.width / 2;
var newX = x - dragOffsetX;
if (newX < minX) newX = minX;
if (newX > maxX) newX = maxX;
dragNode.x = newX;
}
}
game.move = handleMove;
game.down = function (x, y, obj) {
// Arabaya dokunulduysa sürüklemeye başla
if (x >= car.x - car.width / 2 && x <= car.x + car.width / 2 && y >= car.y - car.height / 2 && y <= car.y + car.height / 2) {
dragNode = car;
dragOffsetX = x - car.x;
}
};
game.up = function (x, y, obj) {
dragNode = null;
};
// Oyun güncelleme döngüsü
game.update = function () {
if (state === MENU_STATE) {
// Menüdeyken oyun güncellenmez
return;
}
if (isGameOver) return;
// Level ve alan sistemi
if (level !== MAX_LEVEL) {
levelTick++;
if (levelTick >= LEVEL_TICK_LENGTH) {
levelTick = 0;
level += 1;
levelTxt.setText('Level: ' + level);
// Alan değişimi
if ((level - 1) % AREA_LENGTH === 0 && level !== 1) {
levelArea += 1;
areaTxt.setText('Alan: ' + levelArea);
LK.effects.flashScreen(0x00bcd4, 600);
}
// Sonsuz moda geçiş
if (level === MAX_LEVEL) {
levelTxt.setText('Level: Sonsuz');
LEVEL_TICK_LENGTH = Infinity;
}
}
}
// Zorluk: Level arttıkça hız ve engel sıklığı artar
if (level !== MAX_LEVEL) {
speed = baseSpeed + (level - 1) * 2;
spawnInterval = Math.max(32, 80 - (level - 1) * 6);
} else {
speed = baseSpeed + (MAX_LEVEL - 1) * 2;
spawnInterval = Math.max(24, 80 - (MAX_LEVEL - 1) * 6);
}
// Engelleri güncelle
for (var i = obstacles.length - 1; i >= 0; i--) {
var obs = obstacles[i];
obs.update();
if (obs.y - obs.height / 2 > GAME_HEIGHT + 100) {
obs.destroy();
obstacles.splice(i, 1);
continue;
}
if (car.intersects(obs)) {
car.flash();
LK.effects.flashScreen(0xff0000, 600);
isGameOver = true;
// Oyun bittiğinde mesaj göster
showMessage("Oyun bitti! Skor: " + score + " | Paralar: " + bonusCount + " | Level: " + (level === MAX_LEVEL ? "Sonsuz" : level), {
duration: 2000,
color: 0xff0000
});
LK.showGameOver();
return;
}
}
// Bonusları güncelle
for (var j = bonuses.length - 1; j >= 0; j--) {
var bon = bonuses[j];
bon.update();
if (bon.y - bon.height / 2 > GAME_HEIGHT + 100) {
bon.destroy();
bonuses.splice(j, 1);
continue;
}
if (car.intersects(bon)) {
updateScore(score + 5);
bonusCount += 1;
bonusTxt.setText('Paralar: ' + bonusCount);
bon.destroy();
bonuses.splice(j, 1);
LK.effects.flashObject(car, 0x43a047, 300);
// Parayı topladığında mesaj göster
showMessage("Para topladın! Toplam: " + bonusCount + " | Level: " + (level === MAX_LEVEL ? "Sonsuz" : level), {
duration: 1200,
color: 0x43a047
});
continue;
}
}
// Engel üret
ticksSinceLastObstacle++;
if (ticksSinceLastObstacle >= spawnInterval) {
ticksSinceLastObstacle = 0;
var obs = new Obstacle();
var minX = roadX + obs.width / 2;
var maxX = roadX + ROAD_WIDTH - obs.width / 2;
obs.x = minX + Math.floor(Math.random() * (maxX - minX));
obs.y = -obs.height / 2;
obs.speed = speed;
obstacles.push(obs);
game.addChild(obs);
}
// Bonus üret
ticksSinceLastBonus++;
if (ticksSinceLastBonus >= bonusInterval) {
ticksSinceLastBonus = 0;
var bon = new Bonus();
var minXb = roadX + bon.width / 2;
var maxXb = roadX + ROAD_WIDTH - bon.width / 2;
bon.x = minXb + Math.floor(Math.random() * (maxXb - minXb));
bon.y = -bon.height / 2;
bon.speed = speed;
bonuses.push(bon);
game.addChild(bon);
}
// Skoru artır (her tick başına az bir miktar)
if (LK.ticks % 6 === 0) {
updateScore(score + 1);
}
};
// Oyun yeniden başlatıldığında sıfırla
game.on('reset', function () {
// Tüm engelleri ve bonusları sil
for (var i = 0; i < obstacles.length; i++) {
obstacles[i].destroy();
}
for (var j = 0; j < bonuses.length; j++) {
bonuses[j].destroy();
}
obstacles = [];
bonuses = [];
score = 0;
bonusCount = 0;
bonusTxt.setText('Paralar: 0');
isGameOver = false;
car.x = GAME_WIDTH / 2;
car.y = GAME_HEIGHT - 400;
updateScore(0);
// Level ve alanı sıfırla
level = 1;
levelArea = 1;
levelTick = 0;
levelTxt.setText('Level: 1');
areaTxt.setText('Alan: 1');
// Menüye dön
});