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", {
selectedSkin: "f1Car",
bestScore: 0
});
/****
* Classes
****/
var F1Car = Container.expand(function () {
var self = Container.call(this);
var skinToUse = storage.selectedSkin || 'f1Car';
var carGraphics = self.attachAsset(skinToUse, {
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: 450,
easing: tween.easeOut,
onFinish: function onFinish() {
tween(self, {
y: self.jumpStartY,
scaleX: 1,
scaleY: 1
}, {
duration: 450,
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;
// Initialize storage with defaults
// Skin system variables
var selectedSkin;
var skinContainer;
var availableSkins = ['f1Car', 'f1CarBlue', 'f1CarGreen', 'f1CarPurple', 'f1CarYellow'];
// 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);
// Skin button background
var skinButton = menuContainer.addChild(LK.getAsset('road', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 1800,
scaleX: 0.3,
scaleY: 0.25
}));
// Skin button text
var skinButtonText = new Text2('SKINS', {
size: 60,
fill: 0xFFFFFF
});
skinButtonText.anchor.set(0.5, 0.5);
skinButtonText.x = 2048 / 2;
skinButtonText.y = 1800;
menuContainer.addChild(skinButtonText);
// Skin button press effect
skinButton.down = function (x, y, obj) {
tween(skinButton, {
scaleX: 0.25,
scaleY: 0.2
}, {
duration: 100,
easing: tween.easeOut
});
};
skinButton.up = function (x, y, obj) {
tween(skinButton, {
scaleX: 0.3,
scaleY: 0.25
}, {
duration: 100,
easing: tween.easeOut,
onFinish: function onFinish() {
showSkinSelection();
}
});
};
// 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 showSkinSelection() {
menuContainer.visible = false;
skinContainer = game.addChild(new Container());
// Skin selection title
var skinTitle = new Text2('SELECT CAR', {
size: 100,
fill: 0xFFFFFF
});
skinTitle.anchor.set(0.5, 0.5);
skinTitle.x = 2048 / 2;
skinTitle.y = 400;
skinContainer.addChild(skinTitle);
// Current selected skin
selectedSkin = storage.selectedSkin || 'f1Car';
// Create skin preview cars
var skinPreviews = [];
for (var i = 0; i < availableSkins.length; i++) {
var skinId = availableSkins[i];
var skinPreview = skinContainer.addChild(LK.getAsset(skinId, {
anchorX: 0.5,
anchorY: 0.5,
x: 400 + i * 300,
y: 1000,
scaleX: 1.5,
scaleY: 1.5
}));
skinPreview.skinId = skinId;
skinPreviews.push(skinPreview);
// Highlight selected skin
if (skinId === selectedSkin) {
skinPreview.tint = 0xFFD700;
}
// Make skin selectable
skinPreview.down = function (x, y, obj) {
// Remove highlight from all skins
for (var j = 0; j < skinPreviews.length; j++) {
skinPreviews[j].tint = 0xFFFFFF;
}
// Highlight selected skin
obj.tint = 0xFFD700;
selectedSkin = obj.skinId;
storage.selectedSkin = selectedSkin;
};
}
// Back button for skin selection
var skinBackButton = skinContainer.addChild(LK.getAsset('road', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 1800,
scaleX: 0.3,
scaleY: 0.25
}));
var skinBackButtonText = new Text2('BACK', {
size: 60,
fill: 0xFFFFFF
});
skinBackButtonText.anchor.set(0.5, 0.5);
skinBackButtonText.x = 2048 / 2;
skinBackButtonText.y = 1800;
skinContainer.addChild(skinBackButtonText);
// Skin back button press effect
skinBackButton.down = function (x, y, obj) {
tween(skinBackButton, {
scaleX: 0.25,
scaleY: 0.2
}, {
duration: 100,
easing: tween.easeOut
});
};
skinBackButton.up = function (x, y, obj) {
tween(skinBackButton, {
scaleX: 0.3,
scaleY: 0.25
}, {
duration: 100,
easing: tween.easeOut,
onFinish: function onFinish() {
skinContainer.destroy();
menuContainer.visible = true;
}
});
};
}
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 = 0;
// Score display - centered at top with larger size
scoreTxt = new Text2('SCORE: 0', {
size: 80,
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 0', {
size: 60,
fill: 0xFF8C00
});
levelTxt.anchor.set(0.5, 0);
levelTxt.x = 0;
levelTxt.y = 110;
LK.gui.top.addChild(levelTxt);
// Best score display - gold color, positioned below level
var bestScoreGameTxt = new Text2('BEST: ' + (storage.bestScore || 0), {
size: 50,
fill: 0xFFD700
});
bestScoreGameTxt.anchor.set(0.5, 0);
bestScoreGameTxt.x = 0;
bestScoreGameTxt.y = 180;
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();
// 33% regular cars, 33% sports cars, 33% trucks
if (carType < 0.33) {
traffic = new TrafficCar();
traffic.speed = 8 + gameSpeed * 2;
} else if (carType < 0.66) {
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);
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
@@ -1,9 +1,12 @@
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
-var storage = LK.import("@upit/storage.v1");
+var storage = LK.import("@upit/storage.v1", {
+ selectedSkin: "f1Car",
+ bestScore: 0
+});
/****
* Classes
****/
@@ -138,8 +141,9 @@
var lastMoveTime;
var jumpPowerBarBg;
var jumpPowerBar;
var jumpPower = 0;
+// Initialize storage with defaults
// Skin system variables
var selectedSkin;
var skinContainer;
var availableSkins = ['f1Car', 'f1CarBlue', 'f1CarGreen', 'f1CarPurple', 'f1CarYellow'];
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