User prompt
normal kalplerin boyutunu azıcık küçült ve azıcık sola kaydır. Jeton kısmına çarpmasın
User prompt
oyuna başladığımda canlar geri gelsin
User prompt
başlangıç ekranında can kısmı olmasın
User prompt
yap artık
User prompt
oyuna garaj kısmı ekle ve buradan araba seçelim. Garaj kısmına şimdilik "yeşil araba" adlı bir karakter koy. Assets kısmına ekleki daha sonra "yeşil araba"ya bir araba görüntüsü verebilelim
User prompt
başlangıç kısmına "garaj" bölümü koy ve oradan araba seçelim
User prompt
Please fix the bug: 'Uncaught TypeError: Cannot set properties of undefined (setting 'fill')' in or related to this line: 'this.style.fill = 0x00e676;' Line Number: 539
User prompt
bunlar için dükkan bölümü ekle ve oradan ücretsiz bir şekilde kullanalım
User prompt
Please fix the bug: 'Cannot read properties of undefined (reading 'length')' in or related to this line: 'for (var i = 0; i < carOptionNodes.length; i++) {' Line Number: 310
User prompt
Please fix the bug: 'type is not defined' in or related to this line: 'var carBody = self.attachAsset(type === 'araba2' ? 'araba2' : 'car', {' Line Number: 114
User prompt
oyunun başına araba seçme kısmı ekle ve dokunduğumuz objeleri karakter olarak kullanabilelim
User prompt
Please fix the bug: 'ReferenceError: Bulut is not defined' in or related to this line: 'var bulut = new Bulut();' Line Number: 307
User prompt
Please fix the bug: 'Car is not defined' in or related to this line: 'var car = new Car();' Line Number: 64
User prompt
oyuna yağmur bulutu ekle. yere yağmur damlası atsın.
User prompt
oyuna fren ekle. bastığımızda yavaşlasın
User prompt
arkaplan müziği sadece ve sadece oyunu başlatma kısmında çalsın. Oyunu başlatmak için dokunduğumuzda müzik gitsin
User prompt
oyun başladığında müzik çalmasın
User prompt
oyunun başlangıç bölümüne "arkaplan" adlı müziği ekle
User prompt
bulutlar oyun başladıktan sonra çıksın
User prompt
oyuna arka plan objesi olarak bulut ekle ve bunu assets kısmına kaydet
User prompt
normal kalplerin çıkma olasılığını %1 düşür
User prompt
jetonların görünüşünü assets kısmına ekle
User prompt
Please fix the bug: 'TypeError: LK.showMessage is not a function' in or related to this line: 'LK.showMessage(taunt, {' Line Number: 494
User prompt
Her oyunu kaybettiğimizde oyuncu ile dalga geçen bir cümle koy
User prompt
DÜKKANIN ÇEVRESİNE BİR KUTU OLUŞTUR VE O KUTUYA BASTIĞIMIZDA DÜKKAN ADLI BİR YERE GEÇELİM
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1", {
highestScore: 0
});
/****
* Classes
****/
// Bulut (Cloud) background object class
var Bulut = Container.expand(function () {
var self = Container.call(this);
var bulutImg = self.attachAsset('bulut', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = bulutImg.width;
self.height = bulutImg.height;
// Set a random speed for parallax effect
self.speed = 2 + Math.random() * 2;
self.update = function () {
self.x -= self.speed;
};
return self;
});
// Car class
var Car = Container.expand(function () {
var self = Container.call(this);
// Car body
var carBody = self.attachAsset('car', {
anchorX: 0.5,
anchorY: 1
});
// Physics
self.vy = 0; // vertical velocity
self.isJumping = false;
// Car size for collision
self.bodyWidth = carBody.width;
self.bodyHeight = carBody.height;
// Update method
self.update = function () {
// Gravity and jump physics
self.y += self.vy;
if (self.y < groundY) {
self.vy += gravity;
if (self.y > groundY) {
self.y = groundY;
self.vy = 0;
self.isJumping = false;
}
} else if (self.y > groundY) {
self.y = groundY;
self.vy = 0;
self.isJumping = false;
}
};
// Jump method
self.jump = function () {
if (!self.isJumping && self.y >= groundY) {
self.vy = jumpVelocity;
self.isJumping = true;
LK.getSound('jump').play();
// Tilt the car slightly when jumping, then return to normal after 300ms
if (typeof tween !== "undefined" && typeof tween.create === "function") {
// Animate tilt to -0.25
var tiltTween = tween.create(carBody, {
rotation: -0.25
}, 120, {
easing: "easeOutCubic"
});
tiltTween.then(function () {
// Animate back to 0
var resetTween = tween.create(carBody, {
rotation: 0
}, 180, {
easing: "easeInCubic"
});
// No need to do anything after reset
});
} else {
carBody.rotation = -0.25;
// Fallback: reset after 300ms
LK.setTimeout(function () {
carBody.rotation = 0;
}, 300);
}
}
};
return self;
});
// If type is 'araba2', use araba2 asset, else default to 'car'
var CarCustom = Container.expand(function (type) {
var self = Container.call(this);
var carBody = self.attachAsset(type === 'araba2' ? 'araba2' : 'car', {
anchorX: 0.5,
anchorY: 1
});
self.vy = 0;
self.isJumping = false;
self.bodyWidth = carBody.width;
self.bodyHeight = carBody.height;
self.update = function () {
self.y += self.vy;
if (self.y < groundY) {
self.vy += gravity;
if (self.y > groundY) {
self.y = groundY;
self.vy = 0;
self.isJumping = false;
}
} else if (self.y > groundY) {
self.y = groundY;
self.vy = 0;
self.isJumping = false;
}
};
self.jump = function () {
if (!self.isJumping && self.y >= groundY) {
self.vy = jumpVelocity;
self.isJumping = true;
LK.getSound('jump').play();
if (typeof tween !== "undefined" && typeof tween.create === "function") {
var tiltTween = tween.create(carBody, {
rotation: -0.25
}, 120, {
easing: "easeOutCubic"
});
tiltTween.then(function () {
var resetTween = tween.create(carBody, {
rotation: 0
}, 180, {
easing: "easeInCubic"
});
});
} else {
carBody.rotation = -0.25;
LK.setTimeout(function () {
carBody.rotation = 0;
}, 300);
}
}
};
return self;
});
// Coin collectible class
var CoinCollectible = Container.expand(function () {
var self = Container.call(this);
// Use a yellow coin emoji for collectible
var coinTxt = new Text2('🪙', {
size: 110,
fill: 0xffe066 // gold/yellow
});
coinTxt.anchor.set(0.5, 1);
self.addChild(coinTxt);
self.width = coinTxt.width;
self.height = coinTxt.height;
// For collision
self.bodyWidth = coinTxt.width;
self.bodyHeight = coinTxt.height;
self.update = function () {
var speed = typeof effectiveGameSpeed !== "undefined" ? effectiveGameSpeed : gameSpeed;
self.x -= speed;
};
return self;
});
// Gold heart collectible class
var GoldHeartCollectible = Container.expand(function () {
var self = Container.call(this);
// Use a text heart for collectible, gold color
var goldHeartTxt = new Text2('❤', {
size: 120,
fill: 0xffd700 // gold
});
goldHeartTxt.anchor.set(0.5, 1);
self.addChild(goldHeartTxt);
self.width = goldHeartTxt.width;
self.height = goldHeartTxt.height;
// For collision
self.bodyWidth = goldHeartTxt.width;
self.bodyHeight = goldHeartTxt.height;
self.update = function () {
var speed = typeof effectiveGameSpeed !== "undefined" ? effectiveGameSpeed : gameSpeed;
self.x -= speed;
};
return self;
});
// Heart collectible class
var HeartCollectible = Container.expand(function () {
var self = Container.call(this);
// Use a text heart for collectible
var heartTxt = new Text2('❤', {
size: 120,
fill: 0xff69b4
});
heartTxt.anchor.set(0.5, 1);
self.addChild(heartTxt);
self.width = heartTxt.width;
self.height = heartTxt.height;
// For collision
self.bodyWidth = heartTxt.width;
self.bodyHeight = heartTxt.height;
// Update method
self.update = function () {
// Use effectiveGameSpeed if defined, else fallback to gameSpeed
var speed = typeof effectiveGameSpeed !== "undefined" ? effectiveGameSpeed : gameSpeed;
self.x -= speed;
};
return self;
});
// Obstacle class
var Obstacle = Container.expand(function () {
var self = Container.call(this);
var obs = self.attachAsset('obstacle', {
anchorX: 0.5,
anchorY: 1
});
self.width = obs.width;
self.height = obs.height;
// For collision
self.bodyWidth = obs.width;
self.bodyHeight = obs.height;
// Update method
self.update = function () {
// Use effectiveGameSpeed if defined, else fallback to gameSpeed
var speed = typeof effectiveGameSpeed !== "undefined" ? effectiveGameSpeed : gameSpeed;
self.x -= speed;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x87ceeb // sky blue
});
/****
* Game Code
****/
// Left-right moving obstacle asset
// Constants
// Car: blue box
// Wheel: black ellipse
// Obstacle: red box
// Road: dark gray box
// Jump sound
function _typeof(o) {
"@babel/helpers - typeof";
return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) {
return typeof o;
} : function (o) {
return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o;
}, _typeof(o);
}
var groundY = 2200; // y position of the road top
var gravity = 4.5;
var jumpVelocity = -80;
var initialGameSpeed = 24;
var maxGameSpeed = 60;
var gameSpeed = initialGameSpeed;
var obstacleMinGap = 500;
var obstacleMaxGap = 1100;
var obstacleMinY = groundY;
var obstacleMaxY = groundY;
var minObstacleHeight = 120;
var maxObstacleHeight = 220;
// Road
var road = LK.getAsset('road', {
anchorX: 0,
anchorY: 0,
x: 0,
y: groundY
});
game.addChild(road);
// Car
// Use selectedCarType to determine which car to use
var car = null;
function createCarByType(type) {
return new CarCustom(type);
}
// Initially, create a default car (will be replaced after selection)
car = createCarByType('car');
car.x = 400;
car.y = groundY;
game.addChild(car);
// When car is selected, replace the car object with the selected one
function replaceCarWithSelected() {
if (car) {
car.destroy();
}
car = createCarByType(selectedCarType || 'car');
car.x = 400;
car.y = groundY;
game.addChild(car);
}
// Car selection tap logic is now handled directly in carNode.down during carOptionNodes creation
// --- Slow effect state ---
var carIsSlowed = false;
var carSlowTicks = 0;
var carSlowDuration = 120; // 2 seconds at 60fps
var carSlowSpeedFactor = 0.45; // 45% speed when slowed
// Obstacles
var obstacles = [];
var nextObstacleX = 2048 + 400;
// Heart collectibles
var heartCollectibles = [];
var nextHeartX = 2048 + 1200; // Start further out
// Gold heart collectibles
var goldHeartCollectibles = [];
var goldHeartActive = false;
var goldHeartTimer = 0;
var goldHeartDuration = 8 * 60; // 8 seconds at 60fps
var goldHeartDisplay = null;
var goldHeartDisplayLives = 0;
// --- Coin system ---
// Persistent coin count (load from storage, default 0)
var coins = typeof storage.coins === "number" ? storage.coins : 0;
// Coin collectibles
var coinCollectibles = [];
// Coin display
var coinTxt = new Text2('', {
size: 90,
fill: 0xffe066
});
coinTxt.anchor.set(1, 1);
coinTxt.x = -40;
coinTxt.y = -40;
LK.gui.bottomRight.addChild(coinTxt);
function updateCoinDisplay() {
coinTxt.setText("Jeton: " + coins);
}
updateCoinDisplay();
// Score
var score = 0;
var lastScore = 0;
var lives = 3; // Start with 3 lives
var maxLives = 3; // This can grow up to 9 as hearts are collected
var scoreTxt = new Text2('0', {
size: 120,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Lives display
var livesTxt = new Text2('', {
size: 90,
fill: 0xff4444
});
// Anchor to left-bottom
livesTxt.anchor.set(0, 1);
// Place a bit above the very bottom and a bit right from the very left
livesTxt.x = 40;
livesTxt.y = -40;
LK.gui.bottomLeft.addChild(livesTxt);
function updateLivesDisplay() {
if (goldHeartActive) {
// Hide normal lives, show gold hearts
if (!goldHeartDisplay) {
goldHeartDisplay = new Text2('', {
size: 76,
fill: 0xffd700
});
goldHeartDisplay.anchor.set(0, 1);
goldHeartDisplay.x = 18;
goldHeartDisplay.y = -40;
LK.gui.bottomLeft.addChild(goldHeartDisplay);
}
var hearts = '';
// Always cap display to 9 hearts maximum to prevent overflow
var displayMax = maxLives > 9 ? 9 : maxLives;
var displayLives = goldHeartDisplayLives > 9 ? 9 : goldHeartDisplayLives;
for (var i = 0; i < displayLives; i++) hearts += '❤ ';
for (var i = displayLives; i < displayMax; i++) hearts += '♡ ';
goldHeartDisplay.setText("Altın Can: " + hearts.trim());
livesTxt.setText(""); // Hide normal
} else {
// Show normal lives, hide gold
if (goldHeartDisplay) goldHeartDisplay.setText("");
var hearts = '';
var displayMax = maxLives > 9 ? 9 : maxLives;
for (var i = 0; i < lives && i < 9; i++) hearts += '❤ ';
for (var i = lives; i < displayMax; i++) hearts += '♡ ';
livesTxt.setText("Can: " + hearts.trim());
}
}
updateLivesDisplay();
// Last score display
var lastScoreTxt = new Text2('', {
size: 70,
fill: 0xFFD700
});
lastScoreTxt.anchor.set(0.5, 0);
lastScoreTxt.y = scoreTxt.height + 10;
LK.gui.top.addChild(lastScoreTxt);
// Highest score display (below leaderboard)
var highestScore = storage.highestScore || 0;
var highestScoreTxt = new Text2('', {
size: 70,
fill: 0x00ffcc
});
highestScoreTxt.anchor.set(0.5, 0);
highestScoreTxt.y = lastScoreTxt.y + lastScoreTxt.height + 10;
LK.gui.top.addChild(highestScoreTxt);
// Difficulty
var ticksSinceStart = 0;
// --- Car Selection Overlay ---
var gameStarted = false;
var carSelected = false;
var selectedCarType = null;
// --- SHOP SYSTEM ---
// List of cars for shop (can be expanded)
var carTypes = [{
id: 'car',
name: 'Kırmızı Araba',
asset: 'car',
price: 0 // Free
}, {
id: 'araba2',
name: 'Mavi Araba',
asset: 'araba2',
price: 0 // Free
}];
// Persistent unlocked cars (load from storage, default to only 'car' unlocked)
var unlockedCars = _typeof(storage.unlockedCars) === "object" && storage.unlockedCars instanceof Array ? storage.unlockedCars : typeof storage.unlockedCars === "string" ? storage.unlockedCars.split(",") : ['car'];
if (unlockedCars.indexOf('car') === -1) unlockedCars.push('car'); // Always unlock default
function saveUnlockedCars() {
storage.unlockedCars = unlockedCars.join(",");
}
// --- SHOP OVERLAY ---
var shopOverlay = new Container();
var shopBg = LK.getAsset('road', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0,
width: 2048,
height: 2732
});
shopBg.alpha = 0.82;
shopOverlay.addChild(shopBg);
var shopTitle = new Text2("Dükkan", {
size: 180,
fill: 0xffffff
});
shopTitle.anchor.set(0.5, 0.5);
shopTitle.x = 2048 / 2;
shopTitle.y = 600;
shopOverlay.addChild(shopTitle);
var shopText = new Text2("Arabaları ücretsiz olarak aç ve seç", {
size: 90,
fill: 0xffd700
});
shopText.anchor.set(0.5, 0.5);
shopText.x = 2048 / 2;
shopText.y = 800;
shopOverlay.addChild(shopText);
// Car option visuals in shop
var shopCarNodes = [];
for (var i = 0; i < carTypes.length; i++) {
var carType = carTypes[i];
var xPos = 2048 / 2 + (i - (carTypes.length - 1) / 2) * 500;
var carNode = new Container();
var carImg = LK.getAsset(carType.asset, {
anchorX: 0.5,
anchorY: 0.5,
x: 0,
y: 0,
scaleX: 2.2,
scaleY: 2.2
});
carNode.addChild(carImg);
var carLabel = new Text2(carType.name, {
size: 70,
fill: 0xffffff
});
carLabel.anchor.set(0.5, 0);
carLabel.x = 0;
carLabel.y = carImg.height / 2 + 30;
carNode.addChild(carLabel);
// Unlock/Select button
var isUnlocked = unlockedCars.indexOf(carType.id) !== -1;
var btnText = isUnlocked ? "Seç" : "Ücretsiz Aç";
var btnColor = isUnlocked ? 0x00e676 : 0xffd700;
var btn = new Text2(btnText, {
size: 60,
fill: btnColor
});
btn.anchor.set(0.5, 0);
btn.x = 0;
btn.y = carLabel.y + 90;
btn.interactive = true;
btn.buttonMode = true;
// Store index for selection
btn._carTypeIndex = i;
btn._isUnlocked = isUnlocked;
btn.down = function (x, y, obj) {
var idx = this._carTypeIndex;
var carType = carTypes[idx];
var isUnlocked = unlockedCars.indexOf(carType.id) !== -1;
if (!isUnlocked) {
// Unlock for free
unlockedCars.push(carType.id);
saveUnlockedCars();
this.setText("Seç");
this.style.fill = 0x00e676;
this._isUnlocked = true;
} else {
// Select car and go to car selection overlay
selectedCarType = carType.id;
carSelected = true;
shopOverlay.visible = false;
carSelectionOverlay.visible = true;
// Update car selection overlay to highlight selected car
updateCarSelectionOverlay();
}
};
carNode.addChild(btn);
carNode.x = xPos;
carNode.y = 1100;
shopOverlay.addChild(carNode);
shopCarNodes.push(carNode);
}
game.addChild(shopOverlay);
// --- CAR SELECTION OVERLAY ---
var carSelectionOverlay = new Container();
var carSelBg = LK.getAsset('road', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0,
width: 2048,
height: 2732
});
carSelBg.alpha = 0.82;
carSelectionOverlay.addChild(carSelBg);
var carSelTitle = new Text2("Araba Seç", {
size: 180,
fill: 0xffffff
});
carSelTitle.anchor.set(0.5, 0.5);
carSelTitle.x = 2048 / 2;
carSelTitle.y = 600;
carSelectionOverlay.addChild(carSelTitle);
var carSelText = new Text2("Oynamak için bir araba seç", {
size: 90,
fill: 0xffd700
});
carSelText.anchor.set(0.5, 0.5);
carSelText.x = 2048 / 2;
carSelText.y = 800;
carSelectionOverlay.addChild(carSelText);
// Car option visuals for selection
var carOptionNodes = [];
function updateCarSelectionOverlay() {
// Remove old nodes
for (var i = 0; i < carOptionNodes.length; i++) {
carSelectionOverlay.removeChild(carOptionNodes[i]);
}
carOptionNodes = [];
for (var i = 0; i < carTypes.length; i++) {
var carType = carTypes[i];
var xPos = 2048 / 2 + (i - (carTypes.length - 1) / 2) * 500;
var carNode = new Container();
var carImg = LK.getAsset(carType.asset, {
anchorX: 0.5,
anchorY: 0.5,
x: 0,
y: 0,
scaleX: 2.2,
scaleY: 2.2
});
carNode.addChild(carImg);
var carLabel = new Text2(carType.name, {
size: 70,
fill: 0xffffff
});
carLabel.anchor.set(0.5, 0);
carLabel.x = 0;
carLabel.y = carImg.height / 2 + 30;
carNode.addChild(carLabel);
// Only allow selection if unlocked
var isUnlocked = unlockedCars.indexOf(carType.id) !== -1;
var selectBtn = new Text2(isUnlocked ? "Seç" : "Kilitli", {
size: 60,
fill: isUnlocked ? 0x00e676 : 0x888888
});
selectBtn.anchor.set(0.5, 0);
selectBtn.x = 0;
selectBtn.y = carLabel.y + 90;
selectBtn.interactive = isUnlocked;
selectBtn.buttonMode = isUnlocked;
selectBtn._carTypeIndex = i;
selectBtn.down = function (x, y, obj) {
var idx = this._carTypeIndex;
var carType = carTypes[idx];
if (unlockedCars.indexOf(carType.id) !== -1) {
selectedCarType = carType.id;
carSelected = true;
carSelectionOverlay.visible = false;
startOverlay.visible = true;
}
};
carNode.addChild(selectBtn);
// Highlight selected car
if (selectedCarType === carType.id) {
var highlight = new Text2("✓", {
size: 80,
fill: 0x00e676
});
highlight.anchor.set(0.5, 1);
highlight.x = 0;
highlight.y = -carImg.height / 2 - 20;
carNode.addChild(highlight);
}
carNode.x = xPos;
carNode.y = 1100;
carSelectionOverlay.addChild(carNode);
carOptionNodes.push(carNode);
}
}
updateCarSelectionOverlay();
game.addChild(carSelectionOverlay);
// Show shop overlay at game start, hide others
shopOverlay.visible = true;
carSelectionOverlay.visible = false;
// --- Start Screen Overlay ---
var startOverlay = new Container();
var startBg = LK.getAsset('road', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0,
width: 2048,
height: 2732
});
startBg.alpha = 0.82;
startOverlay.addChild(startBg);
// Add a visual image to the start overlay
var startVisual = LK.getAsset('car', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 700,
scaleX: 2.2,
scaleY: 2.2
});
startOverlay.addChild(startVisual);
var startText = new Text2("Araba Koşusu", {
size: 180,
fill: 0xffffff
});
startText.anchor.set(0.5, 0.5);
startText.x = 2048 / 2;
startText.y = 900;
startOverlay.addChild(startText);
var tapText = new Text2("Başlamak için ekrana dokun", {
size: 90,
fill: 0xffd700
});
tapText.anchor.set(0.5, 0.5);
tapText.x = 2048 / 2;
tapText.y = 1200;
startOverlay.addChild(tapText);
startOverlay.visible = false; // Hide until car is selected
game.addChild(startOverlay);
// Play 'arkaplan' music on the start screen overlay
LK.playMusic('arkaplan');
// Touch handler: tap anywhere to jump or start
game.down = function (x, y, obj) {
if (!carSelected) {
// Let car selection handle tap
return;
}
if (!gameStarted) {
gameStarted = true;
startOverlay.visible = false;
LK.stopMusic(); // Stop 'arkaplan' music when game starts
return;
}
car.jump();
};
// --- Bulut (cloud) background logic ---
// Only define bulutlar array here, spawn logic will be in game.update after gameStarted
if (typeof bulutlar === "undefined") {
var bulutlar = [];
}
// Main update loop
game.update = function () {
if (!gameStarted) return;
// --- Bulut (cloud) background logic (spawn/update only after gameStarted) ---
if (bulutlar.length === 0) {
// Spawn initial clouds
for (var i = 0; i < 4; i++) {
var bulut = new Bulut();
bulut.x = 400 + i * 500 + Math.random() * 200;
bulut.y = 400 + Math.random() * 600;
bulut.speed = 1.2 + Math.random() * 1.8;
game.addChild(bulut);
bulutlar.push(bulut);
}
}
for (var i = bulutlar.length - 1; i >= 0; i--) {
var bulut = bulutlar[i];
bulut.update();
if (bulut.x < -bulut.width / 2) {
bulut.destroy();
bulutlar.splice(i, 1);
}
}
// Spawn new bulut if needed
if (bulutlar.length < 4) {
var bulut = new Bulut();
bulut.x = 2048 + bulut.width / 2 + Math.random() * 200;
bulut.y = 300 + Math.random() * 800;
bulut.speed = 1.2 + Math.random() * 1.8;
game.addChild(bulut);
bulutlar.push(bulut);
}
ticksSinceStart++;
// Increase game speed smoothly over time for gradual acceleration
if (gameSpeed < maxGameSpeed) {
// Accelerate slowly at first, then faster as time goes on
// The divisor controls how quickly speed ramps up (higher = slower ramp)
var speedup = ticksSinceStart / 60 * 0.18; // 0.18 px/frame/sec, adjust for feel
gameSpeed = initialGameSpeed + speedup;
if (gameSpeed > maxGameSpeed) gameSpeed = maxGameSpeed;
}
// --- Car slow effect logic ---
if (carIsSlowed) {
carSlowTicks++;
if (carSlowTicks >= carSlowDuration) {
carIsSlowed = false;
carSlowTicks = 0;
}
}
var effectiveGameSpeed = carIsSlowed ? gameSpeed * carSlowSpeedFactor : gameSpeed;
// Update car
car.update();
// Update obstacles
for (var i = obstacles.length - 1; i >= 0; i--) {
var obs = obstacles[i];
// If car is slowed, move obstacles at slowed speed for 2 seconds
if (carIsSlowed) {
var speed = gameSpeed * carSlowSpeedFactor;
obs.x -= speed - (typeof effectiveGameSpeed !== "undefined" ? effectiveGameSpeed : gameSpeed);
}
obs.update();
// Remove if off screen
if (obs.x < -200) {
obs.destroy();
obstacles.splice(i, 1);
continue;
}
// Collision detection (AABB)
var carLeft = car.x - car.bodyWidth / 2 + 20;
var carRight = car.x + car.bodyWidth / 2 - 20;
var carTop = car.y - car.bodyHeight;
var carBottom = car.y;
var obsLeft = obs.x - obs.bodyWidth / 2;
var obsRight = obs.x + obs.bodyWidth / 2;
var obsTop = obs.y - obs.bodyHeight;
var obsBottom = obs.y;
var intersect = !(carRight < obsLeft || carLeft > obsRight || carBottom < obsTop + 10 || carTop > obsBottom - 10);
if (intersect) {
if (goldHeartActive) {
// No damage, just animate obstacle tumble and remove after
if (typeof tween !== "undefined" && typeof tween.create === "function") {
// Animate: rotate 1.5 turns, fall down
tween.create(obs, {
rotation: obs.rotation + Math.PI * 3,
y: obs.y + 400,
alpha: 0.2
}, 700, {
easing: "easeInCubic"
}).then(function () {
obs.destroy();
});
} else {
obs.destroy();
}
obstacles.splice(i, 1);
continue;
}
// Play 'engellenmek' sound on collision
LK.getSound('engellenmek').play();
// Removed LK.effects.flashScreen(0xff0000, 800);
lives--;
updateLivesDisplay();
// --- Trigger car slow effect for 2 seconds ---
carIsSlowed = true;
carSlowTicks = 0;
if (lives <= 0) {
// Stop car movement and animate tilt to indicate a crash
car.vy = 0;
car.isJumping = false;
// Animate car tilt to crash angle (0.35 radians) smoothly
if (typeof tween !== "undefined" && typeof tween.create === "function") {
tween.create(car.children[0], {
rotation: 0.35
}, 320, {
easing: "easeOutCubic"
});
} else {
car.children[0].rotation = 0.35;
}
LK.setScore(score); // Ensure latest score is set
lastScore = score;
lastScoreTxt.setText("Son Skor: " + lastScore);
// Update highest score if needed
if (score > highestScore) {
highestScore = score;
storage.highestScore = highestScore;
highestScoreTxt.setText("En Yüksek Skor: " + highestScore);
} else {
// Always show the stored value if not beaten
highestScoreTxt.setText("En Yüksek Skor: " + (storage.highestScore || highestScore));
}
LK.showGameOver();
return;
} else {
// Animate obstacle tumble and falling to ground, then remove after
if (typeof tween !== "undefined" && typeof tween.create === "function") {
tween.create(obs, {
rotation: obs.rotation + Math.PI * 3,
y: groundY + obs.height,
alpha: 0.2
}, 700, {
easing: "easeInCubic"
}).then(function () {
obs.destroy();
});
} else {
obs.destroy();
}
obstacles.splice(i, 1);
continue;
}
}
// Score: passed obstacle
if (!obs.passed && obs.x + obs.bodyWidth / 2 < car.x - car.bodyWidth / 2) {
obs.passed = true;
score++;
scoreTxt.setText(score);
}
}
// --- Heart collectibles update and collision ---
for (var i = heartCollectibles.length - 1; i >= 0; i--) {
var heart = heartCollectibles[i];
// If car is slowed, move hearts at slowed speed for 2 seconds
if (carIsSlowed) {
var speed = gameSpeed * carSlowSpeedFactor;
heart.x -= speed - (typeof effectiveGameSpeed !== "undefined" ? effectiveGameSpeed : gameSpeed);
}
heart.update();
// Remove if off screen
if (heart.x < -200) {
heart.destroy();
heartCollectibles.splice(i, 1);
continue;
}
// Collision detection (AABB)
var carLeft = car.x - car.bodyWidth / 2 + 20;
var carRight = car.x + car.bodyWidth / 2 - 20;
var carTop = car.y - car.bodyHeight;
var carBottom = car.y;
var heartLeft = heart.x - heart.bodyWidth / 2;
var heartRight = heart.x + heart.bodyWidth / 2;
var heartTop = heart.y - heart.bodyHeight;
var heartBottom = heart.y;
var intersect = !(carRight < heartLeft || carLeft > heartRight || carBottom < heartTop + 10 || carTop > heartBottom - 10);
if (intersect) {
if (!goldHeartActive) {
// Always increase lives, up to a hard cap of 9
if (lives < 9) {
lives++;
// If we go above maxLives, update maxLives to match (so display shows more hearts)
if (lives > maxLives) maxLives = lives;
updateLivesDisplay();
}
}
// Remove the heart collectible
heart.destroy();
heartCollectibles.splice(i, 1);
continue;
}
}
// --- Gold heart collectibles update and collision ---
for (var i = goldHeartCollectibles.length - 1; i >= 0; i--) {
var goldHeart = goldHeartCollectibles[i];
goldHeart.update();
if (goldHeart.x < -200) {
goldHeart.destroy();
goldHeartCollectibles.splice(i, 1);
continue;
}
// Collision detection (AABB)
var carLeft = car.x - car.bodyWidth / 2 + 20;
var carRight = car.x + car.bodyWidth / 2 - 20;
var carTop = car.y - car.bodyHeight;
var carBottom = car.y;
var goldLeft = goldHeart.x - goldHeart.bodyWidth / 2;
var goldRight = goldHeart.x + goldHeart.bodyWidth / 2;
var goldTop = goldHeart.y - goldHeart.bodyHeight;
var goldBottom = goldHeart.y;
var intersect = !(carRight < goldLeft || carLeft > goldRight || carBottom < goldTop + 10 || carTop > goldBottom - 10);
if (intersect) {
// Activate gold heart mode
goldHeartActive = true;
goldHeartTimer = 0;
// Fill lives to max when gold heart is collected
lives = maxLives;
// Cap goldHeartDisplayLives to 9 to prevent overflow
goldHeartDisplayLives = lives > 9 ? 9 : lives;
updateLivesDisplay();
// Remove the gold heart collectible
goldHeart.destroy();
goldHeartCollectibles.splice(i, 1);
continue;
}
}
// --- Coin collectibles update and collision ---
for (var i = coinCollectibles.length - 1; i >= 0; i--) {
var coin = coinCollectibles[i];
coin.update();
if (coin.x < -200) {
coin.destroy();
coinCollectibles.splice(i, 1);
continue;
}
// Collision detection (AABB)
var carLeft = car.x - car.bodyWidth / 2 + 20;
var carRight = car.x + car.bodyWidth / 2 - 20;
var carTop = car.y - car.bodyHeight;
var carBottom = car.y;
var coinLeft = coin.x - coin.bodyWidth / 2;
var coinRight = coin.x + coin.bodyWidth / 2;
var coinTop = coin.y - coin.bodyHeight;
var coinBottom = coin.y;
var intersect = !(carRight < coinLeft || carLeft > coinRight || carBottom < coinTop + 10 || carTop > coinBottom - 10);
if (intersect) {
// Add coin, persistently
coins++;
storage.coins = coins;
updateCoinDisplay();
coin.destroy();
coinCollectibles.splice(i, 1);
continue;
}
}
// Gold heart timer logic
if (goldHeartActive) {
goldHeartTimer++;
if (goldHeartTimer >= goldHeartDuration) {
goldHeartActive = false;
goldHeartTimer = 0;
updateLivesDisplay();
}
}
// Spawn new obstacles
if (obstacles.length === 0 || obstacles.length > 0 && obstacles[obstacles.length - 1].x < 2048 - getNextGap()) {
var obs = new Obstacle();
obs.x = 2048 + 100;
obs.y = groundY;
game.addChild(obs);
obstacles.push(obs);
}
// --- Spawn heart collectibles and coins occasionally ---
if ((heartCollectibles.length === 0 || heartCollectibles.length > 0 && heartCollectibles[heartCollectibles.length - 1].x < 2048 - getNextHeartGap()) && goldHeartCollectibles.length === 0 // Only one gold heart at a time
) {
var rand = Math.random();
if (rand < 0.02) {
// 2% chance: spawn gold heart
var goldHeart = new GoldHeartCollectible();
goldHeart.x = 2048 + 200 + Math.floor(Math.random() * 600);
goldHeart.y = groundY - 180 - Math.floor(Math.random() * 200);
game.addChild(goldHeart);
goldHeartCollectibles.push(goldHeart);
} else if (rand < 0.44) {
// 39% chance: spawn normal heart (reduced by 1%)
var heart = new HeartCollectible();
heart.x = 2048 + 200 + Math.floor(Math.random() * 600);
heart.y = groundY - 180 - Math.floor(Math.random() * 200);
game.addChild(heart);
heartCollectibles.push(heart);
} else if (rand < 0.85) {
// 40% chance: spawn coin
var coin = new CoinCollectible();
coin.x = 2048 + 200 + Math.floor(Math.random() * 600);
coin.y = groundY - 180 - Math.floor(Math.random() * 200);
game.addChild(coin);
coinCollectibles.push(coin);
}
}
};
// Helper: get next gap (randomized, gets smaller as speed increases)
function getNextGap() {
var minGap = obstacleMinGap + 400 - Math.floor((gameSpeed - initialGameSpeed) * 10);
var maxGap = obstacleMaxGap + 600 - Math.floor((gameSpeed - initialGameSpeed) * 12);
if (minGap < 720) minGap = 720;
if (maxGap < 1000) maxGap = 1000;
// 45% chance to make a much wider gap, otherwise normal
if (Math.random() < 0.45) {
// Extra wide gap (make even wider)
var extraMin = maxGap + 700;
var extraMax = maxGap + 1600;
return extraMin + Math.floor(Math.random() * (extraMax - extraMin));
} else {
// Normal gap
return minGap + Math.floor(Math.random() * (maxGap - minGap));
}
}
// Helper: get next heart collectible gap (randomized, not too frequent)
function getNextHeartGap() {
// Hearts are less frequent than obstacles
var minGap = 1200;
var maxGap = 2200;
return minGap + Math.floor(Math.random() * (maxGap - minGap));
}
// Reset score and lives on game start
LK.setScore(0);
score = 0;
// On game start, reset maxLives to 3, but if lives was higher, keep it (up to 9)
if (lives > 3) {
maxLives = lives > 9 ? 9 : lives;
} else {
maxLives = 3;
}
lives = maxLives;
scoreTxt.setText(score);
lastScoreTxt.setText("");
updateLivesDisplay();
heartCollectibles = [];
goldHeartCollectibles = [];
coinCollectibles = [];
goldHeartActive = false;
goldHeartTimer = 0;
goldHeartDisplayLives = 0;
updateCoinDisplay();
if ((storage.highestScore || highestScore) > 0) {
highestScoreTxt.setText("En Yüksek Skor: " + (storage.highestScore || highestScore));
} else {
highestScoreTxt.setText("");
}
// Show leaderboard button in the top GUI, right side
var leaderboardBtn = new Text2("🏆", {
size: 110,
fill: 0xffff00
});
leaderboardBtn.anchor.set(1, 0); // right-top
leaderboardBtn.x = -40; // offset from right edge
leaderboardBtn.y = 0;
leaderboardBtn.interactive = true;
leaderboardBtn.buttonMode = true;
leaderboardBtn.down = function (x, y, obj) {
LK.showLeaderboard();
};
LK.gui.topRight.addChild(leaderboardBtn); ===================================================================
--- original.js
+++ change.js
@@ -246,8 +246,16 @@
// Wheel: black ellipse
// Obstacle: red box
// Road: dark gray box
// Jump sound
+function _typeof(o) {
+ "@babel/helpers - typeof";
+ return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) {
+ return typeof o;
+ } : function (o) {
+ return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o;
+ }, _typeof(o);
+}
var groundY = 2200; // y position of the road top
var gravity = 4.5;
var jumpVelocity = -80;
var initialGameSpeed = 24;
@@ -401,46 +409,57 @@
// --- Car Selection Overlay ---
var gameStarted = false;
var carSelected = false;
var selectedCarType = null;
+// --- SHOP SYSTEM ---
+// List of cars for shop (can be expanded)
var carTypes = [{
id: 'car',
name: 'Kırmızı Araba',
- asset: 'car'
+ asset: 'car',
+ price: 0 // Free
}, {
id: 'araba2',
name: 'Mavi Araba',
- asset: 'araba2'
+ asset: 'araba2',
+ price: 0 // Free
}];
-var carSelectionOverlay = new Container();
-var carSelBg = LK.getAsset('road', {
+// Persistent unlocked cars (load from storage, default to only 'car' unlocked)
+var unlockedCars = _typeof(storage.unlockedCars) === "object" && storage.unlockedCars instanceof Array ? storage.unlockedCars : typeof storage.unlockedCars === "string" ? storage.unlockedCars.split(",") : ['car'];
+if (unlockedCars.indexOf('car') === -1) unlockedCars.push('car'); // Always unlock default
+function saveUnlockedCars() {
+ storage.unlockedCars = unlockedCars.join(",");
+}
+// --- SHOP OVERLAY ---
+var shopOverlay = new Container();
+var shopBg = LK.getAsset('road', {
anchorX: 0,
anchorY: 0,
x: 0,
y: 0,
width: 2048,
height: 2732
});
-carSelBg.alpha = 0.82;
-carSelectionOverlay.addChild(carSelBg);
-var carSelTitle = new Text2("Araba Seç", {
+shopBg.alpha = 0.82;
+shopOverlay.addChild(shopBg);
+var shopTitle = new Text2("Dükkan", {
size: 180,
fill: 0xffffff
});
-carSelTitle.anchor.set(0.5, 0.5);
-carSelTitle.x = 2048 / 2;
-carSelTitle.y = 600;
-carSelectionOverlay.addChild(carSelTitle);
-var carSelText = new Text2("Oynamak için bir araba seç", {
+shopTitle.anchor.set(0.5, 0.5);
+shopTitle.x = 2048 / 2;
+shopTitle.y = 600;
+shopOverlay.addChild(shopTitle);
+var shopText = new Text2("Arabaları ücretsiz olarak aç ve seç", {
size: 90,
fill: 0xffd700
});
-carSelText.anchor.set(0.5, 0.5);
-carSelText.x = 2048 / 2;
-carSelText.y = 800;
-carSelectionOverlay.addChild(carSelText);
-// Car option visuals
-var carOptionNodes = [];
+shopText.anchor.set(0.5, 0.5);
+shopText.x = 2048 / 2;
+shopText.y = 800;
+shopOverlay.addChild(shopText);
+// Car option visuals in shop
+var shopCarNodes = [];
for (var i = 0; i < carTypes.length; i++) {
var carType = carTypes[i];
var xPos = 2048 / 2 + (i - (carTypes.length - 1) / 2) * 500;
var carNode = new Container();
@@ -460,27 +479,154 @@
carLabel.anchor.set(0.5, 0);
carLabel.x = 0;
carLabel.y = carImg.height / 2 + 30;
carNode.addChild(carLabel);
- carNode.x = xPos;
- carNode.y = 1100;
- carNode.interactive = true;
- carNode.buttonMode = true;
+ // Unlock/Select button
+ var isUnlocked = unlockedCars.indexOf(carType.id) !== -1;
+ var btnText = isUnlocked ? "Seç" : "Ücretsiz Aç";
+ var btnColor = isUnlocked ? 0x00e676 : 0xffd700;
+ var btn = new Text2(btnText, {
+ size: 60,
+ fill: btnColor
+ });
+ btn.anchor.set(0.5, 0);
+ btn.x = 0;
+ btn.y = carLabel.y + 90;
+ btn.interactive = true;
+ btn.buttonMode = true;
// Store index for selection
- carNode._carTypeIndex = i;
- carNode.down = function (x, y, obj) {
- if (!carSelected && !gameStarted) {
- var idx = this._carTypeIndex;
- selectedCarType = carTypes[idx].id;
+ btn._carTypeIndex = i;
+ btn._isUnlocked = isUnlocked;
+ btn.down = function (x, y, obj) {
+ var idx = this._carTypeIndex;
+ var carType = carTypes[idx];
+ var isUnlocked = unlockedCars.indexOf(carType.id) !== -1;
+ if (!isUnlocked) {
+ // Unlock for free
+ unlockedCars.push(carType.id);
+ saveUnlockedCars();
+ this.setText("Seç");
+ this.style.fill = 0x00e676;
+ this._isUnlocked = true;
+ } else {
+ // Select car and go to car selection overlay
+ selectedCarType = carType.id;
carSelected = true;
- carSelectionOverlay.visible = false;
- startOverlay.visible = true;
+ shopOverlay.visible = false;
+ carSelectionOverlay.visible = true;
+ // Update car selection overlay to highlight selected car
+ updateCarSelectionOverlay();
}
};
- carSelectionOverlay.addChild(carNode);
- carOptionNodes.push(carNode);
+ carNode.addChild(btn);
+ carNode.x = xPos;
+ carNode.y = 1100;
+ shopOverlay.addChild(carNode);
+ shopCarNodes.push(carNode);
}
+game.addChild(shopOverlay);
+// --- CAR SELECTION OVERLAY ---
+var carSelectionOverlay = new Container();
+var carSelBg = LK.getAsset('road', {
+ anchorX: 0,
+ anchorY: 0,
+ x: 0,
+ y: 0,
+ width: 2048,
+ height: 2732
+});
+carSelBg.alpha = 0.82;
+carSelectionOverlay.addChild(carSelBg);
+var carSelTitle = new Text2("Araba Seç", {
+ size: 180,
+ fill: 0xffffff
+});
+carSelTitle.anchor.set(0.5, 0.5);
+carSelTitle.x = 2048 / 2;
+carSelTitle.y = 600;
+carSelectionOverlay.addChild(carSelTitle);
+var carSelText = new Text2("Oynamak için bir araba seç", {
+ size: 90,
+ fill: 0xffd700
+});
+carSelText.anchor.set(0.5, 0.5);
+carSelText.x = 2048 / 2;
+carSelText.y = 800;
+carSelectionOverlay.addChild(carSelText);
+// Car option visuals for selection
+var carOptionNodes = [];
+function updateCarSelectionOverlay() {
+ // Remove old nodes
+ for (var i = 0; i < carOptionNodes.length; i++) {
+ carSelectionOverlay.removeChild(carOptionNodes[i]);
+ }
+ carOptionNodes = [];
+ for (var i = 0; i < carTypes.length; i++) {
+ var carType = carTypes[i];
+ var xPos = 2048 / 2 + (i - (carTypes.length - 1) / 2) * 500;
+ var carNode = new Container();
+ var carImg = LK.getAsset(carType.asset, {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ x: 0,
+ y: 0,
+ scaleX: 2.2,
+ scaleY: 2.2
+ });
+ carNode.addChild(carImg);
+ var carLabel = new Text2(carType.name, {
+ size: 70,
+ fill: 0xffffff
+ });
+ carLabel.anchor.set(0.5, 0);
+ carLabel.x = 0;
+ carLabel.y = carImg.height / 2 + 30;
+ carNode.addChild(carLabel);
+ // Only allow selection if unlocked
+ var isUnlocked = unlockedCars.indexOf(carType.id) !== -1;
+ var selectBtn = new Text2(isUnlocked ? "Seç" : "Kilitli", {
+ size: 60,
+ fill: isUnlocked ? 0x00e676 : 0x888888
+ });
+ selectBtn.anchor.set(0.5, 0);
+ selectBtn.x = 0;
+ selectBtn.y = carLabel.y + 90;
+ selectBtn.interactive = isUnlocked;
+ selectBtn.buttonMode = isUnlocked;
+ selectBtn._carTypeIndex = i;
+ selectBtn.down = function (x, y, obj) {
+ var idx = this._carTypeIndex;
+ var carType = carTypes[idx];
+ if (unlockedCars.indexOf(carType.id) !== -1) {
+ selectedCarType = carType.id;
+ carSelected = true;
+ carSelectionOverlay.visible = false;
+ startOverlay.visible = true;
+ }
+ };
+ carNode.addChild(selectBtn);
+ // Highlight selected car
+ if (selectedCarType === carType.id) {
+ var highlight = new Text2("✓", {
+ size: 80,
+ fill: 0x00e676
+ });
+ highlight.anchor.set(0.5, 1);
+ highlight.x = 0;
+ highlight.y = -carImg.height / 2 - 20;
+ carNode.addChild(highlight);
+ }
+ carNode.x = xPos;
+ carNode.y = 1100;
+ carSelectionOverlay.addChild(carNode);
+ carOptionNodes.push(carNode);
+ }
+}
+updateCarSelectionOverlay();
game.addChild(carSelectionOverlay);
+// Show shop overlay at game start, hide others
+shopOverlay.visible = true;
+carSelectionOverlay.visible = false;
// --- Start Screen Overlay ---
var startOverlay = new Container();
var startBg = LK.getAsset('road', {
anchorX: 0,
red car and driver. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
sarı renkli "Stop" tabelası. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
a human. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
altın para, berrak. In-Game asset. 2d. High contrast. No shadows
pixelart, cloud. In-Game asset. 2d. High contrast. No shadows
dark green car and driver. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
blue car and driver. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat