User prompt
Let the game speed up after 50 points, other than that, let it be at normal speed
User prompt
Get faster and faster to play
User prompt
Draw in all three lanes
User prompt
Let the lines be on each lane
Code edit (1 edits merged)
Please save this source code
User prompt
Turbo Lane Runner
Initial prompt
Hello make car game
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// Enemy Car Class
var EnemyCar = Container.expand(function () {
var self = Container.call(this);
var car = self.attachAsset('enemyCar', {
anchorX: 0.5,
anchorY: 0.5
});
self.lane = 1;
self.speed = 18;
self.update = function () {
self.y += self.speed * gameSpeed;
};
return self;
});
// Lane Divider Class
var LaneDivider = Container.expand(function () {
var self = Container.call(this);
var div = self.attachAsset('laneDivider', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 18;
self.update = function () {
self.y += self.speed * gameSpeed;
};
return self;
});
// Obstacle Class
var Obstacle = Container.expand(function () {
var self = Container.call(this);
var obs = self.attachAsset('obstacle', {
anchorX: 0.5,
anchorY: 0.5
});
self.lane = 1;
self.speed = 18;
self.update = function () {
self.y += self.speed * gameSpeed;
};
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
});
self.lane = 1; // 0: left, 1: center, 2: right
self.setLane = function (laneIdx) {
self.lane = laneIdx;
// Animate to new lane position
var targetX = lanes[self.lane];
tween(self, {
x: targetX
}, {
duration: 120,
easing: tween.cubicOut
});
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x222222
});
/****
* Game Code
****/
// Music (background)
// Sound for lane change
// Sound for crash
// Road lane divider
// Obstacle (barrier)
// Enemy car
// Car (player)
// Lane positions (3 lanes)
var laneCount = 3;
var laneWidth = 410;
var lanes = [2048 / 2 - laneWidth,
// left
2048 / 2,
// center
2048 / 2 + laneWidth // right
];
// Game variables
var playerCar;
var enemyCars = [];
var obstacles = [];
var laneDividers = [];
var score = 0;
var scoreTxt;
var gameSpeed = 1;
var ticksSinceStart = 0;
var swipeStartX = null;
var swipeStartY = null;
var swipeActive = false;
var lastLane = 1;
var spawnTick = 0;
var dividerSpacing = 320;
var dragNode = null;
// Score display
scoreTxt = new Text2('0', {
size: 120,
fill: "#fff"
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Start music
LK.playMusic('bgmusic');
// Create player car
playerCar = new PlayerCar();
playerCar.x = lanes[1];
playerCar.y = 2732 - 500;
playerCar.setLane(1);
game.addChild(playerCar);
// Create lane dividers (vertical lines for each lane)
// Draw a divider for each lane boundary (between lanes)
for (var l = 0; l < laneCount + 1; l++) {
// For 3 lanes, this will draw 4 lines: left edge, between lanes, right edge
// But we want only the lines between lanes, so skip the first and last
if (l === 0 || l === laneCount) continue;
for (var i = 0; i < 10; i++) {
var divider = new LaneDivider();
// Place the divider at the correct X for the lane line
divider.x = (lanes[l - 1] + lanes[l]) / 2;
divider.y = i * dividerSpacing;
laneDividers.push(divider);
game.addChild(divider);
}
}
// Helper: spawn enemy car or obstacle
function spawnObstacleOrEnemy() {
// Randomly decide: 70% enemy car, 30% obstacle
var isEnemy = Math.random() < 0.7;
var laneIdx = Math.floor(Math.random() * laneCount);
var y = -300;
if (isEnemy) {
var enemy = new EnemyCar();
enemy.lane = laneIdx;
enemy.x = lanes[laneIdx];
enemy.y = y;
enemyCars.push(enemy);
game.addChild(enemy);
} else {
var obs = new Obstacle();
obs.lane = laneIdx;
obs.x = lanes[laneIdx];
obs.y = y;
obstacles.push(obs);
game.addChild(obs);
}
}
// Helper: update score
function updateScore(val) {
score = val;
scoreTxt.setText(score);
}
// Touch/drag/swipe handling
game.down = function (x, y, obj) {
swipeStartX = x;
swipeStartY = y;
swipeActive = true;
dragNode = playerCar;
};
game.move = function (x, y, obj) {
// Only handle swipe if active
if (!swipeActive) return;
if (!dragNode) return;
var dx = x - swipeStartX;
var dy = y - swipeStartY;
// Only consider horizontal swipes, ignore vertical
if (Math.abs(dx) > 80 && Math.abs(dx) > Math.abs(dy)) {
var newLane = playerCar.lane;
if (dx < 0 && playerCar.lane > 0) {
newLane = playerCar.lane - 1;
} else if (dx > 0 && playerCar.lane < laneCount - 1) {
newLane = playerCar.lane + 1;
}
if (newLane !== playerCar.lane) {
playerCar.setLane(newLane);
LK.getSound('swipe').play();
swipeActive = false;
dragNode = null;
}
}
};
game.up = function (x, y, obj) {
swipeActive = false;
dragNode = null;
};
// Main game update loop
game.update = function () {
ticksSinceStart++;
// Gradually increase game speed, ramp up faster for more challenge
if (ticksSinceStart % 60 === 0 && gameSpeed < 4) {
// Increase speed every second, and allow it to go higher
if (gameSpeed < 2) {
gameSpeed += 0.08;
} else if (gameSpeed < 3) {
gameSpeed += 0.12;
} else {
gameSpeed += 0.18;
}
if (gameSpeed > 4) gameSpeed = 4;
}
// Move lane dividers, loop to top
for (var i = 0; i < laneDividers.length; i++) {
var div = laneDividers[i];
div.update();
if (div.y > 2732 + 60) {
div.y -= dividerSpacing * 10;
}
}
// Spawn enemies/obstacles every 40-60 ticks, randomize
spawnTick++;
var spawnInterval = 40 + Math.floor(Math.random() * 20);
if (spawnTick > spawnInterval) {
spawnObstacleOrEnemy();
spawnTick = 0;
}
// Update enemy cars
for (var i = enemyCars.length - 1; i >= 0; i--) {
var enemy = enemyCars[i];
enemy.update();
// Off screen
if (enemy.y > 2732 + 300) {
enemy.destroy();
enemyCars.splice(i, 1);
updateScore(score + 1);
continue;
}
// Collision with player
if (enemy.intersects(playerCar)) {
LK.getSound('crash').play();
LK.effects.flashScreen(0xff0000, 800);
LK.showGameOver();
return;
}
}
// Update obstacles
for (var j = obstacles.length - 1; j >= 0; j--) {
var obs = obstacles[j];
obs.update();
// Off screen
if (obs.y > 2732 + 200) {
obs.destroy();
obstacles.splice(j, 1);
updateScore(score + 1);
continue;
}
// Collision with player
if (obs.intersects(playerCar)) {
LK.getSound('crash').play();
LK.effects.flashScreen(0xff0000, 800);
LK.showGameOver();
return;
}
}
};
// Center score text at top, avoid top left 100x100
scoreTxt.x = LK.gui.top.width / 2;
scoreTxt.y = 40; ===================================================================
--- original.js
+++ change.js
@@ -203,11 +203,19 @@
};
// Main game update loop
game.update = function () {
ticksSinceStart++;
- // Gradually increase game speed
- if (ticksSinceStart % 120 === 0 && gameSpeed < 2.5) {
- gameSpeed += 0.05;
+ // Gradually increase game speed, ramp up faster for more challenge
+ if (ticksSinceStart % 60 === 0 && gameSpeed < 4) {
+ // Increase speed every second, and allow it to go higher
+ if (gameSpeed < 2) {
+ gameSpeed += 0.08;
+ } else if (gameSpeed < 3) {
+ gameSpeed += 0.12;
+ } else {
+ gameSpeed += 0.18;
+ }
+ if (gameSpeed > 4) gameSpeed = 4;
}
// Move lane dividers, loop to top
for (var i = 0; i < laneDividers.length; i++) {
var div = laneDividers[i];