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
for (var l = 1; l < laneCount; l++) {
for (var i = 0; i < 10; i++) {
var divider = new LaneDivider();
divider.x = 2048 / 2 - laneWidth / 2 + laneWidth * l;
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
if (ticksSinceStart % 120 === 0 && gameSpeed < 2.5) {
gameSpeed += 0.05;
}
// 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
@@ -1,6 +1,262 @@
-/****
+/****
+* 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: 0x000000
-});
\ No newline at end of file
+ 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
+for (var l = 1; l < laneCount; l++) {
+ for (var i = 0; i < 10; i++) {
+ var divider = new LaneDivider();
+ divider.x = 2048 / 2 - laneWidth / 2 + laneWidth * l;
+ 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
+ if (ticksSinceStart % 120 === 0 && gameSpeed < 2.5) {
+ gameSpeed += 0.05;
+ }
+ // 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;
\ No newline at end of file