User prompt
make a main menu
User prompt
Please fix the bug: 'TypeError: coins.push is not a function' in or related to this line: 'coins.push(coin);' Line Number: 396
User prompt
make cions scader in race track
User prompt
make the player visible when th game starts
User prompt
make shop menu ↪💡 Consider importing and using the following plugins: @upit/storage.v1
Code edit (1 edits merged)
Please save this source code
User prompt
Nitro Rush: Power-Up Racing
Initial prompt
make a racing game with powerups
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1", { coins: 0, upgrades: { speed: 0, shield: 0, magnet: 0 } }); /**** * Classes ****/ var Car = Container.expand(function () { var self = Container.call(this); var carGraphics = self.attachAsset('car', { anchorX: 0.5, anchorY: 0.5 }); carGraphics.visible = true; self.visible = true; self.hasShield = false; self.shieldGraphics = null; self.activateShield = function () { self.hasShield = true; if (!self.shieldGraphics) { self.shieldGraphics = self.attachAsset('shield', { anchorX: 0.5, anchorY: 0.5, scaleX: 3, scaleY: 3, alpha: 0.5 }); } self.shieldGraphics.visible = true; }; self.removeShield = function () { self.hasShield = false; if (self.shieldGraphics) { self.shieldGraphics.visible = false; } }; return self; }); var Coin = Container.expand(function () { var self = Container.call(this); var coinGraphics = self.attachAsset('coin', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 8; self.collected = false; self.value = 5; // Base coin value self.update = function () { self.y += self.speed; self.rotation += 0.15; // Add floating animation self.x += Math.sin(LK.ticks * 0.1 + self.y * 0.01) * 0.5; }; return self; }); var MainMenu = Container.expand(function () { var self = Container.call(this); self.visible = true; // Menu background var background = self.attachAsset('road', { anchorX: 0.5, anchorY: 0.5, scaleX: 1, scaleY: 9, alpha: 0.8 }); background.x = 0; background.y = 0; // Game title self.titleText = new Text2('NITRO RUSH', { size: 150, fill: 0xFFFFFF }); self.titleText.anchor.set(0.5, 0.5); self.titleText.x = 0; self.titleText.y = -400; self.addChild(self.titleText); // Subtitle self.subtitleText = new Text2('Power-Up Racing', { size: 80, fill: 0xf1c40f }); self.subtitleText.anchor.set(0.5, 0.5); self.subtitleText.x = 0; self.subtitleText.y = -300; self.addChild(self.subtitleText); // Play button self.playButton = new Container(); self.playButton.x = 0; self.playButton.y = 100; var playBg = LK.getAsset('obstacle', { anchorX: 0.5, anchorY: 0.5, scaleX: 6, scaleY: 2, color: 0x27ae60 }); self.playButton.addChild(playBg); var playText = new Text2('PLAY', { size: 80, fill: 0xFFFFFF }); playText.anchor.set(0.5, 0.5); playText.x = 0; playText.y = 0; self.playButton.addChild(playText); self.playButton.down = function () { mainMenuInstance.hide(); startGame(); }; self.addChild(self.playButton); // Shop button in menu self.menuShopButton = new Container(); self.menuShopButton.x = 0; self.menuShopButton.y = 300; var shopBg = LK.getAsset('obstacle', { anchorX: 0.5, anchorY: 0.5, scaleX: 6, scaleY: 2, color: 0xf39c12 }); self.menuShopButton.addChild(shopBg); var shopText = new Text2('SHOP', { size: 80, fill: 0xFFFFFF }); shopText.anchor.set(0.5, 0.5); shopText.x = 0; shopText.y = 0; self.menuShopButton.addChild(shopText); self.menuShopButton.down = function () { shopInstance.show(); }; self.addChild(self.menuShopButton); // Coins display in menu self.menuCoinsText = new Text2('Coins: ' + storage.coins, { size: 60, fill: 0xf1c40f }); self.menuCoinsText.anchor.set(0.5, 0.5); self.menuCoinsText.x = 0; self.menuCoinsText.y = 500; self.addChild(self.menuCoinsText); self.show = function () { self.visible = true; self.menuCoinsText.setText('Coins: ' + storage.coins); }; self.hide = function () { self.visible = false; }; return self; }); var Obstacle = Container.expand(function () { var self = Container.call(this); var obstacleGraphics = self.attachAsset('obstacle', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 8; self.update = function () { self.y += self.speed; }; return self; }); var PowerUp = Container.expand(function (type) { var self = Container.call(this); self.type = type || 'speed'; var assetId = 'speedBoost'; if (self.type === 'shield') assetId = 'shield'; if (self.type === 'magnet') assetId = 'magnet'; var powerUpGraphics = self.attachAsset(assetId, { anchorX: 0.5, anchorY: 0.5 }); self.speed = 8; self.collected = false; self.update = function () { self.y += self.speed; self.rotation += 0.1; }; return self; }); var RoadSegment = Container.expand(function () { var self = Container.call(this); var roadGraphics = self.attachAsset('road', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 8; self.update = function () { self.y += self.speed; }; return self; }); var Shop = Container.expand(function () { var self = Container.call(this); self.visible = false; self.items = [{ name: 'Speed Boost+', type: 'speed', cost: 100, description: 'Longer speed boost duration' }, { name: 'Shield+', type: 'shield', cost: 150, description: 'Shield lasts longer' }, { name: 'Magnet+', type: 'magnet', cost: 200, description: 'Stronger magnet attraction' }]; // Shop background var background = self.attachAsset('road', { anchorX: 0.5, anchorY: 0.5, scaleX: 1, scaleY: 9, alpha: 0.9 }); background.x = 0; background.y = 0; // Title self.titleText = new Text2('SHOP', { size: 120, fill: 0xFFFFFF }); self.titleText.anchor.set(0.5, 0.5); self.titleText.x = 0; self.titleText.y = -1000; self.addChild(self.titleText); // Coins display self.coinsText = new Text2('Coins: ' + storage.coins, { size: 80, fill: 0xf1c40f }); self.coinsText.anchor.set(0.5, 0.5); self.coinsText.x = 0; self.coinsText.y = -800; self.addChild(self.coinsText); // Create shop items self.itemContainers = []; for (var i = 0; i < self.items.length; i++) { var item = self.items[i]; var itemContainer = new Container(); itemContainer.x = 0; itemContainer.y = -400 + i * 300; // Item background var itemBg = LK.getAsset('obstacle', { anchorX: 0.5, anchorY: 0.5, scaleX: 8, scaleY: 2, color: storage.upgrades[item.type] > 0 ? 0x27ae60 : 0x34495e }); itemContainer.addChild(itemBg); // Item name var nameText = new Text2(item.name, { size: 60, fill: 0xFFFFFF }); nameText.anchor.set(0.5, 0.5); nameText.x = 0; nameText.y = -40; itemContainer.addChild(nameText); // Item cost var costText = new Text2('Cost: ' + item.cost + ' coins', { size: 40, fill: 0xf1c40f }); costText.anchor.set(0.5, 0.5); costText.x = 0; costText.y = 10; itemContainer.addChild(costText); // Upgrade level var levelText = new Text2('Level: ' + storage.upgrades[item.type], { size: 35, fill: 0xecf0f1 }); levelText.anchor.set(0.5, 0.5); levelText.x = 0; levelText.y = 50; itemContainer.addChild(levelText); itemContainer.itemIndex = i; itemContainer.down = function (x, y, obj) { shopInstance.buyItem(this.itemIndex); }; self.addChild(itemContainer); self.itemContainers.push(itemContainer); } // Close button self.closeButton = new Container(); self.closeButton.x = 0; self.closeButton.y = 1000; var closeBg = LK.getAsset('obstacle', { anchorX: 0.5, anchorY: 0.5, scaleX: 4, scaleY: 1.5, color: 0xe74c3c }); self.closeButton.addChild(closeBg); var closeText = new Text2('CLOSE', { size: 60, fill: 0xFFFFFF }); closeText.anchor.set(0.5, 0.5); closeText.x = 0; closeText.y = 0; self.closeButton.addChild(closeText); self.closeButton.down = function () { shopInstance.hide(); }; self.addChild(self.closeButton); self.show = function () { self.visible = true; self.updateDisplay(); }; self.hide = function () { self.visible = false; }; self.updateDisplay = function () { self.coinsText.setText('Coins: ' + storage.coins); for (var i = 0; i < self.itemContainers.length; i++) { var container = self.itemContainers[i]; var item = self.items[i]; var levelText = container.children[3]; levelText.setText('Level: ' + storage.upgrades[item.type]); // Update background color based on upgrade level var bg = container.children[0]; bg.tint = storage.upgrades[item.type] > 0 ? 0x27ae60 : 0x34495e; } }; self.buyItem = function (index) { var item = self.items[index]; var currentLevel = storage.upgrades[item.type]; var cost = item.cost + currentLevel * 50; if (storage.coins >= cost && currentLevel < 5) { storage.coins -= cost; storage.upgrades[item.type] += 1; self.updateDisplay(); LK.getSound('powerup').play(); } }; return self; }); var ShopButton = Container.expand(function () { var self = Container.call(this); var buttonBg = self.attachAsset('speedBoost', { anchorX: 0.5, anchorY: 0.5, scaleX: 2, scaleY: 2 }); var buttonText = new Text2('SHOP', { size: 30, fill: 0x2c3e50 }); buttonText.anchor.set(0.5, 0.5); buttonText.x = 0; buttonText.y = 0; self.addChild(buttonText); self.down = function () { shopInstance.show(); }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x27ae60 }); /**** * Game Code ****/ var player; var obstacles = []; var powerUps = []; var coins = []; var roadSegments = []; var gameSpeed = 8; var baseSpeed = 8; var speedBoostTimer = 0; var magnetTimer = 0; var distance = 0; var isDragging = false; var dragStartX = 0; var shopInstance; var shopButton; var mainMenuInstance; var gameStarted = false; var distanceText, speedText, coinsText; // Create player car player = game.addChild(new Car()); player.x = 2048 / 2; player.y = 2732 - 200; player.visible = true; // Create initial road segments for (var i = 0; i < 12; i++) { var roadSegment = game.addChild(new RoadSegment()); roadSegment.x = 2048 / 2; roadSegment.y = i * 300 - 600; roadSegments.push(roadSegment); } // Create main menu mainMenuInstance = game.addChild(new MainMenu()); mainMenuInstance.x = 2048 / 2; mainMenuInstance.y = 2732 / 2; // Create shop shopInstance = game.addChild(new Shop()); shopInstance.x = 2048 / 2; shopInstance.y = 2732 / 2; // Create shop button shopButton = new ShopButton(); shopButton.x = -70; shopButton.y = 120; LK.gui.topRight.addChild(shopButton); shopButton.visible = false; function startGame() { gameStarted = true; shopButton.visible = true; // Reset game state distance = 0; gameSpeed = 8; baseSpeed = 8; speedBoostTimer = 0; magnetTimer = 0; // Clear existing game objects for (var i = obstacles.length - 1; i >= 0; i--) { obstacles[i].destroy(); } obstacles = []; for (var j = powerUps.length - 1; j >= 0; j--) { powerUps[j].destroy(); } powerUps = []; for (var k = coins.length - 1; k >= 0; k--) { coins[k].destroy(); } coins = []; // Show UI elements if (!distanceText) { distanceText = new Text2('Distance: 0', { size: 60, fill: 0xFFFFFF }); distanceText.anchor.set(0, 0); distanceText.x = 150; distanceText.y = 50; LK.gui.topLeft.addChild(distanceText); } if (!speedText) { speedText = new Text2('Speed: Normal', { size: 40, fill: 0xFFFFFF }); speedText.anchor.set(1, 0); speedText.x = -20; speedText.y = 50; LK.gui.topRight.addChild(speedText); } if (!coinsText) { coinsText = new Text2('Coins: ' + storage.coins, { size: 50, fill: 0xf1c40f }); coinsText.anchor.set(1, 0); coinsText.x = -20; coinsText.y = 90; LK.gui.topRight.addChild(coinsText); } distanceText.visible = true; speedText.visible = true; coinsText.visible = true; } function showMainMenu() { gameStarted = false; shopButton.visible = false; mainMenuInstance.show(); // Hide UI elements if (distanceText) distanceText.visible = false; if (speedText) speedText.visible = false; if (coinsText) coinsText.visible = false; } // Initialize UI as hidden showMainMenu(); function spawnObstacle() { var obstacle = new Obstacle(); var lanes = [400, 700, 1000, 1300, 1648]; obstacle.x = lanes[Math.floor(Math.random() * lanes.length)]; obstacle.y = -100; obstacle.speed = gameSpeed; obstacles.push(obstacle); game.addChild(obstacle); } function spawnPowerUp() { var types = ['speed', 'shield', 'magnet']; var type = types[Math.floor(Math.random() * types.length)]; var powerUp = new PowerUp(type); var lanes = [400, 700, 1000, 1300, 1648]; powerUp.x = lanes[Math.floor(Math.random() * lanes.length)]; powerUp.y = -100; powerUp.speed = gameSpeed; powerUps.push(powerUp); game.addChild(powerUp); } function spawnCoin() { var coin = new Coin(); var lanes = [400, 700, 1000, 1300, 1648]; coin.x = lanes[Math.floor(Math.random() * lanes.length)]; coin.y = -100; coin.speed = gameSpeed; coins.push(coin); game.addChild(coin); } function handleMove(x, y, obj) { if (!gameStarted || !isDragging) return; var deltaX = x - dragStartX; var newX = player.x + deltaX * 3; // Keep player within screen bounds if (newX >= 300 && newX <= 1748) { player.x = newX; } dragStartX = x; } game.move = handleMove; game.down = function (x, y, obj) { if (!gameStarted) return; isDragging = true; dragStartX = x; }; game.up = function (x, y, obj) { if (!gameStarted) return; isDragging = false; }; function activatePowerUp(type) { LK.getSound('powerup').play(); if (type === 'speed') { var speedLevel = storage.upgrades.speed; speedBoostTimer = 180 + speedLevel * 60; // Base 3 seconds + upgrade bonus gameSpeed = baseSpeed * (1.8 + speedLevel * 0.2); } else if (type === 'shield') { player.activateShield(); } else if (type === 'magnet') { var magnetLevel = storage.upgrades.magnet; magnetTimer = 300 + magnetLevel * 120; // Base 5 seconds + upgrade bonus } } function checkCollisions() { // Check obstacle collisions for (var i = obstacles.length - 1; i >= 0; i--) { var obstacle = obstacles[i]; if (player.intersects(obstacle)) { if (player.hasShield) { player.removeShield(); obstacle.destroy(); obstacles.splice(i, 1); LK.effects.flashObject(player, 0xffffff, 500); } else { LK.getSound('crash').play(); LK.effects.flashScreen(0xff0000, 1000); LK.showGameOver(); return; } } } // Check power-up collisions for (var j = powerUps.length - 1; j >= 0; j--) { var powerUp = powerUps[j]; if (!powerUp.collected && player.intersects(powerUp)) { powerUp.collected = true; activatePowerUp(powerUp.type); powerUp.destroy(); powerUps.splice(j, 1); LK.setScore(LK.getScore() + 10); } } // Check coin collisions for (var l = coins.length - 1; l >= 0; l--) { var coin = coins[l]; if (!coin.collected && player.intersects(coin)) { coin.collected = true; storage.coins += coin.value; coinsText.setText('Coins: ' + storage.coins); LK.getSound('powerup').play(); LK.effects.flashObject(coin, 0xffffff, 200); coin.destroy(); coins.splice(l, 1); } } // Magnet effect if (magnetTimer > 0) { for (var k = 0; k < powerUps.length; k++) { var magnetPowerUp = powerUps[k]; var dx = player.x - magnetPowerUp.x; var dy = player.y - magnetPowerUp.y; var distance = Math.sqrt(dx * dx + dy * dy); if (distance < 200 && !magnetPowerUp.collected) { magnetPowerUp.x += dx * 0.1; magnetPowerUp.y += dy * 0.1; } } } } game.update = function () { if (!gameStarted) return; // Update timers if (speedBoostTimer > 0) { speedBoostTimer--; if (speedBoostTimer === 0) { gameSpeed = baseSpeed; } } if (magnetTimer > 0) { magnetTimer--; } // Update speed based on distance distance += gameSpeed * 0.1; baseSpeed = Math.min(12, 8 + distance * 0.001); if (speedBoostTimer === 0) { gameSpeed = baseSpeed; } // Update all game objects speeds for (var i = 0; i < obstacles.length; i++) { obstacles[i].speed = gameSpeed; } for (var j = 0; j < powerUps.length; j++) { powerUps[j].speed = gameSpeed; } for (var l = 0; l < coins.length; l++) { coins[l].speed = gameSpeed; } for (var k = 0; k < roadSegments.length; k++) { roadSegments[k].speed = gameSpeed; } // Remove off-screen obstacles for (var a = obstacles.length - 1; a >= 0; a--) { var obstacle = obstacles[a]; if (obstacle.y > 2732 + 100) { obstacle.destroy(); obstacles.splice(a, 1); } } // Remove off-screen power-ups for (var b = powerUps.length - 1; b >= 0; b--) { var powerUp = powerUps[b]; if (powerUp.y > 2732 + 100) { powerUp.destroy(); powerUps.splice(b, 1); } } // Remove off-screen coins for (var d = coins.length - 1; d >= 0; d--) { var coin = coins[d]; if (coin.y > 2732 + 100) { coin.destroy(); coins.splice(d, 1); } } // Cycle road segments for (var c = roadSegments.length - 1; c >= 0; c--) { var road = roadSegments[c]; if (road.y > 2732 + 150) { road.y = roadSegments[0].y - 300; roadSegments.push(roadSegments.splice(c, 1)[0]); } } // Spawn obstacles if (LK.ticks % Math.max(30, 90 - Math.floor(distance * 0.01)) === 0) { spawnObstacle(); } // Spawn power-ups if (LK.ticks % 240 === 0) { spawnPowerUp(); } // Spawn coins more frequently than power-ups if (LK.ticks % 120 === 0) { spawnCoin(); } // Check collisions checkCollisions(); // Update UI if (distanceText) distanceText.setText('Distance: ' + Math.floor(distance)); var speedStatus = 'Normal'; if (speedBoostTimer > 0) speedStatus = 'BOOST!'; if (magnetTimer > 0) speedStatus += ' +MAGNET'; if (speedText) speedText.setText('Speed: ' + speedStatus); LK.setScore(Math.floor(distance)); // Earn coins based on distance if (LK.ticks % 60 === 0) { // Every second storage.coins += Math.floor(distance * 0.01) + 1; if (coinsText) coinsText.setText('Coins: ' + storage.coins); } }; // Override LK game over to show main menu var originalShowGameOver = LK.showGameOver; LK.showGameOver = function () { // Call original game over first originalShowGameOver(); // Then show main menu after a delay LK.setTimeout(function () { showMainMenu(); }, 2000); };
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1", {
coins: 0,
upgrades: {
speed: 0,
shield: 0,
magnet: 0
}
});
/****
* Classes
****/
var Car = Container.expand(function () {
var self = Container.call(this);
var carGraphics = self.attachAsset('car', {
anchorX: 0.5,
anchorY: 0.5
});
carGraphics.visible = true;
self.visible = true;
self.hasShield = false;
self.shieldGraphics = null;
self.activateShield = function () {
self.hasShield = true;
if (!self.shieldGraphics) {
self.shieldGraphics = self.attachAsset('shield', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 3,
scaleY: 3,
alpha: 0.5
});
}
self.shieldGraphics.visible = true;
};
self.removeShield = function () {
self.hasShield = false;
if (self.shieldGraphics) {
self.shieldGraphics.visible = false;
}
};
return self;
});
var Coin = Container.expand(function () {
var self = Container.call(this);
var coinGraphics = self.attachAsset('coin', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 8;
self.collected = false;
self.value = 5; // Base coin value
self.update = function () {
self.y += self.speed;
self.rotation += 0.15;
// Add floating animation
self.x += Math.sin(LK.ticks * 0.1 + self.y * 0.01) * 0.5;
};
return self;
});
var MainMenu = Container.expand(function () {
var self = Container.call(this);
self.visible = true;
// Menu background
var background = self.attachAsset('road', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1,
scaleY: 9,
alpha: 0.8
});
background.x = 0;
background.y = 0;
// Game title
self.titleText = new Text2('NITRO RUSH', {
size: 150,
fill: 0xFFFFFF
});
self.titleText.anchor.set(0.5, 0.5);
self.titleText.x = 0;
self.titleText.y = -400;
self.addChild(self.titleText);
// Subtitle
self.subtitleText = new Text2('Power-Up Racing', {
size: 80,
fill: 0xf1c40f
});
self.subtitleText.anchor.set(0.5, 0.5);
self.subtitleText.x = 0;
self.subtitleText.y = -300;
self.addChild(self.subtitleText);
// Play button
self.playButton = new Container();
self.playButton.x = 0;
self.playButton.y = 100;
var playBg = LK.getAsset('obstacle', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 6,
scaleY: 2,
color: 0x27ae60
});
self.playButton.addChild(playBg);
var playText = new Text2('PLAY', {
size: 80,
fill: 0xFFFFFF
});
playText.anchor.set(0.5, 0.5);
playText.x = 0;
playText.y = 0;
self.playButton.addChild(playText);
self.playButton.down = function () {
mainMenuInstance.hide();
startGame();
};
self.addChild(self.playButton);
// Shop button in menu
self.menuShopButton = new Container();
self.menuShopButton.x = 0;
self.menuShopButton.y = 300;
var shopBg = LK.getAsset('obstacle', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 6,
scaleY: 2,
color: 0xf39c12
});
self.menuShopButton.addChild(shopBg);
var shopText = new Text2('SHOP', {
size: 80,
fill: 0xFFFFFF
});
shopText.anchor.set(0.5, 0.5);
shopText.x = 0;
shopText.y = 0;
self.menuShopButton.addChild(shopText);
self.menuShopButton.down = function () {
shopInstance.show();
};
self.addChild(self.menuShopButton);
// Coins display in menu
self.menuCoinsText = new Text2('Coins: ' + storage.coins, {
size: 60,
fill: 0xf1c40f
});
self.menuCoinsText.anchor.set(0.5, 0.5);
self.menuCoinsText.x = 0;
self.menuCoinsText.y = 500;
self.addChild(self.menuCoinsText);
self.show = function () {
self.visible = true;
self.menuCoinsText.setText('Coins: ' + storage.coins);
};
self.hide = function () {
self.visible = false;
};
return self;
});
var Obstacle = Container.expand(function () {
var self = Container.call(this);
var obstacleGraphics = self.attachAsset('obstacle', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 8;
self.update = function () {
self.y += self.speed;
};
return self;
});
var PowerUp = Container.expand(function (type) {
var self = Container.call(this);
self.type = type || 'speed';
var assetId = 'speedBoost';
if (self.type === 'shield') assetId = 'shield';
if (self.type === 'magnet') assetId = 'magnet';
var powerUpGraphics = self.attachAsset(assetId, {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 8;
self.collected = false;
self.update = function () {
self.y += self.speed;
self.rotation += 0.1;
};
return self;
});
var RoadSegment = Container.expand(function () {
var self = Container.call(this);
var roadGraphics = self.attachAsset('road', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 8;
self.update = function () {
self.y += self.speed;
};
return self;
});
var Shop = Container.expand(function () {
var self = Container.call(this);
self.visible = false;
self.items = [{
name: 'Speed Boost+',
type: 'speed',
cost: 100,
description: 'Longer speed boost duration'
}, {
name: 'Shield+',
type: 'shield',
cost: 150,
description: 'Shield lasts longer'
}, {
name: 'Magnet+',
type: 'magnet',
cost: 200,
description: 'Stronger magnet attraction'
}];
// Shop background
var background = self.attachAsset('road', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 1,
scaleY: 9,
alpha: 0.9
});
background.x = 0;
background.y = 0;
// Title
self.titleText = new Text2('SHOP', {
size: 120,
fill: 0xFFFFFF
});
self.titleText.anchor.set(0.5, 0.5);
self.titleText.x = 0;
self.titleText.y = -1000;
self.addChild(self.titleText);
// Coins display
self.coinsText = new Text2('Coins: ' + storage.coins, {
size: 80,
fill: 0xf1c40f
});
self.coinsText.anchor.set(0.5, 0.5);
self.coinsText.x = 0;
self.coinsText.y = -800;
self.addChild(self.coinsText);
// Create shop items
self.itemContainers = [];
for (var i = 0; i < self.items.length; i++) {
var item = self.items[i];
var itemContainer = new Container();
itemContainer.x = 0;
itemContainer.y = -400 + i * 300;
// Item background
var itemBg = LK.getAsset('obstacle', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 8,
scaleY: 2,
color: storage.upgrades[item.type] > 0 ? 0x27ae60 : 0x34495e
});
itemContainer.addChild(itemBg);
// Item name
var nameText = new Text2(item.name, {
size: 60,
fill: 0xFFFFFF
});
nameText.anchor.set(0.5, 0.5);
nameText.x = 0;
nameText.y = -40;
itemContainer.addChild(nameText);
// Item cost
var costText = new Text2('Cost: ' + item.cost + ' coins', {
size: 40,
fill: 0xf1c40f
});
costText.anchor.set(0.5, 0.5);
costText.x = 0;
costText.y = 10;
itemContainer.addChild(costText);
// Upgrade level
var levelText = new Text2('Level: ' + storage.upgrades[item.type], {
size: 35,
fill: 0xecf0f1
});
levelText.anchor.set(0.5, 0.5);
levelText.x = 0;
levelText.y = 50;
itemContainer.addChild(levelText);
itemContainer.itemIndex = i;
itemContainer.down = function (x, y, obj) {
shopInstance.buyItem(this.itemIndex);
};
self.addChild(itemContainer);
self.itemContainers.push(itemContainer);
}
// Close button
self.closeButton = new Container();
self.closeButton.x = 0;
self.closeButton.y = 1000;
var closeBg = LK.getAsset('obstacle', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 4,
scaleY: 1.5,
color: 0xe74c3c
});
self.closeButton.addChild(closeBg);
var closeText = new Text2('CLOSE', {
size: 60,
fill: 0xFFFFFF
});
closeText.anchor.set(0.5, 0.5);
closeText.x = 0;
closeText.y = 0;
self.closeButton.addChild(closeText);
self.closeButton.down = function () {
shopInstance.hide();
};
self.addChild(self.closeButton);
self.show = function () {
self.visible = true;
self.updateDisplay();
};
self.hide = function () {
self.visible = false;
};
self.updateDisplay = function () {
self.coinsText.setText('Coins: ' + storage.coins);
for (var i = 0; i < self.itemContainers.length; i++) {
var container = self.itemContainers[i];
var item = self.items[i];
var levelText = container.children[3];
levelText.setText('Level: ' + storage.upgrades[item.type]);
// Update background color based on upgrade level
var bg = container.children[0];
bg.tint = storage.upgrades[item.type] > 0 ? 0x27ae60 : 0x34495e;
}
};
self.buyItem = function (index) {
var item = self.items[index];
var currentLevel = storage.upgrades[item.type];
var cost = item.cost + currentLevel * 50;
if (storage.coins >= cost && currentLevel < 5) {
storage.coins -= cost;
storage.upgrades[item.type] += 1;
self.updateDisplay();
LK.getSound('powerup').play();
}
};
return self;
});
var ShopButton = Container.expand(function () {
var self = Container.call(this);
var buttonBg = self.attachAsset('speedBoost', {
anchorX: 0.5,
anchorY: 0.5,
scaleX: 2,
scaleY: 2
});
var buttonText = new Text2('SHOP', {
size: 30,
fill: 0x2c3e50
});
buttonText.anchor.set(0.5, 0.5);
buttonText.x = 0;
buttonText.y = 0;
self.addChild(buttonText);
self.down = function () {
shopInstance.show();
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x27ae60
});
/****
* Game Code
****/
var player;
var obstacles = [];
var powerUps = [];
var coins = [];
var roadSegments = [];
var gameSpeed = 8;
var baseSpeed = 8;
var speedBoostTimer = 0;
var magnetTimer = 0;
var distance = 0;
var isDragging = false;
var dragStartX = 0;
var shopInstance;
var shopButton;
var mainMenuInstance;
var gameStarted = false;
var distanceText, speedText, coinsText;
// Create player car
player = game.addChild(new Car());
player.x = 2048 / 2;
player.y = 2732 - 200;
player.visible = true;
// Create initial road segments
for (var i = 0; i < 12; i++) {
var roadSegment = game.addChild(new RoadSegment());
roadSegment.x = 2048 / 2;
roadSegment.y = i * 300 - 600;
roadSegments.push(roadSegment);
}
// Create main menu
mainMenuInstance = game.addChild(new MainMenu());
mainMenuInstance.x = 2048 / 2;
mainMenuInstance.y = 2732 / 2;
// Create shop
shopInstance = game.addChild(new Shop());
shopInstance.x = 2048 / 2;
shopInstance.y = 2732 / 2;
// Create shop button
shopButton = new ShopButton();
shopButton.x = -70;
shopButton.y = 120;
LK.gui.topRight.addChild(shopButton);
shopButton.visible = false;
function startGame() {
gameStarted = true;
shopButton.visible = true;
// Reset game state
distance = 0;
gameSpeed = 8;
baseSpeed = 8;
speedBoostTimer = 0;
magnetTimer = 0;
// Clear existing game objects
for (var i = obstacles.length - 1; i >= 0; i--) {
obstacles[i].destroy();
}
obstacles = [];
for (var j = powerUps.length - 1; j >= 0; j--) {
powerUps[j].destroy();
}
powerUps = [];
for (var k = coins.length - 1; k >= 0; k--) {
coins[k].destroy();
}
coins = [];
// Show UI elements
if (!distanceText) {
distanceText = new Text2('Distance: 0', {
size: 60,
fill: 0xFFFFFF
});
distanceText.anchor.set(0, 0);
distanceText.x = 150;
distanceText.y = 50;
LK.gui.topLeft.addChild(distanceText);
}
if (!speedText) {
speedText = new Text2('Speed: Normal', {
size: 40,
fill: 0xFFFFFF
});
speedText.anchor.set(1, 0);
speedText.x = -20;
speedText.y = 50;
LK.gui.topRight.addChild(speedText);
}
if (!coinsText) {
coinsText = new Text2('Coins: ' + storage.coins, {
size: 50,
fill: 0xf1c40f
});
coinsText.anchor.set(1, 0);
coinsText.x = -20;
coinsText.y = 90;
LK.gui.topRight.addChild(coinsText);
}
distanceText.visible = true;
speedText.visible = true;
coinsText.visible = true;
}
function showMainMenu() {
gameStarted = false;
shopButton.visible = false;
mainMenuInstance.show();
// Hide UI elements
if (distanceText) distanceText.visible = false;
if (speedText) speedText.visible = false;
if (coinsText) coinsText.visible = false;
}
// Initialize UI as hidden
showMainMenu();
function spawnObstacle() {
var obstacle = new Obstacle();
var lanes = [400, 700, 1000, 1300, 1648];
obstacle.x = lanes[Math.floor(Math.random() * lanes.length)];
obstacle.y = -100;
obstacle.speed = gameSpeed;
obstacles.push(obstacle);
game.addChild(obstacle);
}
function spawnPowerUp() {
var types = ['speed', 'shield', 'magnet'];
var type = types[Math.floor(Math.random() * types.length)];
var powerUp = new PowerUp(type);
var lanes = [400, 700, 1000, 1300, 1648];
powerUp.x = lanes[Math.floor(Math.random() * lanes.length)];
powerUp.y = -100;
powerUp.speed = gameSpeed;
powerUps.push(powerUp);
game.addChild(powerUp);
}
function spawnCoin() {
var coin = new Coin();
var lanes = [400, 700, 1000, 1300, 1648];
coin.x = lanes[Math.floor(Math.random() * lanes.length)];
coin.y = -100;
coin.speed = gameSpeed;
coins.push(coin);
game.addChild(coin);
}
function handleMove(x, y, obj) {
if (!gameStarted || !isDragging) return;
var deltaX = x - dragStartX;
var newX = player.x + deltaX * 3;
// Keep player within screen bounds
if (newX >= 300 && newX <= 1748) {
player.x = newX;
}
dragStartX = x;
}
game.move = handleMove;
game.down = function (x, y, obj) {
if (!gameStarted) return;
isDragging = true;
dragStartX = x;
};
game.up = function (x, y, obj) {
if (!gameStarted) return;
isDragging = false;
};
function activatePowerUp(type) {
LK.getSound('powerup').play();
if (type === 'speed') {
var speedLevel = storage.upgrades.speed;
speedBoostTimer = 180 + speedLevel * 60; // Base 3 seconds + upgrade bonus
gameSpeed = baseSpeed * (1.8 + speedLevel * 0.2);
} else if (type === 'shield') {
player.activateShield();
} else if (type === 'magnet') {
var magnetLevel = storage.upgrades.magnet;
magnetTimer = 300 + magnetLevel * 120; // Base 5 seconds + upgrade bonus
}
}
function checkCollisions() {
// Check obstacle collisions
for (var i = obstacles.length - 1; i >= 0; i--) {
var obstacle = obstacles[i];
if (player.intersects(obstacle)) {
if (player.hasShield) {
player.removeShield();
obstacle.destroy();
obstacles.splice(i, 1);
LK.effects.flashObject(player, 0xffffff, 500);
} else {
LK.getSound('crash').play();
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
return;
}
}
}
// Check power-up collisions
for (var j = powerUps.length - 1; j >= 0; j--) {
var powerUp = powerUps[j];
if (!powerUp.collected && player.intersects(powerUp)) {
powerUp.collected = true;
activatePowerUp(powerUp.type);
powerUp.destroy();
powerUps.splice(j, 1);
LK.setScore(LK.getScore() + 10);
}
}
// Check coin collisions
for (var l = coins.length - 1; l >= 0; l--) {
var coin = coins[l];
if (!coin.collected && player.intersects(coin)) {
coin.collected = true;
storage.coins += coin.value;
coinsText.setText('Coins: ' + storage.coins);
LK.getSound('powerup').play();
LK.effects.flashObject(coin, 0xffffff, 200);
coin.destroy();
coins.splice(l, 1);
}
}
// Magnet effect
if (magnetTimer > 0) {
for (var k = 0; k < powerUps.length; k++) {
var magnetPowerUp = powerUps[k];
var dx = player.x - magnetPowerUp.x;
var dy = player.y - magnetPowerUp.y;
var distance = Math.sqrt(dx * dx + dy * dy);
if (distance < 200 && !magnetPowerUp.collected) {
magnetPowerUp.x += dx * 0.1;
magnetPowerUp.y += dy * 0.1;
}
}
}
}
game.update = function () {
if (!gameStarted) return;
// Update timers
if (speedBoostTimer > 0) {
speedBoostTimer--;
if (speedBoostTimer === 0) {
gameSpeed = baseSpeed;
}
}
if (magnetTimer > 0) {
magnetTimer--;
}
// Update speed based on distance
distance += gameSpeed * 0.1;
baseSpeed = Math.min(12, 8 + distance * 0.001);
if (speedBoostTimer === 0) {
gameSpeed = baseSpeed;
}
// Update all game objects speeds
for (var i = 0; i < obstacles.length; i++) {
obstacles[i].speed = gameSpeed;
}
for (var j = 0; j < powerUps.length; j++) {
powerUps[j].speed = gameSpeed;
}
for (var l = 0; l < coins.length; l++) {
coins[l].speed = gameSpeed;
}
for (var k = 0; k < roadSegments.length; k++) {
roadSegments[k].speed = gameSpeed;
}
// Remove off-screen obstacles
for (var a = obstacles.length - 1; a >= 0; a--) {
var obstacle = obstacles[a];
if (obstacle.y > 2732 + 100) {
obstacle.destroy();
obstacles.splice(a, 1);
}
}
// Remove off-screen power-ups
for (var b = powerUps.length - 1; b >= 0; b--) {
var powerUp = powerUps[b];
if (powerUp.y > 2732 + 100) {
powerUp.destroy();
powerUps.splice(b, 1);
}
}
// Remove off-screen coins
for (var d = coins.length - 1; d >= 0; d--) {
var coin = coins[d];
if (coin.y > 2732 + 100) {
coin.destroy();
coins.splice(d, 1);
}
}
// Cycle road segments
for (var c = roadSegments.length - 1; c >= 0; c--) {
var road = roadSegments[c];
if (road.y > 2732 + 150) {
road.y = roadSegments[0].y - 300;
roadSegments.push(roadSegments.splice(c, 1)[0]);
}
}
// Spawn obstacles
if (LK.ticks % Math.max(30, 90 - Math.floor(distance * 0.01)) === 0) {
spawnObstacle();
}
// Spawn power-ups
if (LK.ticks % 240 === 0) {
spawnPowerUp();
}
// Spawn coins more frequently than power-ups
if (LK.ticks % 120 === 0) {
spawnCoin();
}
// Check collisions
checkCollisions();
// Update UI
if (distanceText) distanceText.setText('Distance: ' + Math.floor(distance));
var speedStatus = 'Normal';
if (speedBoostTimer > 0) speedStatus = 'BOOST!';
if (magnetTimer > 0) speedStatus += ' +MAGNET';
if (speedText) speedText.setText('Speed: ' + speedStatus);
LK.setScore(Math.floor(distance));
// Earn coins based on distance
if (LK.ticks % 60 === 0) {
// Every second
storage.coins += Math.floor(distance * 0.01) + 1;
if (coinsText) coinsText.setText('Coins: ' + storage.coins);
}
};
// Override LK game over to show main menu
var originalShowGameOver = LK.showGameOver;
LK.showGameOver = function () {
// Call original game over first
originalShowGameOver();
// Then show main menu after a delay
LK.setTimeout(function () {
showMainMenu();
}, 2000);
};
formela 1 car pointing up. In-Game asset. 2d. High contrast. No shadows
coin. In-Game asset. 2d. High contrast. No shadows
magnett. In-Game asset. 2d. High contrast. No shadows
fence gate. In-Game asset. 2d. High contrast. No shadows
force feild. In-Game asset. 2d. High contrast. No shadows
dobble arrow pionting up. In-Game asset. 2d. High contrast. No shadows