User prompt
Let's manage one car
User prompt
Leave a gap between the back of the 2nd car and the front of the . car
User prompt
Leave a gap between the back of the first car and the front of the second car.
User prompt
The cars should be lined up and in a row, but there should be space between them.
User prompt
cars move away from each other
User prompt
Have 2 more cars in the back, follow the car in the front.
User prompt
Let there be 4 more cars behind, let them follow the car in front.
User prompt
let the road be 4 lanes
User prompt
The screen is divided into two invisible halves: Left side: Tap to move the car to the left lane. Right side: Tap to move the car to the right lane.
Code edit (1 edits merged)
Please save this source code
User prompt
Highway Dodge
Initial prompt
Objective: The player will be driving on a highway in a vehicle and will try to avoid the obstacles that come their way. The player's goal is to survive as long as possible and collect high scores. Story: The game will be a simple arcade style, with only one goal: to avoid the obstacles. However, as you progress, the speed and difficulty level will increase.
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// Lane Divider Class
var LaneDivider = Container.expand(function () {
var self = Container.call(this);
var divider = self.attachAsset('laneDivider', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 0;
self.update = function () {
self.y += self.speed;
};
return self;
});
// Obstacle Car Class
var ObstacleCar = Container.expand(function () {
var self = Container.call(this);
var car = self.attachAsset('obstacleCar', {
anchorX: 0.5,
anchorY: 0.5
});
self.type = 'car';
self.speed = 0;
self.update = function () {
self.y += self.speed;
};
return self;
});
// Obstacle Truck Class
var ObstacleTruck = Container.expand(function () {
var self = Container.call(this);
var truck = self.attachAsset('obstacleTruck', {
anchorX: 0.5,
anchorY: 0.5
});
self.type = 'truck';
self.speed = 0;
self.update = function () {
self.y += self.speed;
};
return self;
});
// Player Car Class
var PlayerCar = Container.expand(function () {
var self = Container.call(this);
var car = self.attachAsset('playerCar', {
anchorX: 0.5,
anchorY: 0.5
});
// For collision, use self as the hitbox
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x222222
});
/****
* Game Code
****/
// Road lane divider
// Obstacle (other cars/trucks)
// Vehicle (player car)
// Game constants
var ROAD_WIDTH = 1200;
var ROAD_LEFT = (2048 - ROAD_WIDTH) / 2;
var ROAD_RIGHT = ROAD_LEFT + ROAD_WIDTH;
var NUM_LANES = 4;
var LANE_WIDTH = ROAD_WIDTH / NUM_LANES;
var PLAYER_START_LANE = 2; // 0-indexed
var PLAYER_Y = 2200;
var OBSTACLE_MIN_GAP = 420;
var OBSTACLE_MAX_GAP = 800;
var OBSTACLE_MIN_SPEED = 18;
var OBSTACLE_MAX_SPEED = 38;
var LANE_DIVIDER_GAP = 320;
var LANE_DIVIDER_SPEED = 28;
// Game state
var playerCar;
var playerLane = PLAYER_START_LANE;
var obstacles = [];
var laneDividers = [];
var dragStartX = null;
var dragStartLane = null;
var isDragging = false;
var gameOver = false;
var ticksSurvived = 0;
var speedMultiplier = 1;
// Score display
var scoreTxt = new Text2('0', {
size: 120,
fill: "#fff"
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Draw road background (just a rectangle, not an asset)
var roadBg = LK.getAsset('laneDivider', {
width: ROAD_WIDTH,
height: 2732,
color: 0x333333,
anchorX: 0,
anchorY: 0,
x: ROAD_LEFT,
y: 0
});
game.addChild(roadBg);
// Draw lane dividers (vertical dashed lines)
function spawnLaneDividers() {
for (var lane = 1; lane < NUM_LANES; lane++) {
for (var y = -120; y < 2732 + 120; y += LANE_DIVIDER_GAP + 120) {
var divider = new LaneDivider();
divider.x = ROAD_LEFT + lane * LANE_WIDTH;
divider.y = y;
divider.speed = LANE_DIVIDER_SPEED;
laneDividers.push(divider);
game.addChild(divider);
}
}
}
spawnLaneDividers();
// Spawn player car
playerCar = new PlayerCar();
playerCar.x = ROAD_LEFT + (playerLane + 0.5) * LANE_WIDTH;
playerCar.y = PLAYER_Y;
game.addChild(playerCar);
// Touch controls: swipe left/right to change lanes
function getLaneFromX(x) {
var lane = Math.floor((x - ROAD_LEFT) / LANE_WIDTH);
if (lane < 0) lane = 0;
if (lane >= NUM_LANES) lane = NUM_LANES - 1;
return lane;
}
game.down = function (x, y, obj) {
if (gameOver) return;
// Only start drag if touch is on the player car
var local = playerCar.toLocal(game.toGlobal({
x: x,
y: y
}));
if (local.x > -playerCar.width / 2 && local.x < playerCar.width / 2 && local.y > -playerCar.height / 2 && local.y < playerCar.height / 2) {
isDragging = true;
dragStartX = x;
dragStartLane = playerLane;
}
};
game.move = function (x, y, obj) {
if (gameOver) return;
if (isDragging) {
var dx = x - dragStartX;
var laneDelta = Math.round(dx / LANE_WIDTH);
var newLane = dragStartLane + laneDelta;
if (newLane < 0) newLane = 0;
if (newLane >= NUM_LANES) newLane = NUM_LANES - 1;
if (newLane !== playerLane) {
playerLane = newLane;
// Animate car to new lane
tween(playerCar, {
x: ROAD_LEFT + (playerLane + 0.5) * LANE_WIDTH
}, {
duration: 120,
easing: tween.cubicOut
});
}
}
};
game.up = function (x, y, obj) {
isDragging = false;
};
// Spawn obstacles at random intervals
var nextObstacleTick = 0;
function spawnObstacle() {
// Randomly choose lane and type
var lane = Math.floor(Math.random() * NUM_LANES);
var type = Math.random() < 0.7 ? 'car' : 'truck';
var obs;
if (type === 'car') {
obs = new ObstacleCar();
} else {
obs = new ObstacleTruck();
}
obs.x = ROAD_LEFT + (lane + 0.5) * LANE_WIDTH;
obs.y = -(obs.height / 2);
// Speed increases with time
obs.speed = OBSTACLE_MIN_SPEED + (OBSTACLE_MAX_SPEED - OBSTACLE_MIN_SPEED) * speedMultiplier;
obstacles.push(obs);
game.addChild(obs);
}
// Main game update loop
game.update = function () {
if (gameOver) return;
ticksSurvived++;
// Score: 1 point per 10 ticks survived
if (ticksSurvived % 10 === 0) {
LK.setScore(LK.getScore() + 1);
scoreTxt.setText(LK.getScore());
}
// Increase speed multiplier over time (caps at 1)
speedMultiplier = Math.min(1, ticksSurvived / (60 * 60)); // 1 after 60 seconds
// Move lane dividers
for (var i = laneDividers.length - 1; i >= 0; i--) {
var divider = laneDividers[i];
divider.speed = LANE_DIVIDER_SPEED + 20 * speedMultiplier;
divider.update();
if (divider.y > 2732 + 120) {
divider.y = -120;
}
}
// Move obstacles
for (var j = obstacles.length - 1; j >= 0; j--) {
var obs = obstacles[j];
obs.speed = OBSTACLE_MIN_SPEED + (OBSTACLE_MAX_SPEED - OBSTACLE_MIN_SPEED) * speedMultiplier;
obs.update();
// Remove if off screen
if (obs.y - obs.height / 2 > 2732 + 100) {
obs.destroy();
obstacles.splice(j, 1);
continue;
}
// Collision detection
if (obs.intersects(playerCar)) {
// Flash screen red
LK.effects.flashScreen(0xff0000, 800);
gameOver = true;
LK.showGameOver();
return;
}
}
// Spawn new obstacles
if (LK.ticks >= nextObstacleTick) {
spawnObstacle();
// Next obstacle in random ticks, gets faster over time
var minGap = OBSTACLE_MIN_GAP - 200 * speedMultiplier;
var maxGap = OBSTACLE_MAX_GAP - 400 * speedMultiplier;
if (minGap < 180) minGap = 180;
if (maxGap < 320) maxGap = 320;
var gap = minGap + Math.random() * (maxGap - minGap);
nextObstacleTick = LK.ticks + Math.floor(gap / (OBSTACLE_MIN_SPEED + (OBSTACLE_MAX_SPEED - OBSTACLE_MIN_SPEED) * speedMultiplier));
}
};
// Reset game state on restart
game.on('reset', function () {
// Remove all obstacles and lane dividers
for (var i = 0; i < obstacles.length; i++) {
obstacles[i].destroy();
}
obstacles = [];
for (var j = 0; j < laneDividers.length; j++) {
laneDividers[j].destroy();
}
laneDividers = [];
// Recreate lane dividers
spawnLaneDividers();
// Reset player
playerLane = PLAYER_START_LANE;
playerCar.x = ROAD_LEFT + (playerLane + 0.5) * LANE_WIDTH;
playerCar.y = PLAYER_Y;
// Reset state
dragStartX = null;
dragStartLane = null;
isDragging = false;
gameOver = false;
ticksSurvived = 0;
speedMultiplier = 0;
LK.setScore(0);
scoreTxt.setText('0');
nextObstacleTick = 0;
}); ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,277 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+
+/****
+* Classes
+****/
+// Lane Divider Class
+var LaneDivider = Container.expand(function () {
+ var self = Container.call(this);
+ var divider = self.attachAsset('laneDivider', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 0;
+ self.update = function () {
+ self.y += self.speed;
+ };
+ return self;
+});
+// Obstacle Car Class
+var ObstacleCar = Container.expand(function () {
+ var self = Container.call(this);
+ var car = self.attachAsset('obstacleCar', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.type = 'car';
+ self.speed = 0;
+ self.update = function () {
+ self.y += self.speed;
+ };
+ return self;
+});
+// Obstacle Truck Class
+var ObstacleTruck = Container.expand(function () {
+ var self = Container.call(this);
+ var truck = self.attachAsset('obstacleTruck', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.type = 'truck';
+ self.speed = 0;
+ self.update = function () {
+ self.y += self.speed;
+ };
+ return self;
+});
+// Player Car Class
+var PlayerCar = Container.expand(function () {
+ var self = Container.call(this);
+ var car = self.attachAsset('playerCar', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ // For collision, use self as the hitbox
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
+ backgroundColor: 0x222222
+});
+
+/****
+* Game Code
+****/
+// Road lane divider
+// Obstacle (other cars/trucks)
+// Vehicle (player car)
+// Game constants
+var ROAD_WIDTH = 1200;
+var ROAD_LEFT = (2048 - ROAD_WIDTH) / 2;
+var ROAD_RIGHT = ROAD_LEFT + ROAD_WIDTH;
+var NUM_LANES = 4;
+var LANE_WIDTH = ROAD_WIDTH / NUM_LANES;
+var PLAYER_START_LANE = 2; // 0-indexed
+var PLAYER_Y = 2200;
+var OBSTACLE_MIN_GAP = 420;
+var OBSTACLE_MAX_GAP = 800;
+var OBSTACLE_MIN_SPEED = 18;
+var OBSTACLE_MAX_SPEED = 38;
+var LANE_DIVIDER_GAP = 320;
+var LANE_DIVIDER_SPEED = 28;
+// Game state
+var playerCar;
+var playerLane = PLAYER_START_LANE;
+var obstacles = [];
+var laneDividers = [];
+var dragStartX = null;
+var dragStartLane = null;
+var isDragging = false;
+var gameOver = false;
+var ticksSurvived = 0;
+var speedMultiplier = 1;
+// Score display
+var scoreTxt = new Text2('0', {
+ size: 120,
+ fill: "#fff"
+});
+scoreTxt.anchor.set(0.5, 0);
+LK.gui.top.addChild(scoreTxt);
+// Draw road background (just a rectangle, not an asset)
+var roadBg = LK.getAsset('laneDivider', {
+ width: ROAD_WIDTH,
+ height: 2732,
+ color: 0x333333,
+ anchorX: 0,
+ anchorY: 0,
+ x: ROAD_LEFT,
+ y: 0
+});
+game.addChild(roadBg);
+// Draw lane dividers (vertical dashed lines)
+function spawnLaneDividers() {
+ for (var lane = 1; lane < NUM_LANES; lane++) {
+ for (var y = -120; y < 2732 + 120; y += LANE_DIVIDER_GAP + 120) {
+ var divider = new LaneDivider();
+ divider.x = ROAD_LEFT + lane * LANE_WIDTH;
+ divider.y = y;
+ divider.speed = LANE_DIVIDER_SPEED;
+ laneDividers.push(divider);
+ game.addChild(divider);
+ }
+ }
+}
+spawnLaneDividers();
+// Spawn player car
+playerCar = new PlayerCar();
+playerCar.x = ROAD_LEFT + (playerLane + 0.5) * LANE_WIDTH;
+playerCar.y = PLAYER_Y;
+game.addChild(playerCar);
+// Touch controls: swipe left/right to change lanes
+function getLaneFromX(x) {
+ var lane = Math.floor((x - ROAD_LEFT) / LANE_WIDTH);
+ if (lane < 0) lane = 0;
+ if (lane >= NUM_LANES) lane = NUM_LANES - 1;
+ return lane;
+}
+game.down = function (x, y, obj) {
+ if (gameOver) return;
+ // Only start drag if touch is on the player car
+ var local = playerCar.toLocal(game.toGlobal({
+ x: x,
+ y: y
+ }));
+ if (local.x > -playerCar.width / 2 && local.x < playerCar.width / 2 && local.y > -playerCar.height / 2 && local.y < playerCar.height / 2) {
+ isDragging = true;
+ dragStartX = x;
+ dragStartLane = playerLane;
+ }
+};
+game.move = function (x, y, obj) {
+ if (gameOver) return;
+ if (isDragging) {
+ var dx = x - dragStartX;
+ var laneDelta = Math.round(dx / LANE_WIDTH);
+ var newLane = dragStartLane + laneDelta;
+ if (newLane < 0) newLane = 0;
+ if (newLane >= NUM_LANES) newLane = NUM_LANES - 1;
+ if (newLane !== playerLane) {
+ playerLane = newLane;
+ // Animate car to new lane
+ tween(playerCar, {
+ x: ROAD_LEFT + (playerLane + 0.5) * LANE_WIDTH
+ }, {
+ duration: 120,
+ easing: tween.cubicOut
+ });
+ }
+ }
+};
+game.up = function (x, y, obj) {
+ isDragging = false;
+};
+// Spawn obstacles at random intervals
+var nextObstacleTick = 0;
+function spawnObstacle() {
+ // Randomly choose lane and type
+ var lane = Math.floor(Math.random() * NUM_LANES);
+ var type = Math.random() < 0.7 ? 'car' : 'truck';
+ var obs;
+ if (type === 'car') {
+ obs = new ObstacleCar();
+ } else {
+ obs = new ObstacleTruck();
+ }
+ obs.x = ROAD_LEFT + (lane + 0.5) * LANE_WIDTH;
+ obs.y = -(obs.height / 2);
+ // Speed increases with time
+ obs.speed = OBSTACLE_MIN_SPEED + (OBSTACLE_MAX_SPEED - OBSTACLE_MIN_SPEED) * speedMultiplier;
+ obstacles.push(obs);
+ game.addChild(obs);
+}
+// Main game update loop
+game.update = function () {
+ if (gameOver) return;
+ ticksSurvived++;
+ // Score: 1 point per 10 ticks survived
+ if (ticksSurvived % 10 === 0) {
+ LK.setScore(LK.getScore() + 1);
+ scoreTxt.setText(LK.getScore());
+ }
+ // Increase speed multiplier over time (caps at 1)
+ speedMultiplier = Math.min(1, ticksSurvived / (60 * 60)); // 1 after 60 seconds
+ // Move lane dividers
+ for (var i = laneDividers.length - 1; i >= 0; i--) {
+ var divider = laneDividers[i];
+ divider.speed = LANE_DIVIDER_SPEED + 20 * speedMultiplier;
+ divider.update();
+ if (divider.y > 2732 + 120) {
+ divider.y = -120;
+ }
+ }
+ // Move obstacles
+ for (var j = obstacles.length - 1; j >= 0; j--) {
+ var obs = obstacles[j];
+ obs.speed = OBSTACLE_MIN_SPEED + (OBSTACLE_MAX_SPEED - OBSTACLE_MIN_SPEED) * speedMultiplier;
+ obs.update();
+ // Remove if off screen
+ if (obs.y - obs.height / 2 > 2732 + 100) {
+ obs.destroy();
+ obstacles.splice(j, 1);
+ continue;
+ }
+ // Collision detection
+ if (obs.intersects(playerCar)) {
+ // Flash screen red
+ LK.effects.flashScreen(0xff0000, 800);
+ gameOver = true;
+ LK.showGameOver();
+ return;
+ }
+ }
+ // Spawn new obstacles
+ if (LK.ticks >= nextObstacleTick) {
+ spawnObstacle();
+ // Next obstacle in random ticks, gets faster over time
+ var minGap = OBSTACLE_MIN_GAP - 200 * speedMultiplier;
+ var maxGap = OBSTACLE_MAX_GAP - 400 * speedMultiplier;
+ if (minGap < 180) minGap = 180;
+ if (maxGap < 320) maxGap = 320;
+ var gap = minGap + Math.random() * (maxGap - minGap);
+ nextObstacleTick = LK.ticks + Math.floor(gap / (OBSTACLE_MIN_SPEED + (OBSTACLE_MAX_SPEED - OBSTACLE_MIN_SPEED) * speedMultiplier));
+ }
+};
+// Reset game state on restart
+game.on('reset', function () {
+ // Remove all obstacles and lane dividers
+ for (var i = 0; i < obstacles.length; i++) {
+ obstacles[i].destroy();
+ }
+ obstacles = [];
+ for (var j = 0; j < laneDividers.length; j++) {
+ laneDividers[j].destroy();
+ }
+ laneDividers = [];
+ // Recreate lane dividers
+ spawnLaneDividers();
+ // Reset player
+ playerLane = PLAYER_START_LANE;
+ playerCar.x = ROAD_LEFT + (playerLane + 0.5) * LANE_WIDTH;
+ playerCar.y = PLAYER_Y;
+ // Reset state
+ dragStartX = null;
+ dragStartLane = null;
+ isDragging = false;
+ gameOver = false;
+ ticksSurvived = 0;
+ speedMultiplier = 0;
+ LK.setScore(0);
+ scoreTxt.setText('0');
+ nextObstacleTick = 0;
});
\ No newline at end of file
A luxury black van with the words penci zorno on it, top view looking at the opposite side. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
a top view of the supercar with rocket engines on the back. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
super Truck with propeller top view. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat