User prompt
Please fix the bug: 'Script error.' in or related to this line: 'storage.selectedSkin = selectedSkin;' Line Number: 376 ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Please fix the bug: 'Script error.' in or related to this line: 'storage.selectedSkin = selectedSkin;' Line Number: 377 ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Please fix the bug: 'Script error.' in or related to this line: 'storage.selectedSkin = selectedSkin;' Line Number: 373 ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Make a skin button with different colors of F1 cars without red car ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Make a skin button with different colors of F1 cars without red car ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Please fix the bug: 'TypeError: Cannot read properties of undefined (reading 'id')' in or related to this line: 'selectedSkin = obj.skinData.id;' Line Number: 261
User prompt
Make a skin button with different colors of F1 cars but attention default car is red ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Make a skin button with different colors of F1 cars
User prompt
Направи бутон за кожа и остави на ме н да направя кожите
User prompt
Make skin button
User prompt
Подравни броя на различните автомобили
User prompt
Make to start from level zero
User prompt
Удължи времето на скока с половина от сегашното време ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Малко приближи един до друг резултата, левъла и най-добрият резултат
User prompt
Намали времето на скока на половина
User prompt
Малко приближи един до друг резултата, левъла и най-добрият резултат
User prompt
Малко намали големината на резултата, левъла и най-добрият резултат
User prompt
Дизайнирай резултата, левъла и най-добрият резултат
User prompt
Дизайнирай всичко както искаш
User prompt
Дизайнирай резултата левъла и най добрият резултат
User prompt
Направи левъла да се увеличава на десет точки, направи оранжев и го центрирай
User prompt
Направи левъла да се увеличава на десет точки, направи оранжев и го центрирай
User prompt
Add level
User prompt
Увеличи левъла с едно на всеки десет точки
User prompt
Delete treeleaves
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var F1Car = Container.expand(function () {
var self = Container.call(this);
var carGraphics = self.attachAsset('f1Car', {
anchorX: 0.5,
anchorY: 0.5
});
self.lane = 1; // 0 = left, 1 = center, 2 = right
self.isJumping = false;
self.jumpStartY = 0;
self.moveToLane = function (targetLane) {
if (targetLane < 0 || targetLane > 2) return;
self.lane = targetLane;
var targetX = lanePositions[targetLane];
tween(self, {
x: targetX
}, {
duration: 200,
easing: tween.easeOut
});
};
self.jump = function () {
if (self.isJumping || jumpPower < 5) return;
self.isJumping = true;
self.jumpStartY = self.y;
// Consume 5 jump power points
jumpPower -= 5;
// Update jump power bar scale
jumpPowerBar.scaleY = Math.min(jumpPower / 20, 1);
// Move player car to front (above other cars) when jumping
self.parent.addChild(self);
// Jump animation
tween(self, {
y: self.jumpStartY - 25,
scaleX: 1.2,
scaleY: 1.2
}, {
duration: 600,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(self, {
y: self.jumpStartY,
scaleX: 1,
scaleY: 1
}, {
duration: 600,
easing: tween.easeIn,
onFinish: function onFinish() {
self.isJumping = false;
}
});
}
});
// Play sound only (no points awarded)
LK.getSound('jump').play();
};
return self;
});
var SportsCar = Container.expand(function () {
var self = Container.call(this);
var carGraphics = self.attachAsset('sportsCar', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 12; // Faster than regular traffic
self.lane = 0;
self.update = function () {
self.y += self.speed;
};
return self;
});
var TrafficCar = Container.expand(function () {
var self = Container.call(this);
var carGraphics = self.attachAsset('trafficCar', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 8;
self.lane = 0;
self.update = function () {
self.y += self.speed;
};
return self;
});
var Truck = Container.expand(function () {
var self = Container.call(this);
var carGraphics = self.attachAsset('truck', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 6; // Slower than regular traffic
self.lane = 0;
self.update = function () {
self.y += self.speed;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x228B22
});
/****
* Game Code
****/
// Game state management
var gameState = "menu"; // "menu", "playing"
// Lane positions
var lanePositions = [2048 / 2 - 300, 2048 / 2, 2048 / 2 + 300];
// Global game variables
var roadBg;
var leftLane;
var rightLane;
var playerCar;
var trafficCars;
var trees;
var spawnTimer;
var gameSpeed;
var difficultyTimer;
var scoreTxt;
var levelTxt;
var currentLevel;
var dragStartX;
var dragStartY;
var isDragging;
var lastMoveTime;
var jumpPowerBarBg;
var jumpPowerBar;
var jumpPower = 0;
// Main menu elements
var menuContainer;
var titleText;
var playButton;
var playButtonText;
var infoContainer;
function createMainMenu() {
menuContainer = game.addChild(new Container());
// Game title
titleText = new Text2('F1 HIGHWAY RUSH', {
size: 120,
fill: 0xFFFFFF
});
titleText.anchor.set(0.5, 0.5);
titleText.x = 2048 / 2;
titleText.y = 800;
menuContainer.addChild(titleText);
// Best score display
var bestScore = storage.bestScore || 0;
var bestScoreText = new Text2('BEST: ' + bestScore, {
size: 60,
fill: 0xFFD700
});
bestScoreText.anchor.set(0.5, 0.5);
bestScoreText.x = 2048 / 2;
bestScoreText.y = 950;
menuContainer.addChild(bestScoreText);
// Play button background
playButton = menuContainer.addChild(LK.getAsset('road', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 1400,
scaleX: 0.4,
scaleY: 0.3
}));
// Play button text
playButtonText = new Text2('TAP TO PLAY', {
size: 80,
fill: 0xFFFFFF
});
playButtonText.anchor.set(0.5, 0.5);
playButtonText.x = 2048 / 2;
playButtonText.y = 1400;
menuContainer.addChild(playButtonText);
// Info button background
var infoButton = menuContainer.addChild(LK.getAsset('road', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 1600,
scaleX: 0.3,
scaleY: 0.25
}));
// Info button text
var infoButtonText = new Text2('INFO', {
size: 60,
fill: 0xFFFFFF
});
infoButtonText.anchor.set(0.5, 0.5);
infoButtonText.x = 2048 / 2;
infoButtonText.y = 1600;
menuContainer.addChild(infoButtonText);
// Info button press effect
infoButton.down = function (x, y, obj) {
tween(infoButton, {
scaleX: 0.25,
scaleY: 0.2
}, {
duration: 100,
easing: tween.easeOut
});
};
infoButton.up = function (x, y, obj) {
tween(infoButton, {
scaleX: 0.3,
scaleY: 0.25
}, {
duration: 100,
easing: tween.easeOut,
onFinish: function onFinish() {
showInfoScreen();
}
});
};
// Button press effect
playButton.down = function (x, y, obj) {
tween(playButton, {
scaleX: 0.35,
scaleY: 0.25
}, {
duration: 100,
easing: tween.easeOut
});
};
playButton.up = function (x, y, obj) {
tween(playButton, {
scaleX: 0.4,
scaleY: 0.3
}, {
duration: 100,
easing: tween.easeOut,
onFinish: function onFinish() {
startGame();
}
});
};
}
function startGame() {
gameState = "playing";
menuContainer.destroy();
initializeGameplay();
}
function showInfoScreen() {
menuContainer.visible = false;
infoContainer = game.addChild(new Container());
// Info title
var infoTitle = new Text2('HOW TO PLAY', {
size: 100,
fill: 0xFFFFFF
});
infoTitle.anchor.set(0.5, 0.5);
infoTitle.x = 2048 / 2;
infoTitle.y = 400;
infoContainer.addChild(infoTitle);
// Instructions
var instructions = ['Avoid the cars!', 'Swipe left/right to change lanes', 'Drag up/down to move freely', 'Tap to jump over cars', 'Jump uses 5 power points', 'Power recharges over time', 'Survive as long as possible!'];
for (var i = 0; i < instructions.length; i++) {
var instructionText = new Text2(instructions[i], {
size: 60,
fill: 0xFFFFFF
});
instructionText.anchor.set(0.5, 0.5);
instructionText.x = 2048 / 2;
instructionText.y = 700 + i * 100;
infoContainer.addChild(instructionText);
}
// Back button
var backButton = infoContainer.addChild(LK.getAsset('road', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 1800,
scaleX: 0.3,
scaleY: 0.25
}));
var backButtonText = new Text2('BACK', {
size: 60,
fill: 0xFFFFFF
});
backButtonText.anchor.set(0.5, 0.5);
backButtonText.x = 2048 / 2;
backButtonText.y = 1800;
infoContainer.addChild(backButtonText);
// Back button press effect
backButton.down = function (x, y, obj) {
tween(backButton, {
scaleX: 0.25,
scaleY: 0.2
}, {
duration: 100,
easing: tween.easeOut
});
};
backButton.up = function (x, y, obj) {
tween(backButton, {
scaleX: 0.3,
scaleY: 0.25
}, {
duration: 100,
easing: tween.easeOut,
onFinish: function onFinish() {
infoContainer.destroy();
menuContainer.visible = true;
}
});
};
}
function initializeGameplay() {
// Initialize game variables
// Create road background
roadBg = game.addChild(LK.getAsset('road', {
anchorX: 0.5,
anchorY: 0,
x: 2048 / 2,
y: 0,
scaleY: 10
}));
// Add grass on the left side of the road
var leftGrass = game.addChild(LK.getAsset('grass', {
anchorX: 1,
anchorY: 0,
x: lanePositions[0] - 300,
y: 0,
scaleX: 0.5
}));
// Add grass on the right side of the road
var rightGrass = game.addChild(LK.getAsset('grass', {
anchorX: 0,
anchorY: 0,
x: lanePositions[2] + 300,
y: 0,
scaleX: 0.5
}));
// Create lane dividers - make road corners more visible
leftLane = game.addChild(LK.getAsset('lane', {
anchorX: 0.5,
anchorY: 0,
x: lanePositions[0] + 150,
y: 0
}));
rightLane = game.addChild(LK.getAsset('lane', {
anchorX: 0.5,
anchorY: 0,
x: lanePositions[1] + 150,
y: 0
}));
// Add outer lane boundaries to make road edges more visible
var leftBoundary = game.addChild(LK.getAsset('lane', {
anchorX: 0.5,
anchorY: 0,
x: lanePositions[0] - 150,
y: 0,
scaleX: 2
}));
var rightBoundary = game.addChild(LK.getAsset('lane', {
anchorX: 0.5,
anchorY: 0,
x: lanePositions[2] + 150,
y: 0,
scaleX: 2
}));
// Create player car
playerCar = game.addChild(new F1Car());
playerCar.x = lanePositions[1];
playerCar.y = 2200;
// Traffic management
trafficCars = [];
trees = [];
spawnTimer = 0;
gameSpeed = 1;
difficultyTimer = 0;
currentLevel = 1;
// Score display - centered at top with larger size
scoreTxt = new Text2('SCORE: 0', {
size: 100,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
scoreTxt.x = 0;
scoreTxt.y = 20;
LK.gui.top.addChild(scoreTxt);
// Level display - orange color, positioned below score
levelTxt = new Text2('LEVEL 1', {
size: 80,
fill: 0xFF8C00
});
levelTxt.anchor.set(0.5, 0);
levelTxt.x = 0;
levelTxt.y = 140;
LK.gui.top.addChild(levelTxt);
// Best score display - gold color, positioned below level
var bestScoreGameTxt = new Text2('BEST: ' + (storage.bestScore || 0), {
size: 70,
fill: 0xFFD700
});
bestScoreGameTxt.anchor.set(0.5, 0);
bestScoreGameTxt.x = 0;
bestScoreGameTxt.y = 240;
LK.gui.top.addChild(bestScoreGameTxt);
// Store reference globally for efficient updates
window.bestScoreGameTxt = bestScoreGameTxt;
// Jump power bar background
jumpPowerBarBg = game.addChild(LK.getAsset('jumpPowerBarBg', {
anchorX: 0.5,
anchorY: 1,
x: 2048 - 100,
y: 2400
}));
// Jump power bar fill
jumpPowerBar = game.addChild(LK.getAsset('jumpPowerBar', {
anchorX: 0.5,
anchorY: 1,
x: 2048 - 100,
y: 2400,
scaleY: 0
}));
// Control variables
dragStartX = 0;
dragStartY = 0;
isDragging = false;
lastMoveTime = 0;
}
// Touch controls
game.down = function (x, y, obj) {
if (gameState !== "playing") return;
dragStartX = x;
dragStartY = y;
isDragging = true;
lastMoveTime = Date.now();
};
game.move = function (x, y, obj) {
if (gameState !== "playing" || !isDragging) return;
var deltaX = x - dragStartX;
var deltaY = y - dragStartY;
var currentTime = Date.now();
// Lane switching (horizontal swipe)
if (Math.abs(deltaX) > 150 && Math.abs(deltaX) > Math.abs(deltaY)) {
if (deltaX > 0 && playerCar.lane < 2) {
playerCar.moveToLane(playerCar.lane + 1);
} else if (deltaX < 0 && playerCar.lane > 0) {
playerCar.moveToLane(playerCar.lane - 1);
}
isDragging = false;
return;
}
// Free movement - follow drag position for vertical movement
if (isDragging) {
// Calculate new Y position based on drag
var newY = playerCar.y + deltaY * 0.5; // Scale factor for smooth movement
// Constrain movement within road boundaries
newY = Math.max(Math.min(newY, 2500), 200);
// Update player position
playerCar.y = newY;
if (playerCar.isJumping) {
// If jumping, update jump start position to maintain relative jump height
playerCar.jumpStartY = newY;
}
// Update drag start position for continuous movement
dragStartY = y;
}
};
game.up = function (x, y, obj) {
if (gameState !== "playing" || !isDragging) return;
var deltaX = x - dragStartX;
var deltaY = y - dragStartY;
var swipeDistance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);
// Tap for jump (small movement distance indicates a tap)
if (swipeDistance < 30) {
playerCar.jump();
}
isDragging = false;
};
// Spawn traffic
function spawnTree() {
// Create tree container
var tree = new Container();
// Add trunk
var trunk = tree.attachAsset('treeTrunk', {
anchorX: 0.5,
anchorY: 1
});
// Position tree on either left or right grass area
var side = Math.random() < 0.5 ? 'left' : 'right';
if (side === 'left') {
tree.x = lanePositions[0] - 300 - Math.random() * 400; // Left grass area
} else {
tree.x = lanePositions[2] + 300 + Math.random() * 400; // Right grass area
}
tree.y = -100; // Start above screen
tree.speed = 8 + gameSpeed * 2; // Same speed as traffic
// Add update method for tree movement
tree.update = function () {
tree.y += tree.speed;
};
trees.push(tree);
game.addChild(tree);
}
function spawnTraffic() {
var lane = Math.floor(Math.random() * 3);
var traffic;
var carType = Math.random();
// 60% regular cars, 25% sports cars, 15% trucks
if (carType < 0.6) {
traffic = new TrafficCar();
traffic.speed = 8 + gameSpeed * 2;
} else if (carType < 0.85) {
traffic = new SportsCar();
traffic.speed = 12 + gameSpeed * 2;
} else {
traffic = new Truck();
traffic.speed = 6 + gameSpeed * 2;
}
traffic.x = lanePositions[lane];
traffic.y = -100;
traffic.lane = lane;
trafficCars.push(traffic);
game.addChild(traffic);
}
// Check collisions
function checkCollisions() {
for (var i = trafficCars.length - 1; i >= 0; i--) {
var traffic = trafficCars[i];
// Check collision with player (only if not jumping)
if (!playerCar.isJumping && traffic.lane === playerCar.lane) {
var distance = Math.abs(traffic.y - playerCar.y);
// Different collision distances based on car type
var collisionDistance = 150; // Default for TrafficCar
if (traffic instanceof SportsCar) {
collisionDistance = 125; // Smaller sports car
} else if (traffic instanceof Truck) {
collisionDistance = 175; // Larger truck
}
if (distance < collisionDistance) {
// Collision detected
var currentScore = LK.getScore();
var bestScore = storage.bestScore || 0;
if (currentScore > bestScore) {
storage.bestScore = currentScore;
// Update best score display during gameplay using stored reference
if (window.bestScoreGameTxt) {
window.bestScoreGameTxt.setText('BEST: ' + currentScore);
}
}
LK.getSound('crash').play();
LK.effects.flashScreen(0xFF0000, 1000);
LK.showGameOver();
return;
}
}
// Remove off-screen traffic
if (traffic.y > 2800) {
traffic.destroy();
trafficCars.splice(i, 1);
}
}
}
// Initialize main menu
createMainMenu();
// Main game loop
game.update = function () {
if (gameState !== "playing") return;
// Update score display
scoreTxt.setText('SCORE: ' + LK.getScore());
// Update best score display in real-time
var currentScore = LK.getScore();
var bestScore = storage.bestScore || 0;
if (currentScore > bestScore) {
storage.bestScore = currentScore;
// Update best score display during gameplay using stored reference
if (window.bestScoreGameTxt) {
window.bestScoreGameTxt.setText('BEST: ' + currentScore);
}
}
// Spawn traffic
spawnTimer++;
var spawnRate = Math.max(30 - Math.floor(gameSpeed * 3), 15);
if (spawnTimer >= spawnRate) {
spawnTimer = 0;
spawnTraffic();
}
// Spawn trees occasionally
if (LK.ticks % 180 === 0) {
// Every 3 seconds
spawnTree();
}
// Update and cleanup trees
for (var t = trees.length - 1; t >= 0; t--) {
var tree = trees[t];
// Remove off-screen trees
if (tree.y > 2800) {
tree.destroy();
trees.splice(t, 1);
}
}
// Increase difficulty over time
difficultyTimer++;
if (difficultyTimer >= 300) {
// Every 5 seconds
difficultyTimer = 0;
gameSpeed += 0.1;
}
// Increase car speed by 10% every 10 points
var currentScore = LK.getScore();
var speedMultiplier = 1 + Math.floor(currentScore / 10) * 0.1;
for (var i = 0; i < trafficCars.length; i++) {
trafficCars[i].speed = (8 + gameSpeed * 2) * speedMultiplier;
}
// Check collisions
checkCollisions();
// Add survival points
if (LK.ticks % 60 === 0) {
// Every second
LK.setScore(LK.getScore() + 1);
}
// Check for level progression (every 10 points = new level)
var newLevel = Math.floor(LK.getScore() / 10) + 1;
if (newLevel > currentLevel) {
currentLevel = newLevel;
levelTxt.setText('LEVEL ' + currentLevel);
// Flash level text to indicate level up
LK.effects.flashObject(levelTxt, 0xFFD700, 1000);
}
// Update jump power (fills twice as fast as points)
if (LK.ticks % 30 === 0) {
// Every half second
jumpPower = Math.min(jumpPower + 1, 20); // Max 20 power points
// Update jump power bar scale
jumpPowerBar.scaleY = Math.min(jumpPower / 20, 1);
}
}; ===================================================================
--- original.js
+++ change.js
@@ -6,29 +6,8 @@
/****
* Classes
****/
-var ExplosionParticle = Container.expand(function () {
- var self = Container.call(this);
- var explosionGraphics = self.attachAsset('explosion', {
- anchorX: 0.5,
- anchorY: 0.5
- });
- self.lifetime = 30; // 0.5 seconds
- self.velocityX = (Math.random() - 0.5) * 8;
- self.velocityY = (Math.random() - 0.5) * 8;
- self.update = function () {
- self.x += self.velocityX;
- self.y += self.velocityY;
- self.lifetime--;
- // Fade and scale out
- var progress = self.lifetime / 30;
- explosionGraphics.alpha = progress;
- explosionGraphics.scaleX = 2 - progress;
- explosionGraphics.scaleY = 2 - progress;
- };
- return self;
-});
var F1Car = Container.expand(function () {
var self = Container.call(this);
var carGraphics = self.attachAsset('f1Car', {
anchorX: 0.5,
@@ -79,63 +58,13 @@
}
});
}
});
- // Create sparkle effects during jump
- for (var i = 0; i < 5; i++) {
- var sparkle = new Sparkle();
- sparkle.x = self.x + (Math.random() - 0.5) * 100;
- sparkle.y = self.y + (Math.random() - 0.5) * 50;
- sparkles.push(sparkle);
- self.parent.addChild(sparkle);
- }
// Play sound only (no points awarded)
LK.getSound('jump').play();
};
return self;
});
-var SmokeParticle = Container.expand(function () {
- var self = Container.call(this);
- var smokeGraphics = self.attachAsset('smokeParticle', {
- anchorX: 0.5,
- anchorY: 0.5
- });
- self.lifetime = 120; // 2 seconds
- self.velocityY = -2; // Rise upward
- self.update = function () {
- self.y += self.velocityY;
- self.lifetime--;
- // Fade out and grow over time
- var progress = self.lifetime / 120;
- smokeGraphics.alpha = progress * 0.6;
- var scale = 1 + (1 - progress);
- smokeGraphics.scaleX = scale;
- smokeGraphics.scaleY = scale;
- };
- return self;
-});
-var Sparkle = Container.expand(function () {
- var self = Container.call(this);
- var sparkleGraphics = self.attachAsset('sparkle', {
- anchorX: 0.5,
- anchorY: 0.5
- });
- self.lifetime = 60; // 1 second at 60fps
- self.velocityX = (Math.random() - 0.5) * 4;
- self.velocityY = (Math.random() - 0.5) * 4;
- self.update = function () {
- self.x += self.velocityX;
- self.y += self.velocityY;
- self.lifetime--;
- // Fade out over time
- sparkleGraphics.alpha = self.lifetime / 60;
- // Scale down over time
- var scale = self.lifetime / 60;
- sparkleGraphics.scaleX = scale;
- sparkleGraphics.scaleY = scale;
- };
- return self;
-});
var SportsCar = Container.expand(function () {
var self = Container.call(this);
var carGraphics = self.attachAsset('sportsCar', {
anchorX: 0.5,
@@ -157,16 +86,8 @@
self.speed = 8;
self.lane = 0;
self.update = function () {
self.y += self.speed;
- // Add occasional smoke trail
- if (Math.random() < 0.1) {
- var smoke = new SmokeParticle();
- smoke.x = self.x + (Math.random() - 0.5) * 60;
- smoke.y = self.y + 90; // Behind the car
- smokeParticles.push(smoke);
- self.parent.addChild(smoke);
- }
};
return self;
});
var Truck = Container.expand(function () {
@@ -216,11 +137,8 @@
var lastMoveTime;
var jumpPowerBarBg;
var jumpPowerBar;
var jumpPower = 0;
-var sparkles = [];
-var explosionParticles = [];
-var smokeParticles = [];
// Main menu elements
var menuContainer;
var titleText;
var playButton;
@@ -423,27 +341,8 @@
x: lanePositions[2] + 300,
y: 0,
scaleX: 0.5
}));
- // Create animated dashed lines for better visual appeal
- var dashedLines = [];
- for (var d = 0; d < 30; d++) {
- var leftDash = game.addChild(LK.getAsset('dashedLine', {
- anchorX: 0.5,
- anchorY: 0.5,
- x: lanePositions[0] + 150,
- y: d * 120 - 100
- }));
- var rightDash = game.addChild(LK.getAsset('dashedLine', {
- anchorX: 0.5,
- anchorY: 0.5,
- x: lanePositions[1] + 150,
- y: d * 120 - 100
- }));
- dashedLines.push(leftDash, rightDash);
- }
- // Store reference for animation
- window.dashedLines = dashedLines;
// Create lane dividers - make road corners more visible
leftLane = game.addChild(LK.getAsset('lane', {
anchorX: 0.5,
anchorY: 0,
@@ -481,30 +380,34 @@
spawnTimer = 0;
gameSpeed = 1;
difficultyTimer = 0;
currentLevel = 1;
- // Score display
- scoreTxt = new Text2('0', {
- size: 80,
+ // Score display - centered at top with larger size
+ scoreTxt = new Text2('SCORE: 0', {
+ size: 100,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
+ scoreTxt.x = 0;
+ scoreTxt.y = 20;
LK.gui.top.addChild(scoreTxt);
- // Level display
+ // Level display - orange color, positioned below score
levelTxt = new Text2('LEVEL 1', {
- size: 60,
+ size: 80,
fill: 0xFF8C00
});
levelTxt.anchor.set(0.5, 0);
- levelTxt.y = 50;
+ levelTxt.x = 0;
+ levelTxt.y = 140;
LK.gui.top.addChild(levelTxt);
- // Best score display during gameplay
+ // Best score display - gold color, positioned below level
var bestScoreGameTxt = new Text2('BEST: ' + (storage.bestScore || 0), {
- size: 60,
+ size: 70,
fill: 0xFFD700
});
bestScoreGameTxt.anchor.set(0.5, 0);
- bestScoreGameTxt.y = 100;
+ bestScoreGameTxt.x = 0;
+ bestScoreGameTxt.y = 240;
LK.gui.top.addChild(bestScoreGameTxt);
// Store reference globally for efficient updates
window.bestScoreGameTxt = bestScoreGameTxt;
// Jump power bar background
@@ -638,46 +541,8 @@
} else if (traffic instanceof Truck) {
collisionDistance = 175; // Larger truck
}
if (distance < collisionDistance) {
- // Create explosion effect at collision point
- for (var e = 0; e < 8; e++) {
- var explosion = new ExplosionParticle();
- explosion.x = (playerCar.x + traffic.x) / 2;
- explosion.y = (playerCar.y + traffic.y) / 2;
- explosionParticles.push(explosion);
- game.addChild(explosion);
- }
- // Screen shake effect
- var originalX = game.x;
- var originalY = game.y;
- var shakeIntensity = 20;
- var shakeDuration = 300; // 0.5 seconds
- tween(game, {
- x: originalX + shakeIntensity,
- y: originalY + shakeIntensity
- }, {
- duration: 50,
- easing: tween.easeOut,
- onFinish: function onFinish() {
- tween(game, {
- x: originalX - shakeIntensity,
- y: originalY - shakeIntensity
- }, {
- duration: 50,
- easing: tween.easeOut,
- onFinish: function onFinish() {
- tween(game, {
- x: originalX,
- y: originalY
- }, {
- duration: 200,
- easing: tween.easeOut
- });
- }
- });
- }
- });
// Collision detected
var currentScore = LK.getScore();
var bestScore = storage.bestScore || 0;
if (currentScore > bestScore) {
@@ -688,12 +553,9 @@
}
}
LK.getSound('crash').play();
LK.effects.flashScreen(0xFF0000, 1000);
- // Delay game over to show explosion effect
- LK.setTimeout(function () {
- LK.showGameOver();
- }, 300);
+ LK.showGameOver();
return;
}
}
// Remove off-screen traffic
@@ -708,9 +570,9 @@
// Main game loop
game.update = function () {
if (gameState !== "playing") return;
// Update score display
- scoreTxt.setText(LK.getScore());
+ scoreTxt.setText('SCORE: ' + LK.getScore());
// Update best score display in real-time
var currentScore = LK.getScore();
var bestScore = storage.bestScore || 0;
if (currentScore > bestScore) {
@@ -755,19 +617,8 @@
trafficCars[i].speed = (8 + gameSpeed * 2) * speedMultiplier;
}
// Check collisions
checkCollisions();
- // Animate dashed road lines for motion effect
- if (window.dashedLines) {
- for (var dl = 0; dl < window.dashedLines.length; dl++) {
- var dash = window.dashedLines[dl];
- dash.y += 8 + gameSpeed * 2;
- // Reset position when off screen
- if (dash.y > 2800) {
- dash.y = -100;
- }
- }
- }
// Add survival points
if (LK.ticks % 60 === 0) {
// Every second
LK.setScore(LK.getScore() + 1);
@@ -776,76 +627,15 @@
var newLevel = Math.floor(LK.getScore() / 10) + 1;
if (newLevel > currentLevel) {
currentLevel = newLevel;
levelTxt.setText('LEVEL ' + currentLevel);
- // Enhanced level up effects
- LK.getSound('levelUp').play();
- // Create celebration sparkles around the screen
- for (var s = 0; s < 15; s++) {
- var celebrationSparkle = new Sparkle();
- celebrationSparkle.x = Math.random() * 2048;
- celebrationSparkle.y = Math.random() * 2732;
- sparkles.push(celebrationSparkle);
- game.addChild(celebrationSparkle);
- }
- // Animate level text with scaling and color flash
- tween(levelTxt, {
- scaleX: 1.5,
- scaleY: 1.5
- }, {
- duration: 200,
- easing: tween.easeOut,
- onFinish: function onFinish() {
- tween(levelTxt, {
- scaleX: 1,
- scaleY: 1
- }, {
- duration: 300,
- easing: tween.easeOut
- });
- }
- });
// Flash level text to indicate level up
LK.effects.flashObject(levelTxt, 0xFFD700, 1000);
- // Flash jump power bar as bonus
- LK.effects.flashObject(jumpPowerBar, 0x00FFFF, 800);
}
- // Update and cleanup sparkles
- for (var sp = sparkles.length - 1; sp >= 0; sp--) {
- var sparkle = sparkles[sp];
- if (sparkle.lifetime <= 0) {
- sparkle.destroy();
- sparkles.splice(sp, 1);
- }
- }
- // Update and cleanup explosion particles
- for (var ep = explosionParticles.length - 1; ep >= 0; ep--) {
- var explosion = explosionParticles[ep];
- if (explosion.lifetime <= 0) {
- explosion.destroy();
- explosionParticles.splice(ep, 1);
- }
- }
- // Update and cleanup smoke particles
- for (var sm = smokeParticles.length - 1; sm >= 0; sm--) {
- var smoke = smokeParticles[sm];
- if (smoke.lifetime <= 0) {
- smoke.destroy();
- smokeParticles.splice(sm, 1);
- }
- }
// Update jump power (fills twice as fast as points)
if (LK.ticks % 30 === 0) {
// Every half second
jumpPower = Math.min(jumpPower + 1, 20); // Max 20 power points
// Update jump power bar scale
jumpPowerBar.scaleY = Math.min(jumpPower / 20, 1);
- // Add power up glow effect when bar is full
- if (jumpPower === 20 && Math.random() < 0.3) {
- var powerGlow = new Sparkle();
- powerGlow.x = jumpPowerBar.x + (Math.random() - 0.5) * 60;
- powerGlow.y = jumpPowerBar.y + (Math.random() - 0.5) * 100;
- sparkles.push(powerGlow);
- game.addChild(powerGlow);
- }
}
};
\ No newline at end of file
F1 from a bird's eye view. In-Game asset. High contrast. No shadows
car bird's eye view. In-Game asset. 2d. High contrast. No shadows
Red car bird's eye view. In-Game asset. 2d. High contrast. No shadows
Yellow car bird's eye view. In-Game asset. 2d. High contrast. No shadows
Tree 2d. In-Game asset. 2d. High contrast. No shadows
Blue F1 from a bird's eye view.. In-Game asset. 2d. High contrast. No shadows
Green F1 from a bird's eye view.. In-Game asset. 2d. High contrast. No shadows
Purple F1 from a bird's eye view.. In-Game asset. 2d. High contrast. No shadows
Yellow F1 from a bird's eye view.. In-Game asset. 2d. High contrast. No shadows