User prompt
hala geri gidiyor tek sorunun geri gitmesi başka sorun yok
User prompt
kuşun ileri veya geri gittiğini kontrol eden bir şey yap ve düzelt
User prompt
sen ileri ve geriyi bilmiyorsan sana şöyle söyleyeyim duvarların olduğu kısma doğru ilerlemesi gerekiyor sen yanlış yöne yönlendiriyorsun kuşu
User prompt
O zaman şunu da şöyle çözelim. Eğer kuş arkaya doğru ilerlemeye başlarsa bunu engelleyen ve öne doğru gitmesi için oluşan bir kod olsun.
User prompt
Kuş hala geriyə doğru ilərləyir. Düzəltəmiyorsan, başdan qodla o qısmı.
User prompt
Hala geriye doğru ilerliyor.
User prompt
Kuşun geriye doğru ilerlemesi ile ilgili bir hata var. Düzelt. İleri doğru ilerlemesi lazım.
User prompt
2 duvarı da koyu ve renge boya ve daha gerçekçi hale getir Flappy Bird oyunundaki gibi olsunlar
User prompt
hata vermeden oyundaki tüm hataları düzelt
User prompt
Kuşun ileri doğru ilerlemesi lazım.
User prompt
Kuş hala geriye doğru ilerliyor.
User prompt
Kuş yere çarptığında oyun bitiş menüsü çıkmıyor, kuş geriye doğru ilerliyor.
User prompt
Oyundaki tüm hataları düzelt ve daha düzgün hale getir.
User prompt
Duvarlar Flappy Bird'teki gibi yeşil, koyu ve böyle aynı oyundaki gibi renge sahip değil. Değiştir ve gerçekçiliğini artır.
User prompt
Oyundaki duvar görüntülerini daha düzgün, daha kaliteli, kasmayan ve daha gerçekçi bir hale getir. Gerçek Flappy Bird oyunundaki gibi olsun.
User prompt
Ayarlar ile ilgili herşeyi sil.
User prompt
Hız ayarlama düğmesinin bazı görünümleri kalmış onları da kaldır.
User prompt
Ayarlar kısmındaki hız sistemini tamamen kaldır.
User prompt
Ən iyi skoru oyundan çıxsaq bilə qaydat. ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Duvarlar arası boşluğu biraz yani onlar duvarları birbirinden biraz daha uzaklaştır.
User prompt
hataları gider.
User prompt
eklentileri kaldır basit animasyonlarla hallet
User prompt
Ayarlar kısmında dil seçeneği çalışmıyor. Türkçe ve İngilizce düğmelerini ve dil desteğini düzelt. ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
hız menüsündeki tuşların algılanması için düğmeleri büyüt
User prompt
hız göstergesi olan menüde tuşlar algılamıyor
/****
* Plugins
****/
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var Bird = Container.expand(function () {
var self = Container.call(this);
// Create bird graphics with proper anchoring
var birdGraphics = self.attachAsset('bird', {
anchorX: 0.5,
anchorY: 0.5
});
// Initialize bird properties
self.velocity = 0;
self.flapCooldown = 0;
// Optimized flap function
self.flap = function () {
// Prevent rapid flapping
if (self.flapCooldown > 0) return;
self.flapCooldown = 8; // Frames to wait before next flap
// Set velocity with improved scaling for better responsiveness
self.velocity = baseJumpStrength * (gameSpeed * 1.1);
// Play flap sound with minimal error handling
try {
LK.getSound('flap').play();
} catch (e) {
// Silent fail
}
};
// Remove idle animation function
self.startIdleAnimation = function () {
// No animation needed
};
// Optimized update method
self.update = function () {
// Update cooldowns
if (self.flapCooldown > 0) self.flapCooldown--;
if (!gameStarted) {
// Pre-game idle state
self.velocity = 0;
self.y = 1366;
return;
}
// Simple physics with improved scaling
self.velocity += baseGravity * (gameSpeed * 1.05);
self.y += self.velocity;
// Minimal rotation calculation - only every 10 frames
if (LK.ticks % 10 === 0) {
birdGraphics.rotation = self.velocity > 0 ? 0.8 : -0.4;
}
// Screen bounds collision
if (self.y < 40) {
self.y = 40;
self.velocity = 0;
}
if (self.y > 2582) {
self.y = 2582;
self.velocity = 0;
}
};
return self;
});
var Pipe = Container.expand(function (gapCenterY) {
var self = Container.call(this);
// Better balanced gap sizes for different speeds - increased for easier navigation
if (gameSpeed === 1) {
self.gapSize = 850; // Normal gap - increased for easier passage
} else if (gameSpeed === 1.5) {
self.gapSize = 870; // Slightly larger gap for 1.5x
} else if (gameSpeed === 2) {
self.gapSize = 890; // Larger gap for 2x
} else if (gameSpeed === 2.5) {
self.gapSize = 910; // Largest gap for 2.5x
} else {
self.gapSize = 850 + (gameSpeed - 1) * 20; // Fallback formula
}
self.speed = basePipeSpeed * gameSpeed;
self.passed = false;
self.gapCenterY = gapCenterY;
self.pipeWidth = 120;
// Calculate pipe heights
var topPipeHeight = Math.max(200, gapCenterY - self.gapSize / 2);
var bottomPipeHeight = Math.max(200, 2732 - 150 - (gapCenterY + self.gapSize / 2));
// Simple top pipe - single element
var topPipe = self.attachAsset('topPipe', {
anchorX: 0.5,
anchorY: 1
});
topPipe.y = gapCenterY - self.gapSize / 2;
topPipe.height = topPipeHeight;
topPipe.width = self.pipeWidth;
topPipe.tint = 0x228b22;
// Simple bottom pipe - single element
var bottomPipe = self.attachAsset('bottomPipe', {
anchorX: 0.5,
anchorY: 0
});
bottomPipe.y = gapCenterY + self.gapSize / 2;
bottomPipe.height = bottomPipeHeight;
bottomPipe.width = self.pipeWidth;
bottomPipe.tint = 0x228b22;
// Simple pipe caps
var topPipeCap = self.attachAsset('pipeTop', {
anchorX: 0.5,
anchorY: 1
});
topPipeCap.y = gapCenterY - self.gapSize / 2;
topPipeCap.width = self.pipeWidth + 20;
topPipeCap.height = 25;
topPipeCap.tint = 0x32cd32;
var bottomPipeCap = self.attachAsset('pipeBottom', {
anchorX: 0.5,
anchorY: 0
});
bottomPipeCap.y = gapCenterY + self.gapSize / 2;
bottomPipeCap.width = self.pipeWidth + 20;
bottomPipeCap.height = 25;
bottomPipeCap.tint = 0x32cd32;
self.update = function () {
if (!gameStarted) {
return;
}
// Use pre-calculated speed instead of calculating every frame
self.x += self.speed;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game();
/****
* Game Code
****/
// Initialize persistent storage using storage plugin
var currentLanguage = storage.language || 'tr';
var gameHighScore = storage.highScore || 0;
// Simple animation helpers without tween plugin
function simpleScale(target, endScale, duration, callback) {
var startScale = target.scaleX || 1;
var startTime = LK.ticks;
var totalFrames = Math.floor(duration / 16.67); // 60fps
var frameCount = 0;
var animateInterval = LK.setInterval(function () {
frameCount++;
var progress = frameCount / totalFrames;
if (progress >= 1) {
progress = 1;
LK.clearInterval(animateInterval);
if (callback) callback();
}
var currentScale = startScale + (endScale - startScale) * progress;
target.scaleX = currentScale;
target.scaleY = currentScale;
}, 16);
}
function simpleColorTint(target, color, duration, callback) {
var originalTint = target.tint;
target.tint = color;
if (duration > 0) {
LK.setTimeout(function () {
target.tint = originalTint;
if (callback) callback();
}, duration);
} else if (callback) {
callback();
}
}
var bird;
var pipes = [];
var ground;
var gameStarted = false;
var gameOver = false;
var showMainMenu = true;
var showGameOver = false;
var lastButtonClickTime = 0; // Track last button click time
var gameSpeed = 1; // Current game speed multiplier (1 = normal, 2 = 2x, 3 = 3x)
var baseGravity = 0.55; // Base gravity for bird - fine-tuned for better control
var baseJumpStrength = -9.5; // Base jump strength for bird - fine-tuned for better balance
var basePipeSpeed = -3.5; // Base pipe movement speed - increased for better challenge
// Initialize game speed properly
gameSpeed = 1;
// Initialize storage with defaults
var _storage = storage;
// Create score text display
var scoreTxt = new Text2('0', {
size: 150,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
scoreTxt.stroke = 0x000000;
scoreTxt.strokeThickness = 5;
var lastScoreDisplayed = -1; // Cache last displayed score
try {
if (LK.gui && LK.gui.top) {
LK.gui.top.addChild(scoreTxt);
}
} catch (e) {
console.log("GUI score text error:", e);
}
// Create cup shape for score
var cupShape;
try {
cupShape = LK.getAsset('cup', {
anchorX: 0.5,
anchorY: 0
});
cupShape.tint = 0xFFD700;
if (LK.gui && LK.gui.bottomRight) {
LK.gui.bottomRight.addChild(cupShape);
cupShape.y = -230;
cupShape.x = -100;
}
} catch (e) {
console.log("Cup shape error:", e);
}
// Create main menu elements
var mainMenuTitle = new Text2('FLAPPY BIRD', {
size: 90,
fill: 0xFFD700
});
mainMenuTitle.anchor.set(0.5, 0.5);
mainMenuTitle.stroke = 0x000000;
mainMenuTitle.strokeThickness = 5;
try {
if (LK.gui && LK.gui.center) {
LK.gui.center.addChild(mainMenuTitle);
mainMenuTitle.y = -280;
}
} catch (e) {
console.log("Main menu title error:", e);
}
// Create instruction text
var instructionTxt = new Text2('TIKLA VE OYNA!', {
size: 50,
fill: 0xFFFFFF
});
instructionTxt.anchor.set(0.5, 0.5);
instructionTxt.stroke = 0x000000;
instructionTxt.strokeThickness = 3;
instructionTxt.visible = false;
instructionTxt.y = -50;
// Remove background shape for instruction text - no longer needed
LK.gui.center.addChild(instructionTxt);
// Create game over screen elements
var gameOverBg = LK.getAsset('topPipe', {
anchorX: 0.5,
anchorY: 0.5,
width: 1600,
height: 1200,
alpha: 0.95
});
gameOverBg.tint = 0x2F4F4F;
gameOverBg.visible = false;
LK.gui.center.addChild(gameOverBg);
var gameOverTitle = new Text2('OYUN BİTTİ', {
size: 120,
fill: 0xFFFFFF
});
gameOverTitle.anchor.set(0.5, 0.5);
gameOverTitle.stroke = 0x000000;
gameOverTitle.strokeThickness = 6;
gameOverTitle.visible = false;
LK.gui.center.addChild(gameOverTitle);
gameOverTitle.y = -300;
var finalScoreText = new Text2('SKOR: 0', {
size: 80,
fill: 0xFFFFFF
});
finalScoreText.anchor.set(0.5, 0.5);
finalScoreText.stroke = 0x000000;
finalScoreText.strokeThickness = 4;
finalScoreText.visible = false;
LK.gui.center.addChild(finalScoreText);
finalScoreText.y = -150;
var bestScoreText = new Text2('EN İYİ: 0', {
size: 60,
fill: 0xFFD700
});
bestScoreText.anchor.set(0.5, 0.5);
bestScoreText.stroke = 0x000000;
bestScoreText.strokeThickness = 3;
bestScoreText.visible = false;
LK.gui.center.addChild(bestScoreText);
bestScoreText.y = -50;
// Create retry button with enhanced styling
var retryButton = LK.getAsset('playButtonOval', {
anchorX: 0.5,
anchorY: 0.5,
width: 380,
height: 110,
alpha: 1.0
});
retryButton.tint = 0xFF9800; // Orange like original Flappy Bird
retryButton.visible = false;
LK.gui.center.addChild(retryButton);
retryButton.y = 100;
// Add retry button shadow for depth
var retryButtonShadow = LK.getAsset('playButtonOval', {
anchorX: 0.5,
anchorY: 0.5,
width: 380,
height: 110,
alpha: 0.3
});
retryButtonShadow.tint = 0xE65100; // Darker orange shadow
retryButtonShadow.visible = false;
LK.gui.center.addChild(retryButtonShadow);
retryButtonShadow.y = 108; // Offset shadow slightly down
retryButtonShadow.x = 4; // Offset shadow slightly right
// Add retry button highlight
var retryButtonHighlight = LK.getAsset('playButtonOval', {
anchorX: 0.5,
anchorY: 0.5,
width: 350,
height: 85,
alpha: 0.4
});
retryButtonHighlight.tint = 0xFFB74D; // Lighter orange highlight
retryButtonHighlight.visible = false;
LK.gui.center.addChild(retryButtonHighlight);
retryButtonHighlight.y = 92; // Offset highlight slightly up
var retryButtonText = new Text2('TEKRAR DENE', {
size: 44,
fill: 0xFFFFFF
});
retryButtonText.anchor.set(0.5, 0.5);
retryButtonText.stroke = 0xE65100;
retryButtonText.strokeThickness = 3;
retryButtonText.visible = false;
LK.gui.center.addChild(retryButtonText);
retryButtonText.y = 100;
// Create menu button with enhanced styling
var menuButton = LK.getAsset('playButtonOval', {
anchorX: 0.5,
anchorY: 0.5,
width: 380,
height: 110,
alpha: 1.0
});
menuButton.tint = 0xF44336; // Red like original Flappy Bird
menuButton.visible = false;
LK.gui.center.addChild(menuButton);
menuButton.y = 250;
// Add menu button shadow for depth
var menuButtonShadow = LK.getAsset('playButtonOval', {
anchorX: 0.5,
anchorY: 0.5,
width: 380,
height: 110,
alpha: 0.3
});
menuButtonShadow.tint = 0xD32F2F; // Darker red shadow
menuButtonShadow.visible = false;
LK.gui.center.addChild(menuButtonShadow);
menuButtonShadow.y = 258; // Offset shadow slightly down
menuButtonShadow.x = 4; // Offset shadow slightly right
// Add menu button highlight
var menuButtonHighlight = LK.getAsset('playButtonOval', {
anchorX: 0.5,
anchorY: 0.5,
width: 350,
height: 85,
alpha: 0.4
});
menuButtonHighlight.tint = 0xEF5350; // Lighter red highlight
menuButtonHighlight.visible = false;
LK.gui.center.addChild(menuButtonHighlight);
menuButtonHighlight.y = 242; // Offset highlight slightly up
var menuButtonText = new Text2('ANA MENÜ', {
size: 44,
fill: 0xFFFFFF
});
menuButtonText.anchor.set(0.5, 0.5);
menuButtonText.stroke = 0xD32F2F;
menuButtonText.strokeThickness = 3;
menuButtonText.visible = false;
LK.gui.center.addChild(menuButtonText);
menuButtonText.y = 250;
// Create separate settings button element
var settingsButton = LK.getAsset('playButtonOval', {
anchorX: 0.5,
anchorY: 0.5,
width: 100,
height: 100,
alpha: 1.0
});
settingsButton.tint = 0x8E44AD;
try {
if (LK.gui && LK.gui.topRight) {
LK.gui.topRight.addChild(settingsButton);
settingsButton.x = -80;
settingsButton.y = 80;
}
} catch (e) {
console.log("Settings button error:", e);
}
// Create separate settings button shadow element
var settingsButtonShadow = LK.getAsset('playButtonOval', {
anchorX: 0.5,
anchorY: 0.5,
width: 100,
height: 100,
alpha: 0.3
});
settingsButtonShadow.tint = 0x6B2C91; // Darker purple shadow
try {
if (LK.gui && LK.gui.topRight) {
LK.gui.topRight.addChild(settingsButtonShadow);
settingsButtonShadow.x = -77;
settingsButtonShadow.y = 83;
}
} catch (e) {
console.log("Settings button shadow error:", e);
}
// Create separate settings button highlight element
var settingsButtonHighlight = LK.getAsset('playButtonOval', {
anchorX: 0.5,
anchorY: 0.5,
width: 85,
height: 85,
alpha: 0.4
});
settingsButtonHighlight.tint = 0xBB8FCE; // Lighter purple highlight
try {
if (LK.gui && LK.gui.topRight) {
LK.gui.topRight.addChild(settingsButtonHighlight);
settingsButtonHighlight.x = -80;
settingsButtonHighlight.y = 77;
}
} catch (e) {
console.log("Settings button highlight error:", e);
}
// Create separate settings icon text element
var settingsIcon = new Text2('⚙', {
size: 60,
fill: 0xFFFFFF
});
settingsIcon.anchor.set(0.5, 0.5);
settingsIcon.stroke = 0x6B2C91;
settingsIcon.strokeThickness = 2;
try {
if (LK.gui && LK.gui.topRight) {
LK.gui.topRight.addChild(settingsIcon);
settingsIcon.x = -80;
settingsIcon.y = 80;
}
} catch (e) {
console.log("Settings icon error:", e);
}
// Create settings menu overlay (initially hidden)
var settingsOverlay = LK.getAsset('topPipe', {
anchorX: 0.5,
anchorY: 0.5,
width: 2048,
height: 2732,
alpha: 1.0
});
settingsOverlay.tint = 0x2F4F4F;
settingsOverlay.visible = false;
LK.gui.center.addChild(settingsOverlay);
var settingsTitle = new Text2('AYARLAR', {
size: 100,
fill: 0xFFFFFF
});
settingsTitle.anchor.set(0.5, 0.5);
settingsTitle.stroke = 0x000000;
settingsTitle.strokeThickness = 5;
settingsTitle.visible = false;
LK.gui.center.addChild(settingsTitle);
settingsTitle.y = -300;
// Create close settings button with modern rectangular design
var closeSettingsButton = LK.getAsset('settingsButtonRect', {
anchorX: 0.5,
anchorY: 0.5,
width: 260,
height: 70,
alpha: 1.0
});
closeSettingsButton.tint = 0x95A5A6;
closeSettingsButton.visible = false;
LK.gui.center.addChild(closeSettingsButton);
closeSettingsButton.y = 150;
// Add close button shadow for depth
var closeSettingsButtonShadow = LK.getAsset('settingsButtonRect', {
anchorX: 0.5,
anchorY: 0.5,
width: 260,
height: 70,
alpha: 0.3
});
closeSettingsButtonShadow.tint = 0x7F8C8D;
closeSettingsButtonShadow.visible = false;
LK.gui.center.addChild(closeSettingsButtonShadow);
closeSettingsButtonShadow.y = 155;
closeSettingsButtonShadow.x = 3;
// Add close button highlight
var closeSettingsButtonHighlight = LK.getAsset('settingsButtonRect', {
anchorX: 0.5,
anchorY: 0.5,
width: 240,
height: 55,
alpha: 0.4
});
closeSettingsButtonHighlight.tint = 0xBDC3C7;
closeSettingsButtonHighlight.visible = false;
LK.gui.center.addChild(closeSettingsButtonHighlight);
closeSettingsButtonHighlight.y = 145;
var closeSettingsText = new Text2('KAPAT', {
size: 36,
fill: 0xFFFFFF
});
closeSettingsText.anchor.set(0.5, 0.5);
closeSettingsText.stroke = 0x7F8C8D;
closeSettingsText.strokeThickness = 2;
closeSettingsText.visible = false;
LK.gui.center.addChild(closeSettingsText);
closeSettingsText.y = 150;
// Create speed menu button with modern rectangular design
var speedMenuButton = LK.getAsset('settingsButtonRect', {
anchorX: 0.5,
anchorY: 0.5,
width: 340,
height: 75,
alpha: 1.0
});
speedMenuButton.tint = 0x3498DB;
speedMenuButton.visible = false;
LK.gui.center.addChild(speedMenuButton);
speedMenuButton.y = -150;
// Add speed button shadow for depth
var speedMenuButtonShadow = LK.getAsset('settingsButtonRect', {
anchorX: 0.5,
anchorY: 0.5,
width: 340,
height: 75,
alpha: 0.3
});
speedMenuButtonShadow.tint = 0x2980B9;
speedMenuButtonShadow.visible = false;
LK.gui.center.addChild(speedMenuButtonShadow);
speedMenuButtonShadow.y = -145;
speedMenuButtonShadow.x = 3;
// Add speed button highlight
var speedMenuButtonHighlight = LK.getAsset('settingsButtonRect', {
anchorX: 0.5,
anchorY: 0.5,
width: 320,
height: 60,
alpha: 0.4
});
speedMenuButtonHighlight.tint = 0x5DADE2;
speedMenuButtonHighlight.visible = false;
LK.gui.center.addChild(speedMenuButtonHighlight);
speedMenuButtonHighlight.y = -155;
var speedMenuText = new Text2('HIZ', {
size: 42,
fill: 0xFFFFFF
});
speedMenuText.anchor.set(0.5, 0.5);
speedMenuText.stroke = 0x2980B9;
speedMenuText.strokeThickness = 2;
speedMenuText.visible = false;
LK.gui.center.addChild(speedMenuText);
speedMenuText.y = -150;
// Create language menu button with modern rectangular design
var languageMenuButton = LK.getAsset('settingsButtonRect', {
anchorX: 0.5,
anchorY: 0.5,
width: 340,
height: 75,
alpha: 1.0
});
languageMenuButton.tint = 0x9B59B6;
languageMenuButton.visible = false;
LK.gui.center.addChild(languageMenuButton);
languageMenuButton.y = -20;
// Add language button shadow for depth
var languageMenuButtonShadow = LK.getAsset('settingsButtonRect', {
anchorX: 0.5,
anchorY: 0.5,
width: 340,
height: 75,
alpha: 0.3
});
languageMenuButtonShadow.tint = 0x8E44AD;
languageMenuButtonShadow.visible = false;
LK.gui.center.addChild(languageMenuButtonShadow);
languageMenuButtonShadow.y = -15;
languageMenuButtonShadow.x = 3;
// Add language button highlight
var languageMenuButtonHighlight = LK.getAsset('settingsButtonRect', {
anchorX: 0.5,
anchorY: 0.5,
width: 320,
height: 60,
alpha: 0.4
});
languageMenuButtonHighlight.tint = 0xBB8FCE;
languageMenuButtonHighlight.visible = false;
LK.gui.center.addChild(languageMenuButtonHighlight);
languageMenuButtonHighlight.y = -25;
var languageMenuText = new Text2('DİL', {
size: 42,
fill: 0xFFFFFF
});
languageMenuText.anchor.set(0.5, 0.5);
languageMenuText.stroke = 0x8E44AD;
languageMenuText.strokeThickness = 2;
languageMenuText.visible = false;
LK.gui.center.addChild(languageMenuText);
languageMenuText.y = -20;
// Create new speed control elements
var speedTitle = new Text2('HIZ AYARI', {
size: 80,
fill: 0xFFFFFF
});
speedTitle.anchor.set(0.5, 0.5);
speedTitle.stroke = 0x000000;
speedTitle.strokeThickness = 4;
speedTitle.visible = false;
LK.gui.center.addChild(speedTitle);
speedTitle.y = -200;
// Create speed option buttons with modern rectangular design
var normalSpeedButton = LK.getAsset('settingsButtonRect', {
anchorX: 0.5,
anchorY: 0.5,
width: 260,
height: 95,
alpha: 1.0
});
normalSpeedButton.tint = 0x27AE60;
normalSpeedButton.visible = false;
LK.gui.center.addChild(normalSpeedButton);
normalSpeedButton.y = -80;
normalSpeedButton.x = -300;
// Add normal speed button shadow
var normalSpeedButtonShadow = LK.getAsset('settingsButtonRect', {
anchorX: 0.5,
anchorY: 0.5,
width: 260,
height: 95,
alpha: 0.3
});
normalSpeedButtonShadow.tint = 0x1E8449;
normalSpeedButtonShadow.visible = false;
LK.gui.center.addChild(normalSpeedButtonShadow);
normalSpeedButtonShadow.y = -75;
normalSpeedButtonShadow.x = -297;
// Add normal speed button highlight
var normalSpeedButtonHighlight = LK.getAsset('settingsButtonRect', {
anchorX: 0.5,
anchorY: 0.5,
width: 240,
height: 80,
alpha: 0.4
});
normalSpeedButtonHighlight.tint = 0x58D68D;
normalSpeedButtonHighlight.visible = false;
LK.gui.center.addChild(normalSpeedButtonHighlight);
normalSpeedButtonHighlight.y = -85;
normalSpeedButtonHighlight.x = -300;
var normalSpeedText = new Text2('NORMAL', {
size: 32,
fill: 0xFFFFFF
});
normalSpeedText.anchor.set(0.5, 0.5);
normalSpeedText.stroke = 0x1E8449;
normalSpeedText.strokeThickness = 2;
normalSpeedText.visible = false;
LK.gui.center.addChild(normalSpeedText);
normalSpeedText.y = -80;
normalSpeedText.x = -300;
var speed15xButton = LK.getAsset('settingsButtonRect', {
anchorX: 0.5,
anchorY: 0.5,
width: 260,
height: 95,
alpha: 1.0
});
speed15xButton.tint = 0xF39C12;
speed15xButton.visible = false;
LK.gui.center.addChild(speed15xButton);
speed15xButton.y = -80;
speed15xButton.x = -100;
// Add 1.5x speed button shadow
var speed15xButtonShadow = LK.getAsset('settingsButtonRect', {
anchorX: 0.5,
anchorY: 0.5,
width: 260,
height: 95,
alpha: 0.3
});
speed15xButtonShadow.tint = 0xD68910;
speed15xButtonShadow.visible = false;
LK.gui.center.addChild(speed15xButtonShadow);
speed15xButtonShadow.y = -75;
speed15xButtonShadow.x = -97;
// Add 1.5x speed button highlight
var speed15xButtonHighlight = LK.getAsset('settingsButtonRect', {
anchorX: 0.5,
anchorY: 0.5,
width: 240,
height: 80,
alpha: 0.4
});
speed15xButtonHighlight.tint = 0xF7DC6F;
speed15xButtonHighlight.visible = false;
LK.gui.center.addChild(speed15xButtonHighlight);
speed15xButtonHighlight.y = -85;
speed15xButtonHighlight.x = -100;
var speed15xText = new Text2('1.5X', {
size: 32,
fill: 0xFFFFFF
});
speed15xText.anchor.set(0.5, 0.5);
speed15xText.stroke = 0xD68910;
speed15xText.strokeThickness = 2;
speed15xText.visible = false;
LK.gui.center.addChild(speed15xText);
speed15xText.y = -80;
speed15xText.x = -100;
var speed2xButton = LK.getAsset('settingsButtonRect', {
anchorX: 0.5,
anchorY: 0.5,
width: 260,
height: 95,
alpha: 1.0
});
speed2xButton.tint = 0xE74C3C;
speed2xButton.visible = false;
LK.gui.center.addChild(speed2xButton);
speed2xButton.y = -80;
speed2xButton.x = 100;
// Add 2x speed button shadow
var speed2xButtonShadow = LK.getAsset('settingsButtonRect', {
anchorX: 0.5,
anchorY: 0.5,
width: 260,
height: 95,
alpha: 0.3
});
speed2xButtonShadow.tint = 0xC0392B;
speed2xButtonShadow.visible = false;
LK.gui.center.addChild(speed2xButtonShadow);
speed2xButtonShadow.y = -75;
speed2xButtonShadow.x = 103;
// Add 2x speed button highlight
var speed2xButtonHighlight = LK.getAsset('settingsButtonRect', {
anchorX: 0.5,
anchorY: 0.5,
width: 240,
height: 80,
alpha: 0.4
});
speed2xButtonHighlight.tint = 0xF1948A;
speed2xButtonHighlight.visible = false;
LK.gui.center.addChild(speed2xButtonHighlight);
speed2xButtonHighlight.y = -85;
speed2xButtonHighlight.x = 100;
var speed2xText = new Text2('2X', {
size: 32,
fill: 0xFFFFFF
});
speed2xText.anchor.set(0.5, 0.5);
speed2xText.stroke = 0xC0392B;
speed2xText.strokeThickness = 2;
speed2xText.visible = false;
LK.gui.center.addChild(speed2xText);
speed2xText.y = -80;
speed2xText.x = 100;
// Create 2.5x speed button
var speed25xButton = LK.getAsset('settingsButtonRect', {
anchorX: 0.5,
anchorY: 0.5,
width: 260,
height: 95,
alpha: 1.0
});
speed25xButton.tint = 0x9C27B0;
speed25xButton.visible = false;
LK.gui.center.addChild(speed25xButton);
speed25xButton.y = -80;
speed25xButton.x = 300;
// Add 2.5x speed button shadow
var speed25xButtonShadow = LK.getAsset('settingsButtonRect', {
anchorX: 0.5,
anchorY: 0.5,
width: 260,
height: 95,
alpha: 0.3
});
speed25xButtonShadow.tint = 0x7B1FA2;
speed25xButtonShadow.visible = false;
LK.gui.center.addChild(speed25xButtonShadow);
speed25xButtonShadow.y = -75;
speed25xButtonShadow.x = 303;
// Add 2.5x speed button highlight
var speed25xButtonHighlight = LK.getAsset('settingsButtonRect', {
anchorX: 0.5,
anchorY: 0.5,
width: 240,
height: 80,
alpha: 0.4
});
speed25xButtonHighlight.tint = 0xBA68C8;
speed25xButtonHighlight.visible = false;
LK.gui.center.addChild(speed25xButtonHighlight);
speed25xButtonHighlight.y = -85;
speed25xButtonHighlight.x = 300;
var speed25xText = new Text2('2.5X', {
size: 32,
fill: 0xFFFFFF
});
speed25xText.anchor.set(0.5, 0.5);
speed25xText.stroke = 0x7B1FA2;
speed25xText.strokeThickness = 2;
speed25xText.visible = false;
LK.gui.center.addChild(speed25xText);
speed25xText.y = -80;
speed25xText.x = 300;
// Current speed indicator
var currentSpeedText = new Text2('MEVCUT: NORMAL', {
size: 50,
fill: 0xFFD700
});
currentSpeedText.anchor.set(0.5, 0.5);
currentSpeedText.stroke = 0x000000;
currentSpeedText.strokeThickness = 3;
currentSpeedText.visible = false;
LK.gui.center.addChild(currentSpeedText);
currentSpeedText.y = 30;
// Create back button for speed controls with modern rectangular design
var speedBackButton = LK.getAsset('settingsButtonRect', {
anchorX: 0.5,
anchorY: 0.5,
width: 220,
height: 65,
alpha: 1.0
});
speedBackButton.tint = 0x7F8C8D;
speedBackButton.visible = false;
LK.gui.center.addChild(speedBackButton);
speedBackButton.y = 150;
// Add speed back button shadow
var speedBackButtonShadow = LK.getAsset('settingsButtonRect', {
anchorX: 0.5,
anchorY: 0.5,
width: 220,
height: 65,
alpha: 0.3
});
speedBackButtonShadow.tint = 0x566573;
speedBackButtonShadow.visible = false;
LK.gui.center.addChild(speedBackButtonShadow);
speedBackButtonShadow.y = 155;
speedBackButtonShadow.x = 3;
// Add speed back button highlight
var speedBackButtonHighlight = LK.getAsset('settingsButtonRect', {
anchorX: 0.5,
anchorY: 0.5,
width: 200,
height: 50,
alpha: 0.4
});
speedBackButtonHighlight.tint = 0xABB2B9;
speedBackButtonHighlight.visible = false;
LK.gui.center.addChild(speedBackButtonHighlight);
speedBackButtonHighlight.y = 145;
var speedBackText = new Text2('GERİ', {
size: 36,
fill: 0xFFFFFF
});
speedBackText.anchor.set(0.5, 0.5);
speedBackText.stroke = 0x566573;
speedBackText.strokeThickness = 2;
speedBackText.visible = false;
LK.gui.center.addChild(speedBackText);
speedBackText.y = 150;
// Simple background setup
var background = game.addChild(LK.getAsset('background', {
anchorX: 0,
anchorY: 0
}));
background.x = 0;
background.y = 0;
background.scaleX = 2;
background.scaleY = 2;
// Create ground
ground = game.addChild(LK.getAsset('ground', {
anchorX: 0,
anchorY: 1
}));
ground.x = 0;
ground.y = 2732;
ground.tint = 0x654321;
// Create bird - position in open area away from any walls
bird = game.addChild(new Bird());
bird.x = 300; // Position bird further back in open area
bird.y = 1366;
// Initialize bird properly
bird.velocity = 0;
// Pre-generate all pipes function
function generateAllPipes() {
// Define safe boundaries for gap center to ensure both pipes have reasonable heights
var minGapY = 700; // Increased minimum gap center position for better clearance
var maxGapY = 1900; // Adjusted maximum gap center position for better clearance
// Generate fewer pipes to prevent memory issues
var totalPipesNeeded = 100; // Reduced from 1000 to 100
var currentX = 1200; // Starting position ahead of bird
var pipeSpacing = 450; // Fixed spacing between pipes
for (var pipeIndex = 0; pipeIndex < totalPipesNeeded; pipeIndex++) {
var gapCenterY;
// Create more varied random patterns with better distribution
var randomPattern = Math.random();
if (randomPattern < 0.4) {
// 40% chance for high gaps (easier to navigate)
gapCenterY = minGapY + Math.random() * 300;
} else if (randomPattern < 0.7) {
// 30% chance for middle gaps (moderate difficulty)
gapCenterY = 1000 + Math.random() * 500;
} else {
// 30% chance for low gaps (more challenging but still passable)
gapCenterY = maxGapY - Math.random() * 300;
}
// Add some variation based on pipe index for progressive difficulty
if (pipeIndex > 10) {
// After pipe 10, make gaps slightly more challenging
var difficultyFactor = Math.min(0.8, pipeIndex / 50); // Max 80% difficulty increase
var centerPull = 1300; // Pull towards center-high area
gapCenterY = gapCenterY + (centerPull - gapCenterY) * difficultyFactor * 0.3;
}
// Ensure the gap stays within safe boundaries
gapCenterY = Math.max(minGapY, Math.min(maxGapY, gapCenterY));
var pipe = new Pipe(gapCenterY);
pipe.x = currentX;
pipe.passed = false;
pipes.push(pipe);
game.addChild(pipe);
// Move to next pipe position
currentX += pipeSpacing;
}
}
// Reset game function
function resetGame() {
// Reset bird - position it in open area with no walls
bird.x = 300; // Position bird in open area
bird.y = 1366;
bird.velocity = 0;
// Clear pipes
for (var i = pipes.length - 1; i >= 0; i--) {
pipes[i].destroy();
}
pipes = [];
// Reset variables
gameStarted = false;
gameOver = false;
showMainMenu = true;
showGameOver = false;
// Hide game over screen
hideGameOverScreen();
LK.setScore(0);
scoreTxt.setText('0');
// Show main menu
mainMenuTitle.visible = true;
// Show play button elements
if (playButton) playButton.visible = true;
if (playButtonShadow) playButtonShadow.visible = true;
if (playButtonHighlight) playButtonHighlight.visible = true;
if (playButtonText) playButtonText.visible = true;
// Show all settings button elements
settingsButton.visible = true;
settingsButtonShadow.visible = true;
settingsButtonHighlight.visible = true;
settingsIcon.visible = true;
// Show cup shape (high score indicator)
if (cupShape) cupShape.visible = true;
// Hide instruction
instructionTxt.visible = false;
generateAllPipes();
}
// Function to start game from main menu
function startGameFromMenu() {
showMainMenu = false;
// Hide main menu elements
mainMenuTitle.visible = false;
// Hide play button elements
if (playButton) playButton.visible = false;
if (playButtonShadow) playButtonShadow.visible = false;
if (playButtonHighlight) playButtonHighlight.visible = false;
if (playButtonText) playButtonText.visible = false;
// Hide all settings button elements
settingsButton.visible = false;
settingsButtonShadow.visible = false;
settingsButtonHighlight.visible = false;
settingsIcon.visible = false;
// Hide cup shape (high score indicator)
if (cupShape) cupShape.visible = false;
// Show instruction
instructionTxt.visible = true;
}
// Function to show game over screen
function showGameOverScreen(finalScore) {
showGameOver = true;
gameStarted = false;
showMainMenu = false;
// Hide instruction
instructionTxt.visible = false;
// Show game over elements
gameOverBg.visible = true;
gameOverTitle.visible = true;
finalScoreText.visible = true;
bestScoreText.visible = true;
retryButton.visible = true;
retryButtonText.visible = true;
retryButtonShadow.visible = true;
retryButtonHighlight.visible = true;
menuButton.visible = true;
menuButtonText.visible = true;
menuButtonShadow.visible = true;
menuButtonHighlight.visible = true;
// Update score displays
finalScoreText.setText(getText('score') + ': ' + finalScore);
// Use proper text sizing
if (finalScoreText.width > 600) {
var newSize = Math.max(50, Math.floor(80 * 600 / finalScoreText.width));
if (finalScoreText.style.size !== newSize) {
finalScoreText.style = {
size: newSize,
fill: finalScoreText.style.fill
};
}
}
// Always show the current high score from persistent storage
var currentHighScore = storage.highScore || 0;
bestScoreText.setText(getText('bestScore') + ': ' + currentHighScore);
// Use proper text sizing
if (bestScoreText.width > 600) {
var newSize = Math.max(40, Math.floor(60 * 600 / bestScoreText.width));
bestScoreText.style = {
size: newSize,
fill: bestScoreText.style.fill
};
}
// Simple game over screen display - no animations
}
// Function to hide game over screen
function hideGameOverScreen() {
showGameOver = false;
// Hide game over elements
gameOverBg.visible = false;
gameOverTitle.visible = false;
finalScoreText.visible = false;
bestScoreText.visible = false;
retryButton.visible = false;
retryButtonText.visible = false;
retryButtonShadow.visible = false;
retryButtonHighlight.visible = false;
menuButton.visible = false;
menuButtonText.visible = false;
menuButtonShadow.visible = false;
menuButtonHighlight.visible = false;
}
// Create speed overlay background - moved to end to ensure it's on top
var speedOverlay = LK.getAsset('topPipe', {
anchorX: 0.5,
anchorY: 0.5,
width: 2048,
height: 2732,
alpha: 1.0
});
speedOverlay.tint = 0x2F4F4F;
speedOverlay.visible = false;
// Add to front to ensure visibility above all other elements
try {
if (LK.gui && LK.gui.center) {
LK.gui.center.addChild(speedOverlay);
}
} catch (e) {
console.log("Speed overlay error:", e);
}
// Re-add all speed control elements after the overlay to ensure they render on top
// Move speed title to front
LK.gui.center.addChild(speedTitle);
// Move all speed buttons to front
LK.gui.center.addChild(normalSpeedButtonShadow);
LK.gui.center.addChild(normalSpeedButton);
LK.gui.center.addChild(normalSpeedButtonHighlight);
LK.gui.center.addChild(normalSpeedText);
LK.gui.center.addChild(speed15xButtonShadow);
LK.gui.center.addChild(speed15xButton);
LK.gui.center.addChild(speed15xButtonHighlight);
LK.gui.center.addChild(speed15xText);
LK.gui.center.addChild(speed2xButtonShadow);
LK.gui.center.addChild(speed2xButton);
LK.gui.center.addChild(speed2xButtonHighlight);
LK.gui.center.addChild(speed2xText);
LK.gui.center.addChild(speed25xButtonShadow);
LK.gui.center.addChild(speed25xButton);
LK.gui.center.addChild(speed25xButtonHighlight);
LK.gui.center.addChild(speed25xText);
LK.gui.center.addChild(currentSpeedText);
LK.gui.center.addChild(speedBackButtonShadow);
LK.gui.center.addChild(speedBackButton);
LK.gui.center.addChild(speedBackButtonHighlight);
LK.gui.center.addChild(speedBackText);
// Create language overlay background
var languageOverlay = LK.getAsset('topPipe', {
anchorX: 0.5,
anchorY: 0.5,
width: 2048,
height: 2732,
alpha: 1.0
});
languageOverlay.tint = 0x2F4F4F;
languageOverlay.visible = false;
LK.gui.center.addChild(languageOverlay);
// Create language control title
var languageTitle = new Text2('DİL SEÇENEKLERİ', {
size: 80,
fill: 0xFFFFFF
});
languageTitle.anchor.set(0.5, 0.5);
languageTitle.stroke = 0x000000;
languageTitle.strokeThickness = 4;
languageTitle.visible = false;
LK.gui.center.addChild(languageTitle);
languageTitle.y = -200;
// Create language option buttons with modern rectangular design
var turkishButton = LK.getAsset('settingsButtonRect', {
anchorX: 0.5,
anchorY: 0.5,
width: 260,
height: 65,
alpha: 1.0
});
turkishButton.tint = 0x27AE60;
turkishButton.visible = false;
LK.gui.center.addChild(turkishButton);
turkishButton.y = -80;
turkishButton.x = -220;
// Add Turkish button shadow
var turkishButtonShadow = LK.getAsset('settingsButtonRect', {
anchorX: 0.5,
anchorY: 0.5,
width: 260,
height: 65,
alpha: 0.3
});
turkishButtonShadow.tint = 0x1E8449;
turkishButtonShadow.visible = false;
LK.gui.center.addChild(turkishButtonShadow);
turkishButtonShadow.y = -75;
turkishButtonShadow.x = -217;
// Add Turkish button highlight
var turkishButtonHighlight = LK.getAsset('settingsButtonRect', {
anchorX: 0.5,
anchorY: 0.5,
width: 240,
height: 50,
alpha: 0.4
});
turkishButtonHighlight.tint = 0x58D68D;
turkishButtonHighlight.visible = false;
LK.gui.center.addChild(turkishButtonHighlight);
turkishButtonHighlight.y = -85;
turkishButtonHighlight.x = -220;
var turkishText = new Text2('TÜRKÇE', {
size: 32,
fill: 0xFFFFFF
});
turkishText.anchor.set(0.5, 0.5);
turkishText.stroke = 0x1E8449;
turkishText.strokeThickness = 2;
turkishText.visible = false;
LK.gui.center.addChild(turkishText);
turkishText.y = -80;
turkishText.x = -220;
var englishButton = LK.getAsset('settingsButtonRect', {
anchorX: 0.5,
anchorY: 0.5,
width: 260,
height: 65,
alpha: 1.0
});
englishButton.tint = 0x3498DB;
englishButton.visible = false;
LK.gui.center.addChild(englishButton);
englishButton.y = -80;
englishButton.x = 220;
// Add English button shadow
var englishButtonShadow = LK.getAsset('settingsButtonRect', {
anchorX: 0.5,
anchorY: 0.5,
width: 260,
height: 65,
alpha: 0.3
});
englishButtonShadow.tint = 0x2980B9;
englishButtonShadow.visible = false;
LK.gui.center.addChild(englishButtonShadow);
englishButtonShadow.y = -75;
englishButtonShadow.x = 223;
// Add English button highlight
var englishButtonHighlight = LK.getAsset('settingsButtonRect', {
anchorX: 0.5,
anchorY: 0.5,
width: 240,
height: 50,
alpha: 0.4
});
englishButtonHighlight.tint = 0x85C1E9;
englishButtonHighlight.visible = false;
LK.gui.center.addChild(englishButtonHighlight);
englishButtonHighlight.y = -85;
englishButtonHighlight.x = 220;
var englishText = new Text2('ENGLISH', {
size: 32,
fill: 0xFFFFFF
});
englishText.anchor.set(0.5, 0.5);
englishText.stroke = 0x2980B9;
englishText.strokeThickness = 2;
englishText.visible = false;
LK.gui.center.addChild(englishText);
englishText.y = -80;
englishText.x = 220;
// Current language indicator
var currentLanguageText = new Text2('MEVCUT: TÜRKÇE', {
size: 50,
fill: 0xFFD700
});
currentLanguageText.anchor.set(0.5, 0.5);
currentLanguageText.stroke = 0x000000;
currentLanguageText.strokeThickness = 3;
currentLanguageText.visible = false;
LK.gui.center.addChild(currentLanguageText);
currentLanguageText.y = 30;
// Create back button for language controls with modern rectangular design
var languageBackButton = LK.getAsset('settingsButtonRect', {
anchorX: 0.5,
anchorY: 0.5,
width: 220,
height: 65,
alpha: 1.0
});
languageBackButton.tint = 0x7F8C8D;
languageBackButton.visible = false;
LK.gui.center.addChild(languageBackButton);
languageBackButton.y = 150;
// Add language back button shadow
var languageBackButtonShadow = LK.getAsset('settingsButtonRect', {
anchorX: 0.5,
anchorY: 0.5,
width: 220,
height: 65,
alpha: 0.3
});
languageBackButtonShadow.tint = 0x566573;
languageBackButtonShadow.visible = false;
LK.gui.center.addChild(languageBackButtonShadow);
languageBackButtonShadow.y = 155;
languageBackButtonShadow.x = 3;
// Add language back button highlight
var languageBackButtonHighlight = LK.getAsset('settingsButtonRect', {
anchorX: 0.5,
anchorY: 0.5,
width: 200,
height: 50,
alpha: 0.4
});
languageBackButtonHighlight.tint = 0xABB2B9;
languageBackButtonHighlight.visible = false;
LK.gui.center.addChild(languageBackButtonHighlight);
languageBackButtonHighlight.y = 145;
var languageBackText = new Text2('GERİ', {
size: 36,
fill: 0xFFFFFF
});
languageBackText.anchor.set(0.5, 0.5);
languageBackText.stroke = 0x566573;
languageBackText.strokeThickness = 2;
languageBackText.visible = false;
LK.gui.center.addChild(languageBackText);
languageBackText.y = 150;
// Function to show settings menu
function showSettingsMenu() {
// Hide main menu elements
mainMenuTitle.visible = false;
if (playButton) playButton.visible = false;
if (playButtonShadow) playButtonShadow.visible = false;
if (playButtonHighlight) playButtonHighlight.visible = false;
if (playButtonText) playButtonText.visible = false;
if (cupShape) cupShape.visible = false;
// Show settings menu elements
settingsOverlay.visible = true;
settingsTitle.visible = true;
closeSettingsButton.visible = true;
closeSettingsButtonShadow.visible = true;
closeSettingsButtonHighlight.visible = true;
closeSettingsText.visible = true;
speedMenuButton.visible = true;
speedMenuButtonShadow.visible = true;
speedMenuButtonHighlight.visible = true;
speedMenuText.visible = true;
languageMenuButton.visible = true;
languageMenuButtonShadow.visible = true;
languageMenuButtonHighlight.visible = true;
languageMenuText.visible = true;
}
// Function to hide settings menu
function hideSettingsMenu() {
// Hide settings menu elements
settingsOverlay.visible = false;
settingsTitle.visible = false;
closeSettingsButton.visible = false;
closeSettingsButtonShadow.visible = false;
closeSettingsButtonHighlight.visible = false;
closeSettingsText.visible = false;
speedMenuButton.visible = false;
speedMenuButtonShadow.visible = false;
speedMenuButtonHighlight.visible = false;
speedMenuText.visible = false;
languageMenuButton.visible = false;
languageMenuButtonShadow.visible = false;
languageMenuButtonHighlight.visible = false;
languageMenuText.visible = false;
hideSpeedControls();
hideLanguageControls();
// Show main menu elements only if we're in main menu state
if (showMainMenu) {
mainMenuTitle.visible = true;
if (playButton) playButton.visible = true;
if (playButtonShadow) playButtonShadow.visible = true;
if (playButtonHighlight) playButtonHighlight.visible = true;
if (playButtonText) playButtonText.visible = true;
if (cupShape) cupShape.visible = true;
}
}
// Function to show language controls
function showLanguageControls() {
// Hide main menu elements
mainMenuTitle.visible = false;
if (playButton) playButton.visible = false;
if (playButtonShadow) playButtonShadow.visible = false;
if (playButtonHighlight) playButtonHighlight.visible = false;
if (playButtonText) playButtonText.visible = false;
if (cupShape) cupShape.visible = false;
// Hide settings button elements
settingsButton.visible = false;
settingsButtonShadow.visible = false;
settingsButtonHighlight.visible = false;
settingsIcon.visible = false;
// Hide speed controls
hideSpeedControls();
// Hide all settings menu elements
settingsOverlay.visible = false;
settingsTitle.visible = false;
languageMenuButton.visible = false;
languageMenuButtonShadow.visible = false;
languageMenuButtonHighlight.visible = false;
languageMenuText.visible = false;
speedMenuButton.visible = false;
speedMenuButtonShadow.visible = false;
speedMenuButtonHighlight.visible = false;
speedMenuText.visible = false;
closeSettingsButton.visible = false;
closeSettingsButtonShadow.visible = false;
closeSettingsButtonHighlight.visible = false;
closeSettingsText.visible = false;
// Show language controls
languageOverlay.visible = true;
languageTitle.visible = true;
turkishButton.visible = true;
turkishButtonShadow.visible = true;
turkishButtonHighlight.visible = true;
turkishText.visible = true;
englishButton.visible = true;
englishButtonShadow.visible = true;
englishButtonHighlight.visible = true;
englishText.visible = true;
currentLanguageText.visible = true;
languageBackButton.visible = true;
languageBackButtonShadow.visible = true;
languageBackButtonHighlight.visible = true;
languageBackText.visible = true;
updateLanguageDisplay();
}
// Function to hide language controls
function hideLanguageControls() {
// Hide all language control elements
languageOverlay.visible = false;
languageTitle.visible = false;
turkishButton.visible = false;
turkishButtonShadow.visible = false;
turkishButtonHighlight.visible = false;
turkishText.visible = false;
englishButton.visible = false;
englishButtonShadow.visible = false;
englishButtonHighlight.visible = false;
englishText.visible = false;
currentLanguageText.visible = false;
languageBackButton.visible = false;
languageBackButtonShadow.visible = false;
languageBackButtonHighlight.visible = false;
languageBackText.visible = false;
// Show settings menu elements again
settingsOverlay.visible = true;
settingsTitle.visible = true;
closeSettingsButton.visible = true;
closeSettingsButtonShadow.visible = true;
closeSettingsButtonHighlight.visible = true;
closeSettingsText.visible = true;
speedMenuButton.visible = true;
speedMenuButtonShadow.visible = true;
speedMenuButtonHighlight.visible = true;
speedMenuText.visible = true;
languageMenuButton.visible = true;
languageMenuButtonShadow.visible = true;
languageMenuButtonHighlight.visible = true;
languageMenuText.visible = true;
}
// Language text objects
var languageTexts = {
tr: {
mainTitle: 'FLAPPY BIRD',
playButton: 'OYNA',
instruction: 'TIKLA VE OYNA!',
gameOver: 'OYUN BİTTİ',
score: 'SKOR',
bestScore: 'EN İYİ',
retry: 'TEKRAR DENE',
mainMenu: 'ANA MENÜ',
settings: 'AYARLAR',
close: 'KAPAT',
speed: 'HIZ',
language: 'DİL',
speedTitle: 'HIZ AYARI',
languageTitle: 'DİL SEÇENEKLERİ',
normal: 'NORMAL',
current: 'MEVCUT',
highestScore: 'EN YÜKSEK',
back: 'GERİ'
},
en: {
mainTitle: 'FLAPPY BIRD',
playButton: 'PLAY',
instruction: 'CLICK TO PLAY!',
gameOver: 'GAME OVER',
score: 'SCORE',
bestScore: 'BEST',
retry: 'RETRY',
mainMenu: 'MAIN MENU',
settings: 'SETTINGS',
close: 'CLOSE',
speed: 'SPEED',
language: 'LANGUAGE',
speedTitle: 'SPEED SETTINGS',
languageTitle: 'LANGUAGE OPTIONS',
normal: 'NORMAL',
current: 'CURRENT',
highestScore: 'HIGHEST SCORE',
back: 'BACK'
}
};
// Function to get text for current language
function getText(key) {
return languageTexts[currentLanguage][key] || languageTexts['en'][key];
}
// Function to update all text elements to current language
function updateAllTexts() {
try {
if (instructionTxt && instructionTxt.setText) {
try {
instructionTxt.setText(getText('instruction'));
} catch (e) {}
}
if (playButtonText && playButtonText.setText) {
try {
playButtonText.setText(getText('playButton'));
} catch (e) {}
}
if (gameOverTitle && gameOverTitle.setText) {
try {
gameOverTitle.setText(getText('gameOver'));
} catch (e) {}
}
if (retryButtonText && retryButtonText.setText) {
try {
retryButtonText.setText(getText('retry'));
} catch (e) {}
}
if (menuButtonText && menuButtonText.setText) {
try {
menuButtonText.setText(getText('mainMenu'));
} catch (e) {}
}
if (settingsTitle && settingsTitle.setText) {
try {
settingsTitle.setText(getText('settings'));
} catch (e) {}
}
if (closeSettingsText && closeSettingsText.setText) {
try {
closeSettingsText.setText(getText('close'));
} catch (e) {}
}
if (speedMenuText && speedMenuText.setText) {
try {
speedMenuText.setText(getText('speed'));
} catch (e) {}
}
if (languageMenuText && languageMenuText.setText) {
try {
languageMenuText.setText(getText('language'));
} catch (e) {}
}
if (speedTitle && speedTitle.setText) {
try {
speedTitle.setText(getText('speedTitle'));
} catch (e) {}
}
if (languageTitle && languageTitle.setText) {
try {
languageTitle.setText(getText('languageTitle'));
} catch (e) {}
}
if (normalSpeedText && normalSpeedText.setText) {
try {
normalSpeedText.setText(getText('normal'));
} catch (e) {}
}
if (speedBackText && speedBackText.setText) {
try {
speedBackText.setText(getText('back'));
} catch (e) {}
}
if (languageBackText && languageBackText.setText) {
try {
languageBackText.setText(getText('back'));
} catch (e) {}
}
// Update current speed text
var speedText = '1X';
if (gameSpeed === 2) speedText = '2X';else if (gameSpeed === 1.5) speedText = '1.5X';else if (gameSpeed === 2.5) speedText = '2.5X';
if (currentSpeedText && currentSpeedText.setText) {
try {
currentSpeedText.setText(getText('current') + ': ' + speedText);
} catch (e) {}
}
// Update final and best score texts
if (finalScoreText && finalScoreText.setText) {
var currentScore = LK.getScore();
try {
finalScoreText.setText(getText('score') + ': ' + currentScore);
} catch (e) {}
}
if (bestScoreText && bestScoreText.setText) {
var currentHighScore = storage.highScore || 0;
try {
bestScoreText.setText(getText('bestScore') + ': ' + currentHighScore);
} catch (e) {}
}
} catch (e) {
console.log("Text update error:", e);
}
}
// Function to update language display
function updateLanguageDisplay() {
var langText = currentLanguage === 'tr' ? 'TÜRKÇE' : 'ENGLISH';
var currentText = currentLanguage === 'tr' ? 'MEVCUT' : 'CURRENT';
if (currentLanguageText && currentLanguageText.setText) {
try {
currentLanguageText.setText(currentText + ': ' + langText);
} catch (e) {}
}
// Update button colors to show selected language
if (turkishButton) {
turkishButton.tint = currentLanguage === 'tr' ? 0x2ECC71 : 0x27AE60;
}
if (englishButton) {
englishButton.tint = currentLanguage === 'en' ? 0x5DADE2 : 0x3498DB;
}
// Ensure button text is always correct
if (turkishText && turkishText.setText) {
try {
turkishText.setText('TÜRKÇE');
} catch (e) {}
}
if (englishText && englishText.setText) {
try {
englishText.setText('ENGLISH');
} catch (e) {}
}
}
// Function to set language
function setLanguage(lang) {
currentLanguage = lang;
// Save to persistent storage
storage.language = lang;
// Update all text elements immediately
updateAllTexts();
// Update language display
updateLanguageDisplay();
// Update speed display to use correct language
updateSpeedDisplay();
}
// Function to show speed controls
function showSpeedControls() {
// Hide main menu elements
mainMenuTitle.visible = false;
if (playButton) playButton.visible = false;
if (playButtonShadow) playButtonShadow.visible = false;
if (playButtonHighlight) playButtonHighlight.visible = false;
if (playButtonText) playButtonText.visible = false;
if (cupShape) cupShape.visible = false;
// Hide settings button elements
settingsButton.visible = false;
settingsButtonShadow.visible = false;
settingsButtonHighlight.visible = false;
settingsIcon.visible = false;
// Hide language controls
hideLanguageControls();
// Hide all settings menu elements
settingsOverlay.visible = false;
settingsTitle.visible = false;
speedMenuButton.visible = false;
speedMenuButtonShadow.visible = false;
speedMenuButtonHighlight.visible = false;
speedMenuText.visible = false;
languageMenuButton.visible = false;
languageMenuButtonShadow.visible = false;
languageMenuButtonHighlight.visible = false;
languageMenuText.visible = false;
closeSettingsButton.visible = false;
closeSettingsButtonShadow.visible = false;
closeSettingsButtonHighlight.visible = false;
closeSettingsText.visible = false;
// Show speed controls overlay and title - ensure they are properly visible
speedOverlay.visible = true;
speedTitle.visible = true;
// Show normal speed button (1x) - ensure all elements are visible
normalSpeedButton.visible = true;
normalSpeedButtonShadow.visible = true;
normalSpeedButtonHighlight.visible = true;
normalSpeedText.visible = true;
// Show 1.5x speed button - ensure all elements are visible
speed15xButton.visible = true;
speed15xButtonShadow.visible = true;
speed15xButtonHighlight.visible = true;
speed15xText.visible = true;
// Show 2x speed button - ensure all elements are visible
speed2xButton.visible = true;
speed2xButtonShadow.visible = true;
speed2xButtonHighlight.visible = true;
speed2xText.visible = true;
// Show 2.5x speed button - ensure all elements are visible
speed25xButton.visible = true;
speed25xButtonShadow.visible = true;
speed25xButtonHighlight.visible = true;
speed25xText.visible = true;
// Show current speed indicator and back button - ensure all elements are visible
currentSpeedText.visible = true;
speedBackButton.visible = true;
speedBackButtonShadow.visible = true;
speedBackButtonHighlight.visible = true;
speedBackText.visible = true;
// Force redraw by adjusting positions slightly
normalSpeedButton.x = -300;
speed15xButton.x = -100;
speed2xButton.x = 100;
speed25xButton.x = 300;
// Update speed display to show current selection
updateSpeedDisplay();
}
// Function to hide speed controls
function hideSpeedControls() {
// Hide all speed control elements
speedOverlay.visible = false;
speedTitle.visible = false;
normalSpeedButton.visible = false;
normalSpeedButtonShadow.visible = false;
normalSpeedButtonHighlight.visible = false;
normalSpeedText.visible = false;
speed15xButton.visible = false;
speed15xButtonShadow.visible = false;
speed15xButtonHighlight.visible = false;
speed15xText.visible = false;
speed2xButton.visible = false;
speed2xButtonShadow.visible = false;
speed2xButtonHighlight.visible = false;
speed2xText.visible = false;
speed25xButton.visible = false;
speed25xButtonShadow.visible = false;
speed25xButtonHighlight.visible = false;
speed25xText.visible = false;
currentSpeedText.visible = false;
speedBackButton.visible = false;
speedBackButtonShadow.visible = false;
speedBackButtonHighlight.visible = false;
speedBackText.visible = false;
// Show settings menu elements again
settingsOverlay.visible = true;
settingsTitle.visible = true;
closeSettingsButton.visible = true;
closeSettingsButtonShadow.visible = true;
closeSettingsButtonHighlight.visible = true;
closeSettingsText.visible = true;
speedMenuButton.visible = true;
speedMenuButtonShadow.visible = true;
speedMenuButtonHighlight.visible = true;
speedMenuText.visible = true;
languageMenuButton.visible = true;
languageMenuButtonShadow.visible = true;
languageMenuButtonHighlight.visible = true;
languageMenuText.visible = true;
}
// Function to update speed display
function updateSpeedDisplay() {
var speedText = '1X';
if (gameSpeed === 2) speedText = '2X';else if (gameSpeed === 1.5) speedText = '1.5X';else if (gameSpeed === 2.5) speedText = '2.5X';
currentSpeedText.setText(getText('current') + ': ' + speedText);
// Update button colors based on selected speed
normalSpeedButton.tint = gameSpeed === 1 ? 0x1ABC9C : 0x27AE60;
speed15xButton.tint = gameSpeed === 1.5 ? 0xFFE066 : 0xF39C12;
speed2xButton.tint = gameSpeed === 2 ? 0xFF6B6B : 0xE74C3C;
speed25xButton.tint = gameSpeed === 2.5 ? 0xE91E63 : 0x9C27B0;
// Update button text to show selected speed - always show the speed multiplier
if (normalSpeedText && normalSpeedText.setText) {
normalSpeedText.setText('1X');
}
if (speed15xText && speed15xText.setText) {
speed15xText.setText('1.5X');
}
if (speed2xText && speed2xText.setText) {
speed2xText.setText('2X');
}
if (speed25xText && speed25xText.setText) {
speed25xText.setText('2.5X');
}
}
;
// Function to set game speed
function setGameSpeed(newSpeed) {
gameSpeed = newSpeed;
updateSpeedDisplay();
// Update existing pipes if they exist with better balanced speed scaling
for (var i = 0; i < pipes.length; i++) {
if (pipes[i]) {
pipes[i].speed = basePipeSpeed * gameSpeed;
// Better balanced gap size scaling for different speeds - increased for easier navigation
if (gameSpeed === 1) {
pipes[i].gapSize = 850; // Normal gap - increased for easier passage
} else if (gameSpeed === 1.5) {
pipes[i].gapSize = 870; // Slightly larger gap for 1.5x
} else if (gameSpeed === 2) {
pipes[i].gapSize = 890; // Larger gap for 2x
} else if (gameSpeed === 2.5) {
pipes[i].gapSize = 910; // Largest gap for 2.5x
} else {
pipes[i].gapSize = 850 + (gameSpeed - 1) * 20; // Fallback formula
}
}
}
}
// Initialize persistent storage with defaults if values don't exist
if (!storage.globalLeaderboardNames) storage.globalLeaderboardNames = [];
if (!storage.globalLeaderboardScores) storage.globalLeaderboardScores = [];
if (typeof storage.highScore === 'undefined') storage.highScore = 0;
if (typeof storage.lastScore === 'undefined') storage.lastScore = 0;
if (!storage.language) storage.language = 'tr';
if (!storage.username) storage.username = 'Oyuncu1';
// Update current language from persistent storage
currentLanguage = storage.language || 'tr';
// Initialize username if not exists
if (!storage.username) {
var playerNumber = 1;
while (storage.globalLeaderboardNames.indexOf('Oyuncu ' + playerNumber) !== -1) {
playerNumber++;
}
storage.username = 'Oyuncu ' + playerNumber;
}
// Create animated play button for main menu
var playButton = LK.getAsset('playButtonMain', {
anchorX: 0.5,
anchorY: 0.5,
width: 400,
height: 120,
alpha: 1.0
});
playButton.tint = 0xFF9800; // Flappy Bird orange
try {
if (LK.gui && LK.gui.center) {
LK.gui.center.addChild(playButton);
playButton.y = -100;
}
} catch (e) {
console.log("Play button error:", e);
}
// Create separate play button shadow element
var playButtonShadow = LK.getAsset('playButtonShadow', {
anchorX: 0.5,
anchorY: 0.5,
width: 400,
height: 120,
alpha: 0.4
});
playButtonShadow.tint = 0xE65100; // Darker orange shadow
try {
if (LK.gui && LK.gui.center) {
LK.gui.center.addChild(playButtonShadow);
playButtonShadow.y = -92; // Offset shadow slightly up
playButtonShadow.x = 4; // Offset shadow slightly right
}
} catch (e) {
console.log("Play button shadow error:", e);
}
// Create separate play button highlight element
var playButtonHighlight = LK.getAsset('playButtonHighlight', {
anchorX: 0.5,
anchorY: 0.5,
width: 370,
height: 95,
alpha: 0.5
});
playButtonHighlight.tint = 0xFFB74D; // Lighter orange highlight
try {
if (LK.gui && LK.gui.center) {
LK.gui.center.addChild(playButtonHighlight);
playButtonHighlight.y = -108; // Offset highlight slightly down
}
} catch (e) {
console.log("Play button highlight error:", e);
}
// Create separate play button text element
var playButtonText = new Text2('OYNA', {
size: 50,
fill: 0xFFFFFF
});
playButtonText.anchor.set(0.5, 0.5);
playButtonText.stroke = 0xE65100;
playButtonText.strokeThickness = 4;
try {
if (LK.gui && LK.gui.center) {
LK.gui.center.addChild(playButtonText);
playButtonText.y = -100;
}
} catch (e) {
console.log("Play button text error:", e);
}
// Initialize game
resetGame(); // Use resetGame to properly initialize all states
// Update all texts to current language
updateAllTexts();
// Update language display to show current selection
updateLanguageDisplay();
// Touch/click handler
game.down = function (x, y, obj) {
// Check settings button click - settings button is positioned at topRight with offset
var settingsX = 2048 - 80; // topRight.x + settingsButton.x offset
var settingsY = 80; // topRight.y + settingsButton.y offset
var settingsSize = 120; // Settings button size
if (x >= settingsX - settingsSize / 2 && x <= settingsX + settingsSize / 2 && y >= settingsY - settingsSize / 2 && y <= settingsY + settingsSize / 2) {
// Prevent rapid clicks
var currentTime;
try {
currentTime = Date.now ? Date.now() : new Date().getTime();
} catch (e) {
currentTime = 0;
}
if (currentTime - lastButtonClickTime < 500) {
return; // Ignore click if too recent
}
lastButtonClickTime = currentTime;
// Simple visual feedback without complex animations
showSettingsMenu();
return;
}
// Check close settings button if settings menu is open
if (settingsOverlay.visible) {
// Add invisible barriers between menu sections to prevent overlapping clicks
// Speed menu section barrier (between speed and language menus)
if (speedMenuButton.visible && !speedOverlay.visible && !languageOverlay.visible) {
// Check speed menu button (HIZ) with isolated click area
if (x >= 824 && x <= 1224 && y >= 1166 && y <= 1266) {
var currentTime = Date.now();
if (currentTime - lastButtonClickTime < 300) return;
lastButtonClickTime = currentTime;
// Simple visual feedback with color change
simpleColorTint(speedMenuButton, 0x5DADE2, 150);
showSpeedControls();
return;
}
// Barrier zone between speed and language buttons (y: 1266-1296)
if (y >= 1266 && y <= 1296) {
return; // Block clicks in the barrier zone
}
}
// Language menu section barrier
if (languageMenuButton.visible && !speedOverlay.visible && !languageOverlay.visible) {
// Check language menu button (DIL) with isolated click area
if (x >= 824 && x <= 1224 && y >= 1296 && y <= 1396) {
var currentTime = Date.now();
if (currentTime - lastButtonClickTime < 300) return;
lastButtonClickTime = currentTime;
// Simple visual feedback with color change
simpleColorTint(languageMenuButton, 0xBB8FCE, 150);
showLanguageControls();
return;
}
}
// Language control buttons with barriers - only when language overlay is visible
if (languageOverlay.visible) {
// Turkish language button with isolated click area
if (turkishButton.visible && x >= 654 && x <= 954 && y >= 1246 && y <= 1326) {
var currentTime = Date.now();
if (currentTime - lastButtonClickTime < 300) return;
lastButtonClickTime = currentTime;
// Simple visual feedback with color change
simpleColorTint(turkishButton, 0x58D68D, 150);
setLanguage('tr');
return;
}
// Barrier zone between Turkish and English buttons (x: 954-1094)
if (x >= 954 && x <= 1094 && y >= 1246 && y <= 1326) {
return; // Block clicks in barrier zone
}
// English language button with isolated click area
if (englishButton.visible && x >= 1094 && x <= 1394 && y >= 1246 && y <= 1326) {
var currentTime = Date.now();
if (currentTime - lastButtonClickTime < 300) return;
lastButtonClickTime = currentTime;
// Simple visual feedback with color change
simpleColorTint(englishButton, 0x85C1E9, 150);
setLanguage('en');
return;
}
}
// Speed control buttons with barriers - only when speed overlay is visible
if (speedOverlay.visible) {
// Calculate GUI center position for proper click detection
var guiCenterX = 1024; // GUI center X
var guiCenterY = 1366; // GUI center Y
var buttonY = guiCenterY + -80; // speedButton.y offset
var buttonHeight = 95;
var buttonWidth = 260;
// Normal speed button - positioned at center + offset (-300)
var normalButtonX = guiCenterX + -300;
if (normalSpeedButton.visible && x >= normalButtonX - buttonWidth / 2 && x <= normalButtonX + buttonWidth / 2 && y >= buttonY - buttonHeight / 2 && y <= buttonY + buttonHeight / 2) {
var currentTime = Date.now();
if (currentTime - lastButtonClickTime < 300) return;
lastButtonClickTime = currentTime;
// Set game speed immediately with proper feedback
setGameSpeed(1);
// Simple visual feedback with color change
simpleColorTint(normalSpeedButton, 0x58D68D, 150, function () {
updateSpeedDisplay(); // Update colors based on selection
});
return;
}
// 1.5X speed button - positioned at center + offset (-100)
var speed15xButtonX = guiCenterX + -100;
if (speed15xButton.visible && x >= speed15xButtonX - buttonWidth / 2 && x <= speed15xButtonX + buttonWidth / 2 && y >= buttonY - buttonHeight / 2 && y <= buttonY + buttonHeight / 2) {
var currentTime = Date.now();
if (currentTime - lastButtonClickTime < 300) return;
lastButtonClickTime = currentTime;
// Set game speed immediately with proper feedback
setGameSpeed(1.5);
// Simple visual feedback with color change
simpleColorTint(speed15xButton, 0xF7DC6F, 150, function () {
updateSpeedDisplay(); // Update colors based on selection
});
return;
}
// 2X speed button - positioned at center + offset (100)
var speed2xButtonX = guiCenterX + 100;
if (speed2xButton.visible && x >= speed2xButtonX - buttonWidth / 2 && x <= speed2xButtonX + buttonWidth / 2 && y >= buttonY - buttonHeight / 2 && y <= buttonY + buttonHeight / 2) {
var currentTime = Date.now();
if (currentTime - lastButtonClickTime < 300) return;
lastButtonClickTime = currentTime;
// Set game speed immediately with proper feedback
setGameSpeed(2);
// Simple visual feedback with color change
simpleColorTint(speed2xButton, 0xF1948A, 150, function () {
updateSpeedDisplay(); // Update colors based on selection
});
return;
}
// 2.5X speed button - positioned at center + offset (300)
var speed25xButtonX = guiCenterX + 300;
if (speed25xButton.visible && x >= speed25xButtonX - buttonWidth / 2 && x <= speed25xButtonX + buttonWidth / 2 && y >= buttonY - buttonHeight / 2 && y <= buttonY + buttonHeight / 2) {
var currentTime = Date.now();
if (currentTime - lastButtonClickTime < 300) return;
lastButtonClickTime = currentTime;
// Set game speed immediately with proper feedback
setGameSpeed(2.5);
// Simple visual feedback with color change
simpleColorTint(speed25xButton, 0xBA68C8, 150, function () {
updateSpeedDisplay(); // Update colors based on selection
});
return;
}
}
// Check speed back button with proper GUI center coordinates
if (speedBackButton.visible) {
var guiCenterX = 1024; // GUI center X
var guiCenterY = 1366; // GUI center Y
var backButtonY = guiCenterY + 150; // speedBackButton.y offset
var backButtonWidth = 220;
var backButtonHeight = 65;
if (x >= guiCenterX - backButtonWidth / 2 && x <= guiCenterX + backButtonWidth / 2 && y >= backButtonY - backButtonHeight / 2 && y <= backButtonY + backButtonHeight / 2) {
var currentTime = Date.now();
if (currentTime - lastButtonClickTime < 300) return;
lastButtonClickTime = currentTime;
// Simple visual feedback with color change
simpleColorTint(speedBackButton, 0xABB2B9, 150);
hideSpeedControls();
return;
}
}
// Check language back button at x = 1024, y = 1516, size 300x100
if (languageBackButton.visible && x >= 874 && x <= 1174 && y >= 1466 && y <= 1566) {
var currentTime = Date.now();
if (currentTime - lastButtonClickTime < 300) return;
lastButtonClickTime = currentTime;
// Simple visual feedback with color change
simpleColorTint(languageBackButton, 0xABB2B9, 150);
hideLanguageControls();
return;
}
// Check close settings button (KAPAT) - centered at 1024x1516, button is 300x100
if (x >= 874 && x <= 1174 && y >= 1466 && y <= 1566) {
// Prevent rapid clicks
var currentTime = Date.now();
if (currentTime - lastButtonClickTime < 300) {
return; // Ignore click if too recent
}
lastButtonClickTime = currentTime;
// Simple visual feedback with color change
simpleColorTint(closeSettingsButton, 0xBDC3C7, 150);
hideSettingsMenu();
return;
}
return; // Don't process other clicks when settings menu is open
}
// Check cup click - cup is positioned at bottomRight with offset
var cupX = 2048 - 100; // bottomRight.x + cupShape.x offset
var cupY = 2732 - 230; // bottomRight.y + cupShape.y offset
var cupSize = 120; // Cup asset size
if (x >= cupX - cupSize / 2 && x <= cupX + cupSize / 2 && y >= cupY && y <= cupY + cupSize) {
var currentTime = Date.now();
if (currentTime - lastButtonClickTime < 500) return;
lastButtonClickTime = currentTime;
// Simple high score display from persistent storage
var highScore = storage.highScore || 0;
console.log(getText('highestScore') + ': ' + highScore);
return;
}
if (gameOver || showGameOver) {
// Check retry button (TEKRAR DENE) - centered at 1024x1466, button is 380x110
if (x >= 834 && x <= 1214 && y >= 1411 && y <= 1521) {
// Prevent rapid clicks
var currentTime = Date.now();
if (currentTime - lastButtonClickTime < 300) {
return; // Ignore click if too recent
}
lastButtonClickTime = currentTime;
// Simple visual feedback with color change
simpleColorTint(retryButton, 0xFFB74D, 150);
hideGameOverScreen();
resetGame();
// Show instruction screen instead of starting game directly
startGameFromMenu();
return;
}
// Check menu button (ANA MENÜ) - centered at 1024x1616, button is 380x110
if (x >= 834 && x <= 1214 && y >= 1561 && y <= 1671) {
// Prevent rapid clicks
var currentTime = Date.now();
if (currentTime - lastButtonClickTime < 300) {
return; // Ignore click if too recent
}
lastButtonClickTime = currentTime;
// Simple visual feedback with color change
simpleColorTint(menuButton, 0xF1948A, 150);
hideGameOverScreen();
resetGame();
return;
}
return;
}
if (showMainMenu) {
// Check play button click - centered at 1024x1266 (center.y = 1366 + playButton.y = -100), button is 400x120
if (playButton && playButton.visible && x >= 824 && x <= 1224 && y >= 1206 && y <= 1326) {
// Prevent rapid clicks
var currentTime = Date.now();
if (currentTime - lastButtonClickTime < 300) {
return; // Ignore click if too recent
}
lastButtonClickTime = currentTime;
// Simple visual feedback with color change
simpleColorTint(playButton, 0xFFB74D, 100);
startGameFromMenu();
return;
}
return;
}
if (!gameStarted) {
gameStarted = true;
instructionTxt.visible = false;
}
bird.flap();
};
// Main game loop
game.update = function () {
if (gameOver || showMainMenu || showGameOver) return;
// Only run game logic if game has started
if (gameStarted) {
// Check ground and ceiling collision with proper bird size (bird is 80px tall, 120px wide)
var birdRadius = 40; // Half of bird height for collision detection
if (bird.y + birdRadius >= 2732 - 150 || bird.y - birdRadius <= 0) {
gameOver = true;
var currentScore = LK.getScore();
// Save score to persistent storage
if (currentScore > (storage.highScore || 0)) {
storage.highScore = currentScore;
}
storage.lastScore = currentScore;
showGameOverScreen(currentScore);
return;
}
// Ultra-simplified pipe cleanup - only run every 60 frames
if (LK.ticks % 60 === 0) {
var cleanupCount = 0;
for (var i = pipes.length - 1; i >= 0 && cleanupCount < 5; i--) {
var pipe = pipes[i];
if (pipe && pipe.x < bird.x - 600) {
pipe.destroy();
pipes.splice(i, 1);
cleanupCount++;
}
}
}
// Ultra-simplified collision - only check closest pipe
var closestPipe = null;
var minDistance = 1000;
for (var i = 0; i < pipes.length; i++) {
var pipe = pipes[i];
var distance = pipe.x - bird.x;
if (distance > -100 && distance < 200 && distance < minDistance) {
closestPipe = pipe;
minDistance = distance;
}
}
if (closestPipe) {
// Initialize lastX tracking
if (typeof closestPipe.lastX === 'undefined') {
closestPipe.lastX = closestPipe.x;
}
// Scoring check
if (!closestPipe.passed && closestPipe.lastX >= bird.x && closestPipe.x < bird.x) {
closestPipe.passed = true;
var newScore = LK.getScore() + 1;
LK.setScore(newScore);
scoreTxt.setText(newScore.toString());
try {
LK.getSound('score').play();
} catch (e) {}
}
// Update last position
closestPipe.lastX = closestPipe.x;
// Collision check - only if very close
if (closestPipe.x > bird.x - 80 && closestPipe.x < bird.x + 80) {
var gapTop = closestPipe.gapCenterY - closestPipe.gapSize / 2;
var gapBottom = closestPipe.gapCenterY + closestPipe.gapSize / 2;
if (bird.y < gapTop + 40 || bird.y > gapBottom - 40) {
gameOver = true;
var currentScore = LK.getScore();
storage.lastScore = currentScore;
if (currentScore > (storage.highScore || 0)) {
storage.highScore = currentScore;
}
showGameOverScreen(currentScore);
return;
}
}
}
}
}; ===================================================================
--- original.js
+++ change.js
@@ -1,5 +1,10 @@
/****
+* Plugins
+****/
+var storage = LK.import("@upit/storage.v1");
+
+/****
* Classes
****/
var Bird = Container.expand(function () {
var self = Container.call(this);
@@ -131,17 +136,11 @@
/****
* Game Code
****/
-// Simple storage implementation without plugins
-var storage = {
- highScore: 0,
- language: 'tr',
- username: 'Player1',
- globalLeaderboardNames: [],
- globalLeaderboardScores: [],
- lastScore: 0
-};
+// Initialize persistent storage using storage plugin
+var currentLanguage = storage.language || 'tr';
+var gameHighScore = storage.highScore || 0;
// Simple animation helpers without tween plugin
function simpleScale(target, endScale, duration, callback) {
var startScale = target.scaleX || 1;
var startTime = LK.ticks;
@@ -1036,10 +1035,10 @@
fill: finalScoreText.style.fill
};
}
}
- // Always show the current high score from storage
- var currentHighScore = _storage && _storage.highScore ? _storage.highScore : 0;
+ // Always show the current high score from persistent storage
+ var currentHighScore = storage.highScore || 0;
bestScoreText.setText(getText('bestScore') + ': ' + currentHighScore);
// Use proper text sizing
if (bestScoreText.width > 600) {
var newSize = Math.max(40, Math.floor(60 * 600 / bestScoreText.width));
@@ -1561,9 +1560,9 @@
finalScoreText.setText(getText('score') + ': ' + currentScore);
} catch (e) {}
}
if (bestScoreText && bestScoreText.setText) {
- var currentHighScore = _storage.highScore || 0;
+ var currentHighScore = storage.highScore || 0;
try {
bestScoreText.setText(getText('bestScore') + ': ' + currentHighScore);
} catch (e) {}
}
@@ -1601,19 +1600,10 @@
}
// Function to set language
function setLanguage(lang) {
currentLanguage = lang;
- // Save to storage
- try {
- if (_storage) {
- _storage.language = lang;
- }
- if (storage) {
- storage.language = lang;
- }
- } catch (e) {
- console.log("Language storage error:", e);
- }
+ // Save to persistent storage
+ storage.language = lang;
// Update all text elements immediately
updateAllTexts();
// Update language display
updateLanguageDisplay();
@@ -1777,39 +1767,24 @@
}
}
}
}
-// Initialize local storage arrays if they don't exist
-try {
- // Use persistent storage directly
- _storage = storage;
- // Initialize arrays and values if they don't exist, but preserve existing values
- if (!_storage.globalLeaderboardNames) _storage.globalLeaderboardNames = [];
- if (!_storage.globalLeaderboardScores) _storage.globalLeaderboardScores = [];
- if (typeof _storage.highScore === 'undefined') _storage.highScore = 0;
- if (typeof _storage.lastScore === 'undefined') _storage.lastScore = 0;
- if (!_storage.language) _storage.language = 'tr';
- if (!_storage.username) _storage.username = 'Oyuncu1';
-} catch (e) {
- console.log("Storage initialization error:", e);
- _storage = {
- globalLeaderboardNames: [],
- globalLeaderboardScores: [],
- highScore: 0,
- lastScore: 0,
- language: 'tr',
- username: 'Oyuncu1'
- };
-}
-// Current language variable - initialize from storage after storage is ready
-var currentLanguage = _storage.language || 'tr';
+// Initialize persistent storage with defaults if values don't exist
+if (!storage.globalLeaderboardNames) storage.globalLeaderboardNames = [];
+if (!storage.globalLeaderboardScores) storage.globalLeaderboardScores = [];
+if (typeof storage.highScore === 'undefined') storage.highScore = 0;
+if (typeof storage.lastScore === 'undefined') storage.lastScore = 0;
+if (!storage.language) storage.language = 'tr';
+if (!storage.username) storage.username = 'Oyuncu1';
+// Update current language from persistent storage
+currentLanguage = storage.language || 'tr';
// Initialize username if not exists
-if (!_storage.username) {
+if (!storage.username) {
var playerNumber = 1;
- while (_storage.globalLeaderboardNames.indexOf('Oyuncu ' + playerNumber) !== -1) {
+ while (storage.globalLeaderboardNames.indexOf('Oyuncu ' + playerNumber) !== -1) {
playerNumber++;
}
- _storage.username = 'Oyuncu ' + playerNumber;
+ storage.username = 'Oyuncu ' + playerNumber;
}
// Create animated play button for main menu
var playButton = LK.getAsset('playButtonMain', {
anchorX: 0.5,
@@ -2080,10 +2055,10 @@
if (x >= cupX - cupSize / 2 && x <= cupX + cupSize / 2 && y >= cupY && y <= cupY + cupSize) {
var currentTime = Date.now();
if (currentTime - lastButtonClickTime < 500) return;
lastButtonClickTime = currentTime;
- // Simple high score display
- var highScore = _storage && _storage.highScore || 0;
+ // Simple high score display from persistent storage
+ var highScore = storage.highScore || 0;
console.log(getText('highestScore') + ': ' + highScore);
return;
}
if (gameOver || showGameOver) {
@@ -2150,13 +2125,13 @@
var birdRadius = 40; // Half of bird height for collision detection
if (bird.y + birdRadius >= 2732 - 150 || bird.y - birdRadius <= 0) {
gameOver = true;
var currentScore = LK.getScore();
- // Simplified storage operations
- if (currentScore > (_storage.highScore || 0)) {
- _storage.highScore = currentScore;
+ // Save score to persistent storage
+ if (currentScore > (storage.highScore || 0)) {
+ storage.highScore = currentScore;
}
- _storage.lastScore = currentScore;
+ storage.lastScore = currentScore;
showGameOverScreen(currentScore);
return;
}
// Ultra-simplified pipe cleanup - only run every 60 frames
@@ -2205,11 +2180,11 @@
var gapBottom = closestPipe.gapCenterY + closestPipe.gapSize / 2;
if (bird.y < gapTop + 40 || bird.y > gapBottom - 40) {
gameOver = true;
var currentScore = LK.getScore();
- _storage.lastScore = currentScore;
- if (currentScore > (_storage.highScore || 0)) {
- _storage.highScore = currentScore;
+ storage.lastScore = currentScore;
+ if (currentScore > (storage.highScore || 0)) {
+ storage.highScore = currentScore;
}
showGameOverScreen(currentScore);
return;
}