User prompt
güçlendirmeyi ortadan kaldır ve miknatis görselini oyuna dahil et . oyunu kusursuz hale getir ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
miknatisi oyuna dahi et
User prompt
mıknatıs kazanıldığında 7 saniye boyunca kendi şeridindeki ve bitişik şeritteki tüm altınları toplasın
User prompt
Please fix the bug: 'TypeError: player.activateShield is not a function. (In 'player.activateShield()', 'player.activateShield' is undefined)' in or related to this line: 'player.activateShield();' Line Number: 1411
User prompt
top players listesi yapılan skora göre değil kazanılan paraya göre olsun
User prompt
oyun başladığında müziği başlat ve sesleri etkin hale getir
User prompt
5 saiyeliğne kendi şeridindeki ve yan şeritteki bütün altınları toplamayı sağlayacak bir mıknatıs ekle
User prompt
BİR MAĞAZA OLUŞTUR SOL ALTTA OLSUN VE KAZANILAN COİNLER BURADA KULLANILABİLSİN
User prompt
kazanılan paraların kullanılabileceği bir market kısmı oluştur sol altta görünsün
User prompt
kazanılan paraların kullanılabileceği bir market kısmı olsun ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
güçlendirmeyi kaldır iptal et güçlendirme diye bir şey olmasın
User prompt
oyuncunun kaçmasının her zaman bir yolu olsun ve oyuncu öldüğünde oyuncunun olduğu noktadan başlayrak oynucunun rengi büyüyerek ekranı kaplasın ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
güçlendirme aldıktan sonra on saniye içinde ölürse kaldığı şeritten devam etsin ve iki saniye olumsuz olsun
User prompt
oyuncu güçlendirme aldıktan 10 saniye sonra kazandığı can hakkı kaybolsun . eğer güçlendirme aldıktan sonra 10 saniye içinde ölürse 2 saniye ölümsüz olsun ve kaldığı yerden devam etsin yani en sola geçmesin
User prompt
coinler otobüslerin üzerinde veya oyuncunun alamayacağı bir yerde olmasın. oyuncunun her zaman kurtulma imkanı olsun. engeller aşağı yukarı hareket etmesin sabit aşağı aksın
User prompt
iki atlama tahtası çok yakın araloklarla gelmesin
User prompt
bir anda beliren yeşil şeyleri kaldır
User prompt
yenildiğinde oyuncu opak bi şekide tüm ekranı kaplasın en son ekanın tamamı mor olsun
User prompt
oyuncunun hiç bir yere kaçamadaığı bir durum oluşmasın. oyuncu yenildiğinde karakter büyüyüp tüm ekranı kaplasın ve ondan sonra yeniden pyna yazısı çıksın ↪💡 Consider importing and using the following plugins: @upit/tween.v1
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1", {
highScore: 0,
coinCount: 0,
leaderboard: []
});
/****
* Classes
****/
var Bus = Container.expand(function () {
var self = Container.call(this);
var busSprite = self.attachAsset('bus', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = busSprite.width;
self.height = busSprite.height;
self.speed = 1; // All buses have the same base speed
self.lane = 0; // 0-3 for the four road lanes
self.update = function () {
self.lastX = self.x;
// Move vertically from top to bottom
self.y += gameSpeed * self.speed;
if (self.y > 2732 + self.height) {
self.resetPosition();
}
};
self.resetPosition = function () {
// Reset to top of screen
self.y = -self.height - Math.random() * 300;
// Randomly assign to a lane
self.lane = Math.floor(Math.random() * 4);
self.x = roadPositions[self.lane];
};
return self;
});
var Coin = Container.expand(function () {
var self = Container.call(this);
var coinSprite = self.attachAsset('coin', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = coinSprite.width;
self.height = coinSprite.height;
self.lane = 1;
// Coin animation (rotate)
LK.setInterval(function () {
tween(coinSprite, {
rotation: coinSprite.rotation + Math.PI * 2
}, {
duration: 1000
});
}, 1000);
self.update = function () {
self.y += gameSpeed;
if (self.y > 2732 + self.height) {
self.destroy();
}
};
return self;
});
var CoinParticle = Container.expand(function () {
var self = Container.call(this);
var coinSprite = self.attachAsset('coin', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.8,
scaleY: 0.8
});
self.startX = 0;
self.startY = 0;
self.targetX = 0;
self.targetY = 0;
self.init = function (startX, startY, targetX, targetY) {
self.x = startX;
self.y = startY;
self.startX = startX;
self.startY = startY;
self.targetX = targetX;
self.targetY = targetY;
// Add rotation to make coin spin while flying
var rotateInterval = LK.setInterval(function () {
coinSprite.rotation += 0.2;
}, 16);
// Create coin flight path animation with arc
var controlPointX = startX + (targetX - startX) * 0.5;
var controlPointY = startY - 200; // Arc upward
var steps = 20; // Number of steps for the arc
var stepDuration = 800 / steps; // Duration for each step
// Animate along bezier curve
function animateStep(i) {
if (i >= steps) {
// Animation complete
LK.clearInterval(rotateInterval);
// Flash the coin counter when coin arrives
tween(coinTxt, {
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 100,
onFinish: function onFinish() {
tween(coinTxt, {
scaleX: 1,
scaleY: 1
}, {
duration: 100
});
}
});
self.destroy();
return;
}
var t = i / steps;
// Quadratic bezier curve calculation
var newX = (1 - t) * (1 - t) * startX + 2 * (1 - t) * t * controlPointX + t * t * targetX;
var newY = (1 - t) * (1 - t) * startY + 2 * (1 - t) * t * controlPointY + t * t * targetY;
tween(self, {
x: newX,
y: newY,
scaleX: 0.8 - 0.3 * t,
scaleY: 0.8 - 0.3 * t
}, {
duration: stepDuration,
onFinish: function onFinish() {
animateStep(i + 1);
}
});
}
// Start the animation
animateStep(0);
};
return self;
});
var MiniBus = Container.expand(function () {
var self = Container.call(this);
// Replace bus sprite with jumpboard
var busSprite = self.attachAsset('jumpboard', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1.5,
scaleY: 1
});
self.width = busSprite.width * 1.5;
self.height = busSprite.height;
self.speed = 1.2; // Slightly faster than regular buses
self.lane = 0; // 0-3 for the four road lanes
// No need for green tint as we're using the jumping board asset now
self.update = function () {
self.lastX = self.x;
// Move vertically from top to bottom
self.y += gameSpeed * self.speed;
if (self.y > 2732 + self.height) {
self.resetPosition();
}
};
self.resetPosition = function () {
// Reset to top of screen with more randomization
self.y = -self.height - Math.random() * 1500; // Further increased random variance
// Randomly assign to a lane
self.lane = Math.floor(Math.random() * 4);
self.x = roadPositions[self.lane];
// Check for other jumping boards in this lane and ensure spacing
var jumpingBoardsInLane = [];
for (var i = 0; i < buses.length; i++) {
if (buses[i] instanceof MiniBus && buses[i] !== self && buses[i].lane === self.lane) {
jumpingBoardsInLane.push(buses[i]);
}
}
// Ensure minimum spacing with other jumping boards in the same lane - increased spacing requirement
for (var i = 0; i < jumpingBoardsInLane.length; i++) {
var otherBoard = jumpingBoardsInLane[i];
if (otherBoard.y < 0 && Math.abs(self.y - otherBoard.y) < self.height * 20) {
// Greatly increased minimum distance
// If too close to another jumping board, move much further up
self.y = otherBoard.y - (self.height * 20 + Math.random() * 800); // Increased spacing
}
}
};
return self;
});
var Obstacle = Container.expand(function () {
var self = Container.call(this);
// Create container for obstacle parts
var obstacleContainer = new Container();
self.addChild(obstacleContainer);
// Create red obstacle (full obstacle is dangerous)
var redPart = self.attachAsset('obstacle', {
anchorX: 0.5,
anchorY: 0.5,
tint: 0xff0000,
// Make obstacle red
scaleY: 1.0
});
self.redPart = redPart;
self.width = redPart.width;
self.height = redPart.height;
self.lane = 1;
self.type = "normal"; // normal, low, high
self.canSlideUnder = true; // All obstacles can be slid under
self.setType = function (newType) {
self.type = newType;
// Keep consistent size regardless of type
if (newType === "low") {
// Just adjust position, not size
self.y += self.height * 0.2;
} else if (newType === "high") {
// Just adjust position, not size
self.y -= self.height * 0.2;
}
};
// Check if player is colliding with red part
self.isCollidingWithRedPart = function (player) {
var redPartBounds = {
top: self.y - redPart.height * 0.5,
bottom: self.y + redPart.height * 0.5,
left: self.x - redPart.width * 0.5,
right: self.x + redPart.width * 0.5
};
var playerBounds = {
top: player.y - player.height * 0.5,
bottom: player.y + player.height * 0.5,
left: player.x - player.width * 0.5,
right: player.x + player.width * 0.5
};
return !(redPartBounds.right < playerBounds.left || redPartBounds.left > playerBounds.right || redPartBounds.bottom < playerBounds.top || redPartBounds.top > playerBounds.bottom);
};
self.update = function () {
self.y += gameSpeed;
if (self.y > 2732 + self.height) {
self.destroy();
}
};
return self;
});
var Player = Container.expand(function () {
var self = Container.call(this);
var playerSprite = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = playerSprite.width;
self.height = playerSprite.height;
self.lane = 1; // 0=left, 1=center, 2=right
self.isJumping = false;
self.isSliding = false;
// No lifesaver/shield functionality
self.jump = function () {
if (!self.isJumping) {
self.isJumping = true;
var startY = self.y;
LK.getSound('jump').play();
tween(self, {
y: startY - 300
}, {
duration: 550,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(self, {
y: startY
}, {
duration: 550,
easing: tween.easeIn,
onFinish: function onFinish() {
self.isJumping = false;
}
});
}
});
}
};
self.slide = function () {
if (!self.isSliding && !self.isJumping) {
self.isSliding = true;
var originalHeight = playerSprite.height;
tween(playerSprite, {
scaleY: 0.5
}, {
duration: 250,
onFinish: function onFinish() {
LK.setTimeout(function () {
tween(playerSprite, {
scaleY: 1
}, {
duration: 250,
onFinish: function onFinish() {
self.isSliding = false;
}
});
}, 600);
}
});
}
};
self.moveLane = function (targetLane) {
if (targetLane >= 0 && targetLane <= 3) {
self.lane = targetLane;
tween(self, {
x: roadPositions[targetLane]
}, {
duration: 100,
easing: tween.easeOut
});
}
};
self.update = function () {
// Player logic updated in game update
};
return self;
});
var PlayerParticle = Container.expand(function () {
var self = Container.call(this);
var particleSprite = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 0.2 + Math.random() * 0.2,
scaleY: 0.2 + Math.random() * 0.2
});
self.vx = 0;
self.vy = 0;
self.gravity = 0.2;
self.friction = 0.98;
self.lifespan = 1000;
self.birthTime = Date.now();
self.update = function () {
// Apply physics
self.vy += self.gravity;
self.vx *= self.friction;
self.vy *= self.friction;
self.x += self.vx;
self.y += self.vy;
// Fade out based on lifespan
var age = Date.now() - self.birthTime;
var lifePercent = 1 - age / self.lifespan;
if (lifePercent <= 0) {
self.destroy();
return;
}
particleSprite.alpha = lifePercent;
};
return self;
});
var PowerUp = Container.expand(function () {
var self = Container.call(this);
var powerupSprite = self.attachAsset('powerup', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = powerupSprite.width;
self.height = powerupSprite.height;
self.lane = 1;
self.type = "shield"; // shield, magnet, slowdown
// Pulsate animation
function pulsate() {
tween(powerupSprite, {
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 500,
onFinish: function onFinish() {
tween(powerupSprite, {
scaleX: 1,
scaleY: 1
}, {
duration: 500,
onFinish: pulsate
});
}
});
}
pulsate();
self.setType = function (newType) {
self.type = newType;
if (newType === "shield") {
powerupSprite.tint = 0x00FFFF; // Blue color
// Position shield powerups higher on the screen
self.y -= 400; // Increased from 200 to 400 to position higher
} else if (newType === "magnet") {
powerupSprite.tint = 0xFF00FF;
} else if (newType === "slowdown") {
powerupSprite.tint = 0x00FF00;
}
};
self.update = function () {
self.y += gameSpeed;
if (self.y > 2732 + self.height) {
self.destroy();
}
};
return self;
});
var RoadLine = Container.expand(function () {
var self = Container.call(this);
var lineSprite = self.attachAsset('road_line', {
anchorX: 0.5,
anchorY: 0.5
});
self.width = lineSprite.width;
self.height = lineSprite.height;
self.lane = 0; // 0-3 for the four road lanes
self.update = function () {
// Road lines remain stationary
};
self.resetPosition = function () {
// No reset needed as lines are now stationary
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x777777 // Gray background
});
/****
* Game Code
****/
// Game variables
var player;
var obstacles = [];
var coins = [];
var powerups = [];
var buses = [];
var roadLines = [];
var ground;
var gameSpeed = 5;
var initialGameSpeed = 5;
var maxGameSpeed = 15;
var speedIncreaseInterval;
var gameStarted = false;
var distanceTraveled = 0;
var score = 0;
var coinValue = 10;
var highScore = storage.highScore || 0;
var hasMagnet = false;
var magnetRange = 200;
// Define the 4 road positions (vertical lanes)
var roadWidth = 2048 / 4;
var roadPositions = [roadWidth * 0.5, roadWidth * 1.5, roadWidth * 2.5, roadWidth * 3.5];
// Lane positions for player, obstacles and collectibles
var laneX = [roadPositions[0], roadPositions[1], roadPositions[2], roadPositions[3]];
// UI elements
var coinCount = storage.coinCount || 0;
var coinTxt = new Text2('COINS: 0', {
size: 60,
fill: 0xFFD700 // Gold color for coins
});
coinTxt.anchor.set(0, 0);
LK.gui.topRight.addChild(coinTxt);
coinTxt.x = -coinTxt.width - 20;
coinTxt.y = 20;
// Leaderboard display
var leaderboardTitle = new Text2('TOP PLAYERS', {
size: 50,
fill: 0xFFFFFF
});
leaderboardTitle.anchor.set(0, 0);
LK.gui.topLeft.addChild(leaderboardTitle);
leaderboardTitle.x = 120; // Leave space for platform menu icon
leaderboardTitle.y = 20;
// Create text elements for each leaderboard entry
var leaderboardEntries = [];
for (var i = 0; i < 3; i++) {
var entryText = new Text2(i + 1 + '. ---: 0', {
size: 40,
fill: 0xFFFFFF
});
entryText.anchor.set(0, 0);
LK.gui.topLeft.addChild(entryText);
entryText.x = 120; // Leave space for platform menu icon
entryText.y = 80 + i * 50;
leaderboardEntries.push(entryText);
}
// Initialize leaderboard
updateLeaderboard();
var scoreTxt = new Text2('SCORE: 0', {
size: 60,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0, 0);
LK.gui.topRight.addChild(scoreTxt);
scoreTxt.x = -scoreTxt.width - 20;
scoreTxt.y = 90; // Move down to make room for coin counter
var distanceTxt = new Text2('DISTANCE: 0m', {
size: 60,
fill: 0xFFFFFF
});
distanceTxt.anchor.set(0, 0);
LK.gui.topRight.addChild(distanceTxt);
distanceTxt.x = -distanceTxt.width - 20;
distanceTxt.y = 160; // Adjusted to make room for coin and score
var highScoreTxt = new Text2('BEST: ' + highScore, {
size: 50,
fill: 0xFFFFFF
});
highScoreTxt.anchor.set(0, 0);
LK.gui.topRight.addChild(highScoreTxt);
highScoreTxt.x = -highScoreTxt.width - 20;
highScoreTxt.y = 230; // Adjusted to make room for coin and score
var startTxt = new Text2('SWIPE TO START', {
size: 100,
fill: 0xFFFFFF
});
startTxt.anchor.set(0.5, 0.5);
LK.gui.center.addChild(startTxt);
// Game initialization functions
function initializeGame() {
// Create gray ground/background
game.setBackgroundColor(0x777777);
ground = game.addChild(LK.getAsset('ground', {
anchorX: 0.5,
anchorY: 0.5
}));
ground.x = 2048 / 2;
ground.y = 2732 / 2;
// Create 4 vertical roads with no gaps between them
var roadWidth = 2048 / 4; // Divide screen width into 4 equal parts
for (var i = 0; i < 4; i++) {
var road = game.addChild(LK.getAsset('road', {
anchorX: 0.5,
anchorY: 0.5,
width: roadWidth,
// Set width to exactly 1/4 of screen
height: 2732 // Full screen height
}));
road.x = roadWidth * i + roadWidth / 2; // Position roads side by side with no gaps
road.y = 2732 / 2;
}
// Create road lines as vertical marks down the roads
var roadWidth = 2048 / 4; // Width of each road
for (var i = 0; i < 4; i++) {
for (var j = 0; j < 15; j++) {
var roadLine = new RoadLine();
roadLine.lane = i;
roadLine.x = roadWidth * i + roadWidth / 2; // Center in each road
roadLine.y = j * 200; // Distribute lines vertically
roadLines.push(roadLine);
game.addChild(roadLine);
}
}
// Create player
player = game.addChild(new Player());
player.lane = 1; // Start in second lane
player.x = roadPositions[player.lane]; // Position player horizontally on the road
player.y = 2732 - 500; // Position player higher on the screen
// Create regular buses
for (var i = 0; i < 6; i++) {
var bus = new Bus();
bus.lane = Math.floor(Math.random() * 4);
bus.x = roadPositions[bus.lane];
// Position buses with enough space between them vertically
var offset = i * (bus.height + 300);
bus.y = -offset - bus.height;
// Make sure buses in the same lane don't overlap
for (var j = 0; j < buses.length; j++) {
if (bus.lane === buses[j].lane && Math.abs(bus.y - buses[j].y) < bus.height + buses[j].height) {
// Move this bus further up to avoid overlap
bus.y = buses[j].y - (bus.height + 300);
}
}
buses.push(bus);
game.addChild(bus);
}
// Create jumping boards (previously mini buses)
var miniBuses = [];
for (var i = 0; i < 4; i++) {
var miniBus = new MiniBus();
miniBus.lane = Math.floor(Math.random() * 4);
miniBus.x = roadPositions[miniBus.lane];
// Position jumping boards with significantly more space between them
var offset = i * (miniBus.height + 800); // Increased vertical spacing between boards from 400 to 800
miniBus.y = -offset - miniBus.height - 500;
// Make sure jumping boards don't overlap with regular buses
for (var j = 0; j < buses.length; j++) {
if (miniBus.lane === buses[j].lane && Math.abs(miniBus.y - buses[j].y) < miniBus.height + buses[j].height) {
miniBus.y = buses[j].y - (miniBus.height + 600); // Increased separation from 400 to 600
}
}
// Check spacing with other jumping boards that were already created
for (var j = 0; j < miniBuses.length; j++) {
if (miniBus.lane === miniBuses[j].lane && Math.abs(miniBus.y - miniBuses[j].y) < miniBus.height * 6) {
// If too close to another jumping board in the same lane, move it further up
miniBus.y = miniBuses[j].y - miniBus.height * 6;
}
}
miniBuses.push(miniBus);
buses.push(miniBus); // Add to main buses array for updates
game.addChild(miniBus);
}
// Initialize variables
obstacles = []; // Keep empty as we don't use obstacles at all
coins = [];
powerups = [];
gameSpeed = initialGameSpeed;
distanceTraveled = 0;
score = 0;
// Don't reset coinCount here to preserve coins between game sessions
updateUI();
// No reset coins button - removed as requested
}
function startGame() {
gameStarted = true;
LK.setScore(0);
// Load persistent coin count from storage
coinCount = storage.coinCount || coinCount;
startTxt.visible = false;
// Start increasing game speed over time
speedIncreaseInterval = LK.setInterval(function () {
if (gameSpeed < maxGameSpeed) {
gameSpeed += 0.5;
// Update all buses to have the same speed when game speed changes
for (var i = 0; i < buses.length; i++) {
buses[i].speed = 1; // Keep all buses at same speed when the game speeds up
}
}
}, 10000);
// Start spawning only coins and powerups (no obstacles)
spawnCoins();
spawnPowerups();
// Play background music
LK.playMusic('bgmusic');
}
function updateUI() {
coinTxt.setText('COINS: ' + coinCount);
coinTxt.x = -coinTxt.width - 20;
scoreTxt.setText('SCORE: ' + score);
scoreTxt.x = -scoreTxt.width - 20;
var distance = Math.floor(distanceTraveled / 10);
distanceTxt.setText('DISTANCE: ' + distance + 'm');
distanceTxt.x = -distanceTxt.width - 20;
highScoreTxt.setText('BEST: ' + highScore);
highScoreTxt.x = -highScoreTxt.width - 20;
// Save coin count to storage when UI is updated to persist between sessions
storage.coinCount = coinCount;
}
function updateLeaderboard() {
// Get leaderboard from storage or create empty array if none exists
var leaderboard = storage.leaderboard || [];
// Update entries in UI
for (var i = 0; i < 3; i++) {
if (i < leaderboard.length) {
var entry = leaderboard[i];
var parts = entry.split(":");
var playerName = parts[0];
var score = parts[1];
leaderboardEntries[i].setText(i + 1 + '. ' + playerName + ': ' + score);
} else {
leaderboardEntries[i].setText(i + 1 + '. ---: 0');
}
}
}
function addToLeaderboard(newScore) {
// Get leaderboard from storage or create empty array if none exists
var leaderboard = storage.leaderboard || [];
// Generate a player name (could be replaced with actual player names in a real game)
var playerName = "Player" + Math.floor(Math.random() * 100);
// Add new score - store as separate entries to avoid nesting objects
leaderboard.push(playerName + ":" + newScore);
// Sort leaderboard by score (descending) - parse scores from string format
leaderboard.sort(function (a, b) {
var scoreA = parseInt(a.split(":")[1]);
var scoreB = parseInt(b.split(":")[1]);
return scoreB - scoreA;
});
// Keep only top entries
if (leaderboard.length > 10) {
leaderboard = leaderboard.slice(0, 10);
}
// Save back to storage
storage.leaderboard = leaderboard;
// Update UI
updateLeaderboard();
}
// Object spawning functions
function spawnObstacles() {
// Function is empty because we don't want to spawn any obstacles
// Only jumping boards (MiniBus objects) will be used as obstacles
}
function spawnCoins() {
var coinTimer = LK.setInterval(function () {
if (!gameStarted) return;
// Random coin pattern
var pattern = Math.floor(Math.random() * 4);
if (pattern === 0) {
// Single coin
var lane = Math.floor(Math.random() * 4);
spawnCoin(lane);
} else if (pattern === 1) {
// Vertical line of coins
var lane = Math.floor(Math.random() * 4);
for (var i = 0; i < 3; i++) {
var coin = new Coin();
coin.lane = lane;
coin.x = roadPositions[lane];
coin.y = -coin.height - i * 120;
coins.push(coin);
game.addChild(coin);
}
} else if (pattern === 2) {
// Horizontal line of coins
for (var i = 0; i < 4; i++) {
spawnCoin(i);
}
} else {
// Diagonal line of coins
for (var i = 0; i < 4; i++) {
var coin = new Coin();
coin.lane = i;
coin.x = roadPositions[i];
coin.y = -coin.height - i * 120;
coins.push(coin);
game.addChild(coin);
}
}
}, 3000);
}
function spawnCoin(lane) {
var coin = new Coin();
coin.lane = lane;
coin.x = roadPositions[lane];
coin.y = -coin.height;
// Check if there are buses in this lane near spawn point with increased range
var busInLane = false;
for (var i = 0; i < buses.length; i++) {
if (buses[i].lane === lane && buses[i].y < 0 && buses[i].y > -500) {
// Increased range check
busInLane = true;
break;
}
}
// Only spawn coins if there's no bus in this lane
if (!busInLane) {
// Increased chance to spawn additional coins if in lane 1 (correct lane)
if (lane === 1 && Math.random() < 0.9) {
// Increased probability from 0.7 to 0.9
// Add extra coins in a vertical line in the correct lane
for (var i = 1; i < 6; i++) {
// Check for buses before spawning each extra coin
var extraCoinY = -coin.height - i * 100;
var extraCoinBusCollision = false;
for (var j = 0; j < buses.length; j++) {
if (buses[j].lane === lane && Math.abs(buses[j].y - extraCoinY) < buses[j].height / 2 + coin.height / 2) {
extraCoinBusCollision = true;
break;
}
}
if (!extraCoinBusCollision) {
var extraCoin = new Coin();
extraCoin.lane = lane;
extraCoin.x = roadPositions[lane];
extraCoin.y = extraCoinY; // Reduced spacing for more coins
coins.push(extraCoin);
game.addChild(extraCoin);
}
}
}
coins.push(coin);
game.addChild(coin);
}
}
function spawnPowerups() {
var powerupTimer = LK.setInterval(function () {
if (!gameStarted) return;
var powerup = new PowerUp();
powerup.lane = Math.floor(Math.random() * 4);
// Check if there's already an obstacle or powerup in this lane near spawn point
var canSpawn = true;
for (var i = 0; i < obstacles.length; i++) {
if (obstacles[i].lane === powerup.lane && obstacles[i].y < 0) {
canSpawn = false;
break;
}
}
for (var i = 0; i < powerups.length; i++) {
if (powerups[i].lane === powerup.lane && powerups[i].y < 0) {
canSpawn = false;
break;
}
}
if (!canSpawn) return;
powerup.x = roadPositions[powerup.lane];
powerup.y = -powerup.height;
// Randomize powerup type
var types = ["shield", "magnet", "slowdown"];
var randomType = types[Math.floor(Math.random() * types.length)];
powerup.setType(randomType);
powerups.push(powerup);
game.addChild(powerup);
}, 15000); // Powerups appear less frequently
}
// Function to reset all coins in the game (only visual coins, not the count)
function resetCoins() {
// Remove all existing coins on screen
for (var i = coins.length - 1; i >= 0; i--) {
coins[i].destroy();
}
coins = [];
// Ensure we're keeping the coin count persistent
storage.coinCount = coinCount;
updateUI();
}
// Game mechanics functions
function checkCollisions() {
// No obstacle collisions to check since we're not spawning obstacles anymore
// Only jumping boards (MiniBus objects) are used as obstacles
// Check bus collisions
for (var i = buses.length - 1; i >= 0; i--) {
var bus = buses[i];
// Check for bus-to-bus collisions
for (var j = 0; j < buses.length; j++) {
if (i !== j && bus.lane === buses[j].lane && Math.abs(bus.y - buses[j].y) < (bus.height + buses[j].height) * 0.8) {
// Prevent overlap by repositioning this bus
bus.y = buses[j].y - (bus.height + buses[j].height);
if (bus.y > 2732 + bus.height) {
bus.resetPosition();
}
}
}
// Check for bus-to-obstacle collisions
for (var j = 0; j < obstacles.length; j++) {
if (bus.lane === obstacles[j].lane && Math.abs(bus.y - obstacles[j].y) < (bus.height + obstacles[j].height) * 0.8) {
// Prevent overlap by repositioning this bus
bus.y = obstacles[j].y - (bus.height + obstacles[j].height);
if (bus.y > 2732 + bus.height) {
bus.resetPosition();
}
}
}
// Ensure at least one free lane is available at all times
// First count how many lanes have buses in the player's vicinity
var busesNearPlayer = [0, 0, 0, 0]; // Count of buses in each lane
for (var j = 0; j < buses.length; j++) {
var nearBus = buses[j];
// Only count buses that are close to the player vertically
if (Math.abs(nearBus.y - player.y) < 700) {
// Increased detection range
busesNearPlayer[nearBus.lane]++;
}
}
// If all lanes have buses near the player, move one bus to ensure a free lane
var totalBlockedLanes = (busesNearPlayer[0] > 0 ? 1 : 0) + (busesNearPlayer[1] > 0 ? 1 : 0) + (busesNearPlayer[2] > 0 ? 1 : 0) + (busesNearPlayer[3] > 0 ? 1 : 0);
if (totalBlockedLanes >= 3) {
// More aggressive - clear if 3+ lanes are blocked
// Find a lane that's different from player's current lane to free up
var laneToFree = (player.lane + 2) % 4; // Pick lane opposite to player
// Make sure this lane is completely clear by moving ALL buses in this lane
for (var j = 0; j < buses.length; j++) {
if (buses[j].lane === laneToFree && Math.abs(buses[j].y - player.y) < 1000) {
// Increased range
buses[j].resetPosition(); // Move this bus away
// Add additional space to ensure safety
buses[j].y -= Math.random() * 800;
}
}
}
// Check player collision with bus
if (player.lane === bus.lane && Math.abs(player.y - bus.y) < (player.height + bus.height) / 2) {
// Check if it's a jumping board that can be jumped over
if (bus instanceof MiniBus && player.isJumping) {
continue; // Player successfully jumped over the jumping board
}
// Check if player can jump over the jumping board
if (bus instanceof MiniBus) {
// Track jumping boards approaching player
if (bus.y < player.y && bus.y > player.y - 400) {
// No highlighting needed
}
}
// Flash warning when player is about to collide with a bus
if (!player.warningShown && bus.y < player.y && bus.y > player.y - 300) {
player.warningShown = true;
// Flash the player to warn of incoming danger
var flashCount = 0;
var warningInterval = LK.setInterval(function () {
player.alpha = player.alpha === 1 ? 0.5 : 1;
flashCount++;
if (flashCount >= 6) {
LK.clearInterval(warningInterval);
player.alpha = 1;
// Reset warning after a delay
LK.setTimeout(function () {
player.warningShown = false;
}, 1000);
}
}, 100);
}
// Collision occurred
createPlayerParticles();
gameOver();
break;
}
}
// Check coin collections
for (var i = coins.length - 1; i >= 0; i--) {
var coin = coins[i];
// Track the last position of the coin relative to player
if (coin.lastRelativeY === undefined) {
coin.lastRelativeY = coin.y - player.y;
}
var currentRelativeY = coin.y - player.y;
// Regular collection - Only collect when coin passes directly over player
if (player.lane === coin.lane && coin.lastRelativeY < 0 && currentRelativeY >= 0 && Math.abs(player.x - coin.x) < (player.width + coin.width) / 2) {
// Coin just passed over the player (crossed from above to below)
collectCoin(coin, i);
}
// Magnet effect collection
else if (hasMagnet && Math.sqrt(Math.pow(player.x - coin.x, 2) + Math.pow(player.y - coin.y, 2)) < magnetRange) {
tween(coin, {
x: player.x,
y: player.y
}, {
duration: 200,
onFinish: function onFinish() {
collectCoin(coin, i);
}
});
}
// Update last relative position
coin.lastRelativeY = currentRelativeY;
}
// Check powerup collections
for (var i = powerups.length - 1; i >= 0; i--) {
var powerup = powerups[i];
// No obstacles to check for overlap with powerups
// Check if powerup is about to overlap with other powerups
if (i >= 0 && powerups[i]) {
for (var j = 0; j < powerups.length; j++) {
if (i !== j && powerup.lane === powerups[j].lane && Math.abs(powerup.y - powerups[j].y) < (powerup.height + powerups[j].height) / 2) {
// Remove this powerup to prevent overlap
powerups.splice(i, 1);
powerup.destroy();
i--;
break;
}
}
}
if (i < 0 || !powerups[i]) continue;
powerup = powerups[i];
if (player.lane === powerup.lane && Math.abs(player.x - powerup.x) < (player.width + powerup.width) / 2) {
// Apply powerup effect
if (powerup.type === "shield") {
player.activateShield();
} else if (powerup.type === "magnet") {
activateMagnet();
} else if (powerup.type === "slowdown") {
slowDownGame();
}
LK.getSound('powerup_collect').play();
score += 30;
LK.setScore(score);
updateUI();
powerups.splice(i, 1);
powerup.destroy();
}
}
}
function collectCoin(coin, index) {
LK.getSound('coin_collect').play();
score += coinValue;
coinCount++;
LK.setScore(score);
// Get the global position of the coin
var coinPos = {
x: coin.x,
y: coin.y
};
// Get the global position of the coin counter
var counterPos = {
x: LK.gui.topRight.x - coinTxt.width / 2,
y: LK.gui.topRight.y + coinTxt.height / 2
};
// Adjust to make sure coins fly exactly to the counter
counterPos.x -= 200;
counterPos.y += 20;
// Create flying coin animation with rotation
var coinParticle = new CoinParticle();
game.addChild(coinParticle);
coinParticle.init(coinPos.x, coinPos.y, counterPos.x, counterPos.y);
// Make sure the coin exists before trying to remove it
if (index >= 0 && index < coins.length && coins[index]) {
coins.splice(index, 1);
coin.destroy();
} else if (coin) {
// If index is invalid but we have a coin reference, just destroy it
// and remove it from the coins array if found
coin.destroy();
var coinIndex = coins.indexOf(coin);
if (coinIndex >= 0) {
coins.splice(coinIndex, 1);
}
}
updateUI();
}
function activateMagnet() {
hasMagnet = true;
LK.setTimeout(function () {
hasMagnet = false;
}, 10000);
}
function slowDownGame() {
var originalSpeed = gameSpeed;
gameSpeed = gameSpeed / 2;
LK.setTimeout(function () {
gameSpeed = originalSpeed;
}, 5000);
}
function createPlayerParticles() {
// Create particle explosion effect at player position
var particleCount = 20;
var particles = [];
for (var i = 0; i < particleCount; i++) {
var particle = new PlayerParticle();
game.addChild(particle);
particle.x = player.x;
particle.y = player.y;
// Random direction
var angle = Math.random() * Math.PI * 2;
var speed = 2 + Math.random() * 5;
particle.vx = Math.cos(angle) * speed;
particle.vy = Math.sin(angle) * speed;
// Random rotation and scale for variety
particle.rotation = Math.random() * Math.PI * 2;
// Set random lifespan
particle.lifespan = 800 + Math.random() * 1200;
particle.birthTime = Date.now();
// Add to particles array for tracking
particles.push(particle);
}
// Hide the original player
player.visible = false;
}
function gameOver() {
LK.getSound('crash').play();
// Update high score if needed
if (score > highScore) {
highScore = score;
storage.highScore = highScore;
}
// Save final coin count to ensure it persists after game over
storage.coinCount = coinCount;
// Update leaderboard with current score
addToLeaderboard(score);
// Clear intervals
LK.clearInterval(speedIncreaseInterval);
// Make player visible again if it was hidden
player.visible = true;
// Create a character growth animation before game over
// Start growing from the player's current position
var currentX = player.x;
var currentY = player.y;
// Use tween to grow player's color to fill the screen
tween(player, {
scaleX: 25,
// Make even larger to ensure full screen coverage
scaleY: 25,
// Make even larger to ensure full screen coverage
alpha: 0.95,
// More visible
rotation: Math.PI * 2 // Full rotation for effect
}, {
duration: 2000,
// Longer duration for more dramatic effect
easing: tween.elasticOut,
onFinish: function onFinish() {
// Now show game over after animation completes
LK.showGameOver();
}
});
}
// Helper function to find the safest lane
function findSafeLane() {
// Count objects in each lane near the player
var laneDanger = [0, 0, 0, 0];
// Check buses in each lane with a wider vertical range
for (var i = 0; i < buses.length; i++) {
if (Math.abs(buses[i].y - player.y) < 600) {
// Increased detection range
laneDanger[buses[i].lane] += 2;
}
}
// Find the lane with minimum danger
var minDanger = 999;
var safestLane = player.lane;
for (var i = 0; i < 4; i++) {
if (laneDanger[i] < minDanger) {
minDanger = laneDanger[i];
safestLane = i;
}
}
// ALWAYS ensure at least one lane is completely safe
// If all lanes have danger, ensure at least one lane is safe
var allLanesHaveDanger = true;
for (var i = 0; i < 4; i++) {
if (laneDanger[i] === 0) {
allLanesHaveDanger = false;
safestLane = i; // Immediately use first safe lane found
break;
}
}
// If all lanes have danger, force clear out a lane
if (allLanesHaveDanger) {
// Choose a lane different from player's current lane to free up
var laneToFree = (player.lane + 2) % 4;
// Clear ALL buses from this lane that are near the player
for (var i = 0; i < buses.length; i++) {
if (buses[i].lane === laneToFree && Math.abs(buses[i].y - player.y) < 800) {
// Move bus way above the screen to ensure it's far away
buses[i].y = -buses[i].height - Math.random() * 3000; // Increased distance
}
}
// Set this as safest lane
safestLane = laneToFree;
// Add visual indicator for the safe lane (removed as requested)
}
return safestLane;
}
// Touch/swipe controls
var startY, startX;
var MIN_SWIPE_DISTANCE = 30;
game.down = function (x, y) {
startX = x;
startY = y;
};
game.up = function (x, y) {
if (!startX || !startY) return;
var deltaX = x - startX;
var deltaY = y - startY;
var absDeltaX = Math.abs(deltaX);
var absDeltaY = Math.abs(deltaY);
// Start game on any swipe if not started
if (!gameStarted) {
startGame();
return;
}
// Lower the minimum swipe distance to make it more sensitive
var MIN_SWIPE_DISTANCE = 30;
// Detect swipe direction
if (absDeltaX > MIN_SWIPE_DISTANCE || absDeltaY > MIN_SWIPE_DISTANCE) {
// Horizontal swipe detection (left/right) - always move only to adjacent lane
if (absDeltaX > absDeltaY) {
if (deltaX > 0) {
// Swipe right - move to adjacent right lane if possible
var newLane = Math.min(player.lane + 1, 3);
// Check if killTweensOf exists before calling it
if (tween.killTweensOf) {
tween.killTweensOf(player); // Kill any existing movement tweens
}
// Shorter duration for faster response
tween(player, {
x: roadPositions[newLane]
}, {
duration: 100,
// Faster movement
easing: tween.easeOut
});
player.lane = newLane; // Update player lane
} else {
// Swipe left - move to adjacent left lane if possible
var newLane = Math.max(player.lane - 1, 0);
// Check if killTweensOf exists before calling it
if (tween.killTweensOf) {
tween.killTweensOf(player);
}
// Shorter duration for faster response
tween(player, {
x: roadPositions[newLane]
}, {
duration: 100,
// Faster movement
easing: tween.easeOut
});
player.lane = newLane; // Update player lane
}
}
// Vertical swipe detection (up/down)
else {
if (deltaY < 0) {
// Swipe up (jump)
player.jump();
} else {
// Swipe down (slide)
player.slide();
}
}
}
};
// Initialize the game
initializeGame();
// Game update loop
game.update = function () {
if (!gameStarted) {
// Don't do any movement when game hasn't started
return;
}
// Update distance traveled
distanceTraveled += gameSpeed;
updateUI();
// Check for collisions
checkCollisions();
// No obstacles to update since we don't spawn them anymore
for (var i = coins.length - 1; i >= 0; i--) {
if (coins[i]) coins[i].update();
}
for (var i = powerups.length - 1; i >= 0; i--) {
if (powerups[i]) powerups[i].update();
}
// Ensure jumping boards (MiniBus objects) aren't too close to each other
var jumpingBoards = buses.filter(function (bus) {
return bus instanceof MiniBus;
});
// Check each jumping board against others in the same lane
for (var i = 0; i < jumpingBoards.length; i++) {
for (var j = i + 1; j < jumpingBoards.length; j++) {
if (jumpingBoards[i].lane === jumpingBoards[j].lane) {
var distance = Math.abs(jumpingBoards[i].y - jumpingBoards[j].y);
// If boards are too close, reposition the one that's higher up
if (distance < jumpingBoards[i].height * 10) {
// Increased from 5x to 10x minimum spacing
var higherBoard = jumpingBoards[i].y < jumpingBoards[j].y ? jumpingBoards[i] : jumpingBoards[j];
// Reset position of the higher board to ensure adequate spacing
higherBoard.resetPosition();
// Move it even further up to ensure separation
higherBoard.y -= higherBoard.height * 10 + Math.random() * 400; // Increased spacing
}
}
}
}
for (var i = buses.length - 1; i >= 0; i--) {
if (buses[i]) buses[i].update();
}
// Road lines are now stationary
// Update all PlayerParticle instances that might be in the scene
var particles = game.children.filter(function (child) {
return child instanceof PlayerParticle;
});
for (var i = 0; i < particles.length; i++) {
particles[i].update();
}
}; ===================================================================
--- original.js
+++ change.js
@@ -134,45 +134,8 @@
animateStep(0);
};
return self;
});
-var Lifesaver = Container.expand(function () {
- var self = Container.call(this);
- var lifesaverSprite = self.attachAsset('powerup', {
- anchorX: 0.5,
- anchorY: 0.5,
- tint: 0xFF0000 // Red color for lifesaver
- });
- self.width = lifesaverSprite.width;
- self.height = lifesaverSprite.height;
- self.lane = 1;
- // Pulsate animation with higher visibility
- function pulsate() {
- tween(lifesaverSprite, {
- scaleX: 1.3,
- scaleY: 1.3
- }, {
- duration: 400,
- onFinish: function onFinish() {
- tween(lifesaverSprite, {
- scaleX: 1,
- scaleY: 1
- }, {
- duration: 400,
- onFinish: pulsate
- });
- }
- });
- }
- pulsate();
- self.update = function () {
- self.y += gameSpeed;
- if (self.y > 2732 + self.height) {
- self.destroy();
- }
- };
- return self;
-});
var MiniBus = Container.expand(function () {
var self = Container.call(this);
// Replace bus sprite with jumpboard
var busSprite = self.attachAsset('jumpboard', {
@@ -283,9 +246,9 @@
self.height = playerSprite.height;
self.lane = 1; // 0=left, 1=center, 2=right
self.isJumping = false;
self.isSliding = false;
- self.hasShield = false;
+ // No lifesaver/shield functionality
self.jump = function () {
if (!self.isJumping) {
self.isJumping = true;
var startY = self.y;
@@ -342,16 +305,8 @@
easing: tween.easeOut
});
}
};
- self.activateShield = function () {
- self.hasShield = true;
- playerSprite.tint = 0x00FFFF;
- LK.setTimeout(function () {
- self.hasShield = false;
- playerSprite.tint = 0xFFFFFF;
- }, 5000);
- };
self.update = function () {
// Player logic updated in game update
};
return self;
@@ -471,9 +426,8 @@
var coins = [];
var powerups = [];
var buses = [];
var roadLines = [];
-var lifesavers = [];
var ground;
var gameSpeed = 5;
var initialGameSpeed = 5;
var maxGameSpeed = 15;
@@ -484,11 +438,8 @@
var coinValue = 10;
var highScore = storage.highScore || 0;
var hasMagnet = false;
var magnetRange = 200;
-var hasLifesaver = false;
-var lifesaverSpawnInterval;
-var lifesaverExpirationTimer = null;
// Define the 4 road positions (vertical lanes)
var roadWidth = 2048 / 4;
var roadPositions = [roadWidth * 0.5, roadWidth * 1.5, roadWidth * 2.5, roadWidth * 3.5];
// Lane positions for player, obstacles and collectibles
@@ -670,25 +621,8 @@
}, 10000);
// Start spawning only coins and powerups (no obstacles)
spawnCoins();
spawnPowerups();
- // Reset lifesaver state
- hasLifesaver = false;
- lifesavers = [];
- if (lifesaverExpirationTimer) {
- LK.clearTimeout(lifesaverExpirationTimer);
- lifesaverExpirationTimer = null;
- }
- // Clear any lifesaver timer on the player
- if (player && player.lifesaverTimer) {
- LK.clearTimeout(player.lifesaverTimer);
- player.lifesaverTimer = null;
- }
- // Remove lifesaver indicator if it exists
- if (player && player.lifesaverIndicator) {
- player.lifesaverIndicator.destroy();
- player.lifesaverIndicator = null;
- }
// Play background music
LK.playMusic('bgmusic');
}
function updateUI() {
@@ -857,41 +791,8 @@
powerup.setType(randomType);
powerups.push(powerup);
game.addChild(powerup);
}, 15000); // Powerups appear less frequently
- // Start lifesaver spawning
- lifesaverSpawnInterval = LK.setInterval(function () {
- if (!gameStarted) return;
- // Only spawn if player doesn't already have a lifesaver
- if (!hasLifesaver) {
- var lifesaver = new Lifesaver();
- lifesaver.lane = Math.floor(Math.random() * 4);
- // Use a lane that has less obstacles if possible
- var laneCounts = [0, 0, 0, 0];
- for (var i = 0; i < buses.length; i++) {
- if (buses[i].y < 0) {
- laneCounts[buses[i].lane]++;
- }
- }
- // Find lane with fewest obstacles
- var minCount = 999;
- var bestLane = lifesaver.lane;
- for (var i = 0; i < 4; i++) {
- if (laneCounts[i] < minCount) {
- minCount = laneCounts[i];
- bestLane = i;
- }
- }
- // 70% chance to use the best lane
- if (Math.random() < 0.7) {
- lifesaver.lane = bestLane;
- }
- lifesaver.x = roadPositions[lifesaver.lane];
- lifesaver.y = -lifesaver.height;
- lifesavers.push(lifesaver);
- game.addChild(lifesaver);
- }
- }, 20000); // Lifesavers appear less frequently than regular powerups
}
// Function to reset all coins in the game (only visual coins, not the count)
function resetCoins() {
// Remove all existing coins on screen
@@ -969,14 +870,8 @@
if (bus.y < player.y && bus.y > player.y - 400) {
// No highlighting needed
}
}
- // Check if player has shield
- if (player.hasShield) {
- player.hasShield = false;
- player.tint = 0xFFFFFF;
- continue;
- }
// Flash warning when player is about to collide with a bus
if (!player.warningShown && bus.y < player.y && bus.y > player.y - 300) {
player.warningShown = true;
// Flash the player to warn of incoming danger
@@ -1062,47 +957,8 @@
powerups.splice(i, 1);
powerup.destroy();
}
}
- // Check lifesaver collections
- for (var i = lifesavers.length - 1; i >= 0; i--) {
- var lifesaver = lifesavers[i];
- // Check if player collects the lifesaver
- if (player.lane === lifesaver.lane && Math.abs(player.y - lifesaver.y) < (player.height + lifesaver.height) / 2) {
- // Apply lifesaver effect
- hasLifesaver = true;
- // Visual indicator that player has a lifesaver
- var indicator = new Text2("❤️", {
- size: 60,
- fill: 0xFF0000
- });
- indicator.anchor.set(0.5, 0.5);
- player.addChild(indicator);
- indicator.y = -player.height / 2 - 30;
- // Save the indicator for later removal
- player.lifesaverIndicator = indicator;
- LK.getSound('powerup_collect').play();
- score += 50;
- LK.setScore(score);
- updateUI();
- // Make lifesaver expire after 10 seconds
- if (player.lifesaverTimer) {
- LK.clearTimeout(player.lifesaverTimer);
- }
- // Store the expiration timer
- lifesaverExpirationTimer = LK.setTimeout(function () {
- hasLifesaver = false;
- if (player.lifesaverIndicator) {
- player.lifesaverIndicator.destroy();
- player.lifesaverIndicator = null;
- }
- }, 10000); // 10 seconds expiration
- player.lifesaverTimer = lifesaverExpirationTimer;
- // Remove the collected lifesaver
- lifesavers.splice(i, 1);
- lifesaver.destroy();
- }
- }
}
function collectCoin(coin, index) {
LK.getSound('coin_collect').play();
score += coinValue;
@@ -1178,51 +1034,8 @@
// Hide the original player
player.visible = false;
}
function gameOver() {
- // Check if player has a lifesaver
- if (hasLifesaver) {
- // Use the lifesaver instead of ending the game
- hasLifesaver = false;
- // Clear any existing lifesaver timer
- if (player.lifesaverTimer) {
- LK.clearTimeout(player.lifesaverTimer);
- player.lifesaverTimer = null;
- }
- // Play sound for using lifesaver
- LK.getSound('powerup_collect').play();
- // Remove indicator if it exists
- if (player.lifesaverIndicator) {
- player.lifesaverIndicator.destroy();
- player.lifesaverIndicator = null;
- }
- // Make player temporarily invincible for 2 seconds
- player.hasShield = true;
- player.tint = 0x00FFFF;
- // Flash player to indicate invincibility
- var flashCount = 0;
- var flashInterval = LK.setInterval(function () {
- player.visible = !player.visible;
- flashCount++;
- if (flashCount >= 20) {
- // Increased flash duration
- LK.clearInterval(flashInterval);
- player.visible = true;
- }
- }, 100);
- // Stay in current lane instead of moving to a safe lane
- // player remains in the same lane they were in when they died
- // Set 2-second invincibility
- LK.setTimeout(function () {
- player.hasShield = false;
- player.tint = 0xFFFFFF;
- }, 2000);
- // Add bonus score for using lifesaver
- score += 100;
- LK.setScore(score);
- updateUI();
- return; // Don't trigger actual game over
- }
LK.getSound('crash').play();
// Update high score if needed
if (score > highScore) {
highScore = score;
@@ -1419,12 +1232,8 @@
}
for (var i = buses.length - 1; i >= 0; i--) {
if (buses[i]) buses[i].update();
}
- // Update lifesavers
- for (var i = lifesavers.length - 1; i >= 0; i--) {
- if (lifesavers[i]) lifesavers[i].update();
- }
// Road lines are now stationary
// Update all PlayerParticle instances that might be in the scene
var particles = game.children.filter(function (child) {
return child instanceof PlayerParticle;