User prompt
undo that
User prompt
get rid of the image for when you are down (tap to get up) and die when the counter reaches zero
Code edit (1 edits merged)
Please save this source code
User prompt
Stop the game when you fall over, (stop it from moving) and make the player have to tap the screen in labeled places 5 times in 15 seconds.
User prompt
Make it so when you hit an object you don’t die, you fall over, then you wait 5 seconds before getting up and continuing. The distance also resets at this ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Add the feature above
User prompt
Add a enable debugging feature in the settings, but to turn it on you have to type the developer’s name (which it will ask you to do) which is Chazlin
User prompt
Make different music depending on what game mode you are playing
User prompt
Please fix the bug: 'Script error.' in or related to this line: 'LK.showLeaderboard();' Line Number: 408
User prompt
Please fix the bug: 'Script error.' in or related to this line: 'storage.showLeaderboard();' Line Number: 408
User prompt
Please fix the bug: 'Script error.' in or related to this line: 'LK.showLeaderboard();' Line Number: 407
User prompt
Add a setting bar in the menu which has an option to turn sound off, sfx off, game test codes, leaderboard, and language settings ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
Make it stop in all levels from spawning obstacles across all three lanes very closely
User prompt
Make the no don’t do it etc mode actually possible to win and add in the enemies moving 4x faster than you
User prompt
Make a “No don’t do it I’m scared help” mode where the player is half the speed, and everything else is doubled. Everything is covered by a reddish colour and all the text is in welsh until the game is reloaded ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Add a “winning zone” where you win after reaching 1000 distance on Hard, 2000 on average Joe, and 5000 on Easy
User prompt
Add a Hard Mode where there are more obstacles, and double the enemies
User prompt
Make the easy mode button green, bigger, and make the normal mode button orange, bigger, and change the normal mode to “Average Joe”
User prompt
Make the lane rider sign at the top, huge and in an appealing font, and make the other items bigger and more spaced apart ON THE START SCREEN
User prompt
Create a start menu with an easy mode button that removes the character that chases you
User prompt
When moving lanes, make the player hit the sprite it could collide with then kill the player
User prompt
Add in a sprite that swerves all over the lanes yet slowly chases you when you get close enough and add a stopwatch to see how long you survive ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Make the character move a bit quicker
Code edit (1 edits merged)
Please save this source code
User prompt
Lane Rider: Bike Rush
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var Obstacle = Container.expand(function (type) {
var self = Container.call(this);
self.type = type || 'car';
self.lane = Math.floor(Math.random() * 3); // Random lane (0, 1, 2)
self.speed = GAME_SPEED;
var assetType;
switch (self.type) {
case 'car':
assetType = 'car';
break;
case 'pedestrian':
assetType = 'pedestrian';
break;
case 'pothole':
assetType = 'pothole';
break;
case 'construction':
assetType = 'construction';
break;
default:
assetType = 'car';
}
var graphics = self.attachAsset(assetType, {
anchorX: 0.5,
anchorY: 0.5
});
self.update = function () {
self.y += self.speed;
// Mark for removal if off screen
if (self.y > 2732 + graphics.height) {
self.markedForRemoval = true;
}
};
return self;
});
var Player = Container.expand(function () {
var self = Container.call(this);
var playerGraphics = self.attachAsset('player', {
anchorX: 0.5,
anchorY: 0.5
});
// Player state
self.lane = 1; // Middle lane
self.isInvincible = false;
self.invincibleTimer = null;
// Move player to lane
self.moveToLane = function (laneIndex) {
if (laneIndex < 0 || laneIndex > 2) {
return;
}
self.lane = laneIndex;
var targetX = LANE_POSITIONS[laneIndex];
tween.stop(self, {
x: true
});
tween(self, {
x: targetX
}, {
duration: 200,
easing: tween.easeOut
});
};
// Make player invincible for a duration
self.setInvincible = function (duration) {
self.isInvincible = true;
playerGraphics.tint = 0x2ECC71; // Green tint
if (self.invincibleTimer) {
LK.clearTimeout(self.invincibleTimer);
}
self.invincibleTimer = LK.setTimeout(function () {
self.isInvincible = false;
playerGraphics.tint = 0xFFFFFF; // Reset tint
}, duration);
};
return self;
});
var PowerUp = Container.expand(function () {
var self = Container.call(this);
self.lane = Math.floor(Math.random() * 3); // Random lane (0, 1, 2)
self.speed = GAME_SPEED;
var graphics = self.attachAsset('powerup', {
anchorX: 0.5,
anchorY: 0.5
});
// Add pulsing animation
function pulse() {
tween(graphics, {
scale: 1.2
}, {
duration: 500,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(graphics, {
scale: 1.0
}, {
duration: 500,
easing: tween.easeInOut,
onFinish: pulse
});
}
});
}
pulse();
self.update = function () {
self.y += self.speed;
// Mark for removal if off screen
if (self.y > 2732 + graphics.height) {
self.markedForRemoval = true;
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x7DCEA0 // Greenish background
});
/****
* Game Code
****/
// Constants
var LANE_WIDTH = 2048 / 3;
var LANE_POSITIONS = [LANE_WIDTH / 2, LANE_WIDTH + LANE_WIDTH / 2, 2 * LANE_WIDTH + LANE_WIDTH / 2];
var MIN_OBSTACLE_INTERVAL = 60;
var MAX_OBSTACLE_INTERVAL = 120;
var GAME_SPEED = 6;
var MAX_GAME_SPEED = 15;
var SPEED_INCREASE_RATE = 0.0005;
var OBSTACLE_TYPES = ['car', 'pedestrian', 'pothole', 'construction'];
var POWERUP_CHANCE = 0.1; // 10% chance per obstacle spawn
var INVINCIBLE_DURATION = 5000; // 5 seconds
// Game variables
var player;
var obstacles = [];
var powerups = [];
var lanes = [];
var obstacleTimer = 0;
var nextObstacleTime = 100;
var distance = 0;
var highScore = storage.highScore || 0;
var isGameStarted = false;
// GUI elements
var scoreTxt;
var highScoreTxt;
var startInstructions;
// Initialize game UI
function initUI() {
// Create score display
scoreTxt = new Text2('Distance: 0', {
size: 70,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Create high score display
highScoreTxt = new Text2('Best: ' + highScore, {
size: 50,
fill: 0xFFFFFF
});
highScoreTxt.anchor.set(0.5, 0);
highScoreTxt.y = 80;
LK.gui.top.addChild(highScoreTxt);
// Create start instructions
startInstructions = new Text2('Tap to start\nSwipe left/right to change lanes', {
size: 80,
fill: 0xFFFFFF
});
startInstructions.anchor.set(0.5, 0.5);
LK.gui.center.addChild(startInstructions);
}
// Initialize game world
function initWorld() {
// Create the three lanes
for (var i = 0; i < 3; i++) {
var lane = LK.getAsset('lane', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.3,
width: 20,
height: 2732
});
lane.x = (i + 1) * LANE_WIDTH;
game.addChild(lane);
lanes.push(lane);
}
// Create player
player = new Player();
player.x = LANE_POSITIONS[1]; // Start in middle lane
player.y = 2732 - 300; // Position near bottom of screen
game.addChild(player);
// Hide player initially
player.visible = false;
}
// Start the game
function startGame() {
isGameStarted = true;
player.visible = true;
startInstructions.visible = false;
// Reset game state
obstacles.forEach(function (obstacle) {
obstacle.destroy();
});
obstacles = [];
powerups.forEach(function (powerup) {
powerup.destroy();
});
powerups = [];
distance = 0;
GAME_SPEED = 6;
obstacleTimer = 0;
nextObstacleTime = 100;
// Play background music
LK.playMusic('gameMusic');
}
// Spawn a new obstacle
function spawnObstacle() {
// Choose random obstacle type
var type = OBSTACLE_TYPES[Math.floor(Math.random() * OBSTACLE_TYPES.length)];
var obstacle = new Obstacle(type);
// Ensure obstacle is in a valid lane
obstacle.x = LANE_POSITIONS[obstacle.lane];
obstacle.y = -200; // Start above screen
obstacles.push(obstacle);
game.addChild(obstacle);
// Possibly spawn a power-up
if (Math.random() < POWERUP_CHANCE) {
spawnPowerUp();
}
// Set next obstacle spawn time
nextObstacleTime = MIN_OBSTACLE_INTERVAL + Math.floor(Math.random() * (MAX_OBSTACLE_INTERVAL - MIN_OBSTACLE_INTERVAL));
// Reduce spawn interval as game progresses
nextObstacleTime = Math.max(nextObstacleTime * (1 - distance / 50000), MIN_OBSTACLE_INTERVAL);
}
// Spawn a power-up
function spawnPowerUp() {
var powerup = new PowerUp();
// Make sure power-up is not in same lane as last obstacle
var lastObstacle = obstacles[obstacles.length - 1];
do {
powerup.lane = Math.floor(Math.random() * 3);
} while (powerup.lane === lastObstacle.lane);
powerup.x = LANE_POSITIONS[powerup.lane];
powerup.y = -500; // Start above screen, after the obstacle
powerups.push(powerup);
game.addChild(powerup);
}
// Check collisions between player and obstacles/powerups
function checkCollisions() {
// Check obstacle collisions
for (var i = obstacles.length - 1; i >= 0; i--) {
var obstacle = obstacles[i];
if (player.lane === obstacle.lane && Math.abs(player.y - obstacle.y) < 100 && !player.isInvincible) {
// Collision detected!
LK.getSound('crash').play();
LK.effects.flashScreen(0xFF0000, 500);
// Update high score if needed
if (distance > highScore) {
highScore = Math.floor(distance);
storage.highScore = highScore;
highScoreTxt.setText('Best: ' + highScore);
}
// Game over
LK.showGameOver();
return;
}
}
// Check power-up collisions
for (var j = powerups.length - 1; j >= 0; j--) {
var powerup = powerups[j];
if (player.lane === powerup.lane && Math.abs(player.y - powerup.y) < 100) {
// Collect power-up
LK.getSound('powerup').play();
// Apply power-up effect (invincibility)
player.setInvincible(INVINCIBLE_DURATION);
// Remove power-up
powerup.destroy();
powerups.splice(j, 1);
}
}
}
// Handle touch events for swiping
var touchStartX = 0;
game.down = function (x, y) {
if (!isGameStarted) {
startGame();
return;
}
touchStartX = x;
};
game.up = function (x, y) {
if (!isGameStarted) {
return;
}
var swipeDistance = x - touchStartX;
// Determine swipe direction and move player
if (Math.abs(swipeDistance) > 50) {
// Minimum swipe distance threshold
if (swipeDistance > 0) {
// Swipe right
player.moveToLane(Math.min(player.lane + 1, 2));
} else {
// Swipe left
player.moveToLane(Math.max(player.lane - 1, 0));
}
}
};
// Main game update loop
game.update = function () {
if (!isGameStarted) {
return;
}
// Increment distance
distance += GAME_SPEED / 10;
scoreTxt.setText('Distance: ' + Math.floor(distance));
// Gradually increase game speed
GAME_SPEED = Math.min(GAME_SPEED + SPEED_INCREASE_RATE, MAX_GAME_SPEED);
// Spawn obstacles
obstacleTimer++;
if (obstacleTimer >= nextObstacleTime) {
spawnObstacle();
obstacleTimer = 0;
}
// Update obstacles
for (var i = obstacles.length - 1; i >= 0; i--) {
var obstacle = obstacles[i];
obstacle.speed = GAME_SPEED;
// Remove obstacles marked for removal
if (obstacle.markedForRemoval) {
obstacle.destroy();
obstacles.splice(i, 1);
}
}
// Update power-ups
for (var j = powerups.length - 1; j >= 0; j--) {
var powerup = powerups[j];
powerup.speed = GAME_SPEED;
// Remove power-ups marked for removal
if (powerup.markedForRemoval) {
powerup.destroy();
powerups.splice(j, 1);
}
}
// Check for collisions
checkCollisions();
};
// Initialize UI and game world
initUI();
initWorld(); ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,360 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+var storage = LK.import("@upit/storage.v1");
+
+/****
+* Classes
+****/
+var Obstacle = Container.expand(function (type) {
+ var self = Container.call(this);
+ self.type = type || 'car';
+ self.lane = Math.floor(Math.random() * 3); // Random lane (0, 1, 2)
+ self.speed = GAME_SPEED;
+ var assetType;
+ switch (self.type) {
+ case 'car':
+ assetType = 'car';
+ break;
+ case 'pedestrian':
+ assetType = 'pedestrian';
+ break;
+ case 'pothole':
+ assetType = 'pothole';
+ break;
+ case 'construction':
+ assetType = 'construction';
+ break;
+ default:
+ assetType = 'car';
+ }
+ var graphics = self.attachAsset(assetType, {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.update = function () {
+ self.y += self.speed;
+ // Mark for removal if off screen
+ if (self.y > 2732 + graphics.height) {
+ self.markedForRemoval = true;
+ }
+ };
+ return self;
+});
+var Player = Container.expand(function () {
+ var self = Container.call(this);
+ var playerGraphics = self.attachAsset('player', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ // Player state
+ self.lane = 1; // Middle lane
+ self.isInvincible = false;
+ self.invincibleTimer = null;
+ // Move player to lane
+ self.moveToLane = function (laneIndex) {
+ if (laneIndex < 0 || laneIndex > 2) {
+ return;
+ }
+ self.lane = laneIndex;
+ var targetX = LANE_POSITIONS[laneIndex];
+ tween.stop(self, {
+ x: true
+ });
+ tween(self, {
+ x: targetX
+ }, {
+ duration: 200,
+ easing: tween.easeOut
+ });
+ };
+ // Make player invincible for a duration
+ self.setInvincible = function (duration) {
+ self.isInvincible = true;
+ playerGraphics.tint = 0x2ECC71; // Green tint
+ if (self.invincibleTimer) {
+ LK.clearTimeout(self.invincibleTimer);
+ }
+ self.invincibleTimer = LK.setTimeout(function () {
+ self.isInvincible = false;
+ playerGraphics.tint = 0xFFFFFF; // Reset tint
+ }, duration);
+ };
+ return self;
+});
+var PowerUp = Container.expand(function () {
+ var self = Container.call(this);
+ self.lane = Math.floor(Math.random() * 3); // Random lane (0, 1, 2)
+ self.speed = GAME_SPEED;
+ var graphics = self.attachAsset('powerup', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ // Add pulsing animation
+ function pulse() {
+ tween(graphics, {
+ scale: 1.2
+ }, {
+ duration: 500,
+ easing: tween.easeInOut,
+ onFinish: function onFinish() {
+ tween(graphics, {
+ scale: 1.0
+ }, {
+ duration: 500,
+ easing: tween.easeInOut,
+ onFinish: pulse
+ });
+ }
+ });
+ }
+ pulse();
+ self.update = function () {
+ self.y += self.speed;
+ // Mark for removal if off screen
+ if (self.y > 2732 + graphics.height) {
+ self.markedForRemoval = true;
+ }
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x7DCEA0 // Greenish background
+});
+
+/****
+* Game Code
+****/
+// Constants
+var LANE_WIDTH = 2048 / 3;
+var LANE_POSITIONS = [LANE_WIDTH / 2, LANE_WIDTH + LANE_WIDTH / 2, 2 * LANE_WIDTH + LANE_WIDTH / 2];
+var MIN_OBSTACLE_INTERVAL = 60;
+var MAX_OBSTACLE_INTERVAL = 120;
+var GAME_SPEED = 6;
+var MAX_GAME_SPEED = 15;
+var SPEED_INCREASE_RATE = 0.0005;
+var OBSTACLE_TYPES = ['car', 'pedestrian', 'pothole', 'construction'];
+var POWERUP_CHANCE = 0.1; // 10% chance per obstacle spawn
+var INVINCIBLE_DURATION = 5000; // 5 seconds
+// Game variables
+var player;
+var obstacles = [];
+var powerups = [];
+var lanes = [];
+var obstacleTimer = 0;
+var nextObstacleTime = 100;
+var distance = 0;
+var highScore = storage.highScore || 0;
+var isGameStarted = false;
+// GUI elements
+var scoreTxt;
+var highScoreTxt;
+var startInstructions;
+// Initialize game UI
+function initUI() {
+ // Create score display
+ scoreTxt = new Text2('Distance: 0', {
+ size: 70,
+ fill: 0xFFFFFF
+ });
+ scoreTxt.anchor.set(0.5, 0);
+ LK.gui.top.addChild(scoreTxt);
+ // Create high score display
+ highScoreTxt = new Text2('Best: ' + highScore, {
+ size: 50,
+ fill: 0xFFFFFF
+ });
+ highScoreTxt.anchor.set(0.5, 0);
+ highScoreTxt.y = 80;
+ LK.gui.top.addChild(highScoreTxt);
+ // Create start instructions
+ startInstructions = new Text2('Tap to start\nSwipe left/right to change lanes', {
+ size: 80,
+ fill: 0xFFFFFF
+ });
+ startInstructions.anchor.set(0.5, 0.5);
+ LK.gui.center.addChild(startInstructions);
+}
+// Initialize game world
+function initWorld() {
+ // Create the three lanes
+ for (var i = 0; i < 3; i++) {
+ var lane = LK.getAsset('lane', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ alpha: 0.3,
+ width: 20,
+ height: 2732
+ });
+ lane.x = (i + 1) * LANE_WIDTH;
+ game.addChild(lane);
+ lanes.push(lane);
+ }
+ // Create player
+ player = new Player();
+ player.x = LANE_POSITIONS[1]; // Start in middle lane
+ player.y = 2732 - 300; // Position near bottom of screen
+ game.addChild(player);
+ // Hide player initially
+ player.visible = false;
+}
+// Start the game
+function startGame() {
+ isGameStarted = true;
+ player.visible = true;
+ startInstructions.visible = false;
+ // Reset game state
+ obstacles.forEach(function (obstacle) {
+ obstacle.destroy();
+ });
+ obstacles = [];
+ powerups.forEach(function (powerup) {
+ powerup.destroy();
+ });
+ powerups = [];
+ distance = 0;
+ GAME_SPEED = 6;
+ obstacleTimer = 0;
+ nextObstacleTime = 100;
+ // Play background music
+ LK.playMusic('gameMusic');
+}
+// Spawn a new obstacle
+function spawnObstacle() {
+ // Choose random obstacle type
+ var type = OBSTACLE_TYPES[Math.floor(Math.random() * OBSTACLE_TYPES.length)];
+ var obstacle = new Obstacle(type);
+ // Ensure obstacle is in a valid lane
+ obstacle.x = LANE_POSITIONS[obstacle.lane];
+ obstacle.y = -200; // Start above screen
+ obstacles.push(obstacle);
+ game.addChild(obstacle);
+ // Possibly spawn a power-up
+ if (Math.random() < POWERUP_CHANCE) {
+ spawnPowerUp();
+ }
+ // Set next obstacle spawn time
+ nextObstacleTime = MIN_OBSTACLE_INTERVAL + Math.floor(Math.random() * (MAX_OBSTACLE_INTERVAL - MIN_OBSTACLE_INTERVAL));
+ // Reduce spawn interval as game progresses
+ nextObstacleTime = Math.max(nextObstacleTime * (1 - distance / 50000), MIN_OBSTACLE_INTERVAL);
+}
+// Spawn a power-up
+function spawnPowerUp() {
+ var powerup = new PowerUp();
+ // Make sure power-up is not in same lane as last obstacle
+ var lastObstacle = obstacles[obstacles.length - 1];
+ do {
+ powerup.lane = Math.floor(Math.random() * 3);
+ } while (powerup.lane === lastObstacle.lane);
+ powerup.x = LANE_POSITIONS[powerup.lane];
+ powerup.y = -500; // Start above screen, after the obstacle
+ powerups.push(powerup);
+ game.addChild(powerup);
+}
+// Check collisions between player and obstacles/powerups
+function checkCollisions() {
+ // Check obstacle collisions
+ for (var i = obstacles.length - 1; i >= 0; i--) {
+ var obstacle = obstacles[i];
+ if (player.lane === obstacle.lane && Math.abs(player.y - obstacle.y) < 100 && !player.isInvincible) {
+ // Collision detected!
+ LK.getSound('crash').play();
+ LK.effects.flashScreen(0xFF0000, 500);
+ // Update high score if needed
+ if (distance > highScore) {
+ highScore = Math.floor(distance);
+ storage.highScore = highScore;
+ highScoreTxt.setText('Best: ' + highScore);
+ }
+ // Game over
+ LK.showGameOver();
+ return;
+ }
+ }
+ // Check power-up collisions
+ for (var j = powerups.length - 1; j >= 0; j--) {
+ var powerup = powerups[j];
+ if (player.lane === powerup.lane && Math.abs(player.y - powerup.y) < 100) {
+ // Collect power-up
+ LK.getSound('powerup').play();
+ // Apply power-up effect (invincibility)
+ player.setInvincible(INVINCIBLE_DURATION);
+ // Remove power-up
+ powerup.destroy();
+ powerups.splice(j, 1);
+ }
+ }
+}
+// Handle touch events for swiping
+var touchStartX = 0;
+game.down = function (x, y) {
+ if (!isGameStarted) {
+ startGame();
+ return;
+ }
+ touchStartX = x;
+};
+game.up = function (x, y) {
+ if (!isGameStarted) {
+ return;
+ }
+ var swipeDistance = x - touchStartX;
+ // Determine swipe direction and move player
+ if (Math.abs(swipeDistance) > 50) {
+ // Minimum swipe distance threshold
+ if (swipeDistance > 0) {
+ // Swipe right
+ player.moveToLane(Math.min(player.lane + 1, 2));
+ } else {
+ // Swipe left
+ player.moveToLane(Math.max(player.lane - 1, 0));
+ }
+ }
+};
+// Main game update loop
+game.update = function () {
+ if (!isGameStarted) {
+ return;
+ }
+ // Increment distance
+ distance += GAME_SPEED / 10;
+ scoreTxt.setText('Distance: ' + Math.floor(distance));
+ // Gradually increase game speed
+ GAME_SPEED = Math.min(GAME_SPEED + SPEED_INCREASE_RATE, MAX_GAME_SPEED);
+ // Spawn obstacles
+ obstacleTimer++;
+ if (obstacleTimer >= nextObstacleTime) {
+ spawnObstacle();
+ obstacleTimer = 0;
+ }
+ // Update obstacles
+ for (var i = obstacles.length - 1; i >= 0; i--) {
+ var obstacle = obstacles[i];
+ obstacle.speed = GAME_SPEED;
+ // Remove obstacles marked for removal
+ if (obstacle.markedForRemoval) {
+ obstacle.destroy();
+ obstacles.splice(i, 1);
+ }
+ }
+ // Update power-ups
+ for (var j = powerups.length - 1; j >= 0; j--) {
+ var powerup = powerups[j];
+ powerup.speed = GAME_SPEED;
+ // Remove power-ups marked for removal
+ if (powerup.markedForRemoval) {
+ powerup.destroy();
+ powerups.splice(j, 1);
+ }
+ }
+ // Check for collisions
+ checkCollisions();
+};
+// Initialize UI and game world
+initUI();
+initWorld();
\ No newline at end of file
A 2D, Pixalted Bike with one wheel in front and one at the back with a pixelated character on.. In-Game asset. 2d. High contrast. No shadows
A gem, a diamond with an emerald colour. In-Game asset. 2d. High contrast. No shadows
A pedestrian, walking down the street facing forwards. In-Game asset. 2d. High contrast. No shadows
A tarmac road, with 3 lanes, matching up with actual game lanes. In-Game asset. 2d. High contrast. No shadows
A person running backwards. In-Game asset. 2d. High contrast. No shadows
Make a pothole like hole in the road. In-Game asset. 2d. High contrast. No shadows