User prompt
Please fix the bug: 'TypeError: LK.effects.showMessage is not a function' in or related to this line: 'LK.effects.showMessage("Oyun bitti! Skor: " + score + " | Paralar: " + bonusCount + " | Level: " + (level === MAX_LEVEL ? "Sonsuz" : level), {' Line Number: 307
User prompt
Paralar ve puanları kaybettiğimizde de söylesin ve levelimizi
User prompt
Please fix the bug: 'ReferenceError: showMenu is not defined' in or related to this line: 'LK.setTimeout(showMenu, 1200);' Line Number: 308
User prompt
Please fix the bug: 'Timeout.tick error: menuTitle is not defined' in or related to this line: 'menuTitle.visible = false;' Line Number: 174
User prompt
Please fix the bug: 'setTimeout is not a function' in or related to this line: 'setTimeout(function () {' Line Number: 100
User prompt
Direk oyuna girelim
User prompt
Basla tuşuna basında oyuna girelim
User prompt
Oyunda basla tuşunu yazını azdık altına ekle
User prompt
Basla tuşu görünsün ekranda
User prompt
Okadar değil yazını altı şanti metre altı
User prompt
Başlama tuşunu alt a al
User prompt
Please fix the bug: 'Cannot set properties of undefined (setting 'fill')' in or related to this line: 'levelBtns[i].style.fill = "#ffeb3b";' Line Number: 128
User prompt
Ana menü ve level ekle son level sonsuz olsun
User prompt
Oyuna ekstra leveller ekle ve alanlar olsun oyun sonsuz ama hala
User prompt
Paraları ne kadar aldığımız yazzın
Code edit (1 edits merged)
Please save this source code
User prompt
Drift Racer: Sonsuz Yol
Initial prompt
Bana araba oyunu yap
/****
* 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 = MENU_STATE;
var selectedLevel = 1;
var MAX_LEVEL = 5; // 5. level sonsuz olacak
// Menü arayüzü
var menuTitle = new Text2('Drift Racer', {
size: 180,
fill: "#fff"
});
menuTitle.anchor.set(0.5, 0.2);
LK.gui.center.addChild(menuTitle);
var playBtn = new Text2('Başla', {
size: 120,
fill: 0xFFE082
});
// Place just below the menu title
playBtn.anchor.set(0.5, 0);
playBtn.y = menuTitle.y + menuTitle.height + 40;
LK.gui.center.addChild(playBtn);
var levelBtns = [];
for (var i = 1; i <= MAX_LEVEL; i++) {
var txt = i === MAX_LEVEL ? "Sonsuz" : "Level " + i;
var btn = new Text2(txt, {
size: 90,
fill: 0xB3E5FC
});
btn.anchor.set(0.5, 0.5);
btn.y = 300 + i * 120;
LK.gui.center.addChild(btn);
levelBtns.push(btn);
}
// Menüde hangi level seçili göstermek için
function updateLevelBtnHighlight() {
for (var i = 0; i < levelBtns.length; i++) {
if (i + 1 === selectedLevel) {
levelBtns[i].setStyle({
fill: 0xFFEB3B
});
} else {
levelBtns[i].setStyle({
fill: 0xB3E5FC
});
}
levelBtns[i].setText(levelBtns[i].text); // style güncellemesi için
}
}
updateLevelBtnHighlight();
// Menüde butonlara tıklama
LK.gui.center.down = function (x, y, obj) {
// Level seçimi
for (var i = 0; i < levelBtns.length; i++) {
var btn = levelBtns[i];
var bounds = btn.getBounds();
if (x >= bounds.x && x <= bounds.x + bounds.width && y >= bounds.y && y <= bounds.y + bounds.height) {
selectedLevel = i + 1;
updateLevelBtnHighlight();
return;
}
}
// Başla butonu
var playBounds = playBtn.getBounds();
if (x >= playBounds.x && x <= playBounds.x + playBounds.width && y >= playBounds.y && y <= playBounds.y + playBounds.height) {
startGameWithLevel(selectedLevel);
}
};
// 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
var isGameOver = false;
// Oyun başlatma fonksiyonu
function startGameWithLevel(lvl) {
// Menü arayüzünü gizle
menuTitle.visible = false;
playBtn.visible = false;
for (var i = 0; i < levelBtns.length; i++) {
levelBtns[i].visible = false;
}
// 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
function showMenu() {
state = MENU_STATE;
menuTitle.visible = true;
playBtn.visible = true;
playBtn.visible = true;
for (var i = 0; i < levelBtns.length; i++) {
levelBtns[i].visible = true;
}
// Oyun arayüzünü gizle
scoreTxt.visible = false;
bonusTxt.visible = false;
highScoreTxt.visible = false;
levelTxt.visible = false;
areaTxt.visible = false;
car.visible = false;
road.visible = false;
// Tüm engel ve bonusları gizle
for (var i = 0; i < obstacles.length; i++) obstacles[i].visible = false;
for (var j = 0; j < bonuses.length; j++) bonuses[j].visible = false;
}
// Başlangıçta menü göster
showMenu();
// 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;
LK.showGameOver();
// Menüye dön
setTimeout(showMenu, 1200);
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);
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
showMenu();
}); ===================================================================
--- original.js
+++ change.js
@@ -98,11 +98,12 @@
var playBtn = new Text2('Başla', {
size: 120,
fill: 0xFFE082
});
-playBtn.anchor.set(0.5, 1);
-playBtn.y = LK.gui.height ? LK.gui.height - 100 : 1100; // Place near bottom, fallback if gui.height not available
-LK.gui.bottom.addChild(playBtn);
+// Place just below the menu title
+playBtn.anchor.set(0.5, 0);
+playBtn.y = menuTitle.y + menuTitle.height + 40;
+LK.gui.center.addChild(playBtn);
var levelBtns = [];
for (var i = 1; i <= MAX_LEVEL; i++) {
var txt = i === MAX_LEVEL ? "Sonsuz" : "Level " + i;
var btn = new Text2(txt, {