User prompt
add grass to the sides, make the plan better
User prompt
When we collect 20 coins, small balloons will appear on the screen for 2 seconds but the game will continue.
User prompt
improve quality
User prompt
add green grass to the right and left
User prompt
add green grass to the right and left
User prompt
add green grass to the right and left
Code edit (1 edits merged)
Please save this source code
User prompt
Turbo Touch Racer
Initial prompt
make a car racing game
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// Coin
var Coin = Container.expand(function () {
var self = Container.call(this);
var coinAsset = self.attachAsset('coin', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 0; // Will be set on spawn
self.update = function () {
self.y += self.speed;
};
return self;
});
// Obstacle Car
var ObstacleCar = Container.expand(function () {
var self = Container.call(this);
var obsAsset = self.attachAsset('obstacle', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 0; // Will be set on spawn
self.update = function () {
self.y += self.speed;
};
return self;
});
// Player Car
var PlayerCar = Container.expand(function () {
var self = Container.call(this);
var carAsset = self.attachAsset('car', {
anchorX: 0.5,
anchorY: 0.5
});
// For collision, use the container itself
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x222222
});
/****
* Game Code
****/
// Road lane
// Coin
// Obstacle (enemy car)
// Car (player)
// Road config
var ROAD_WIDTH = 900;
var ROAD_X = (2048 - ROAD_WIDTH) / 2;
var ROAD_Y = 0;
var ROAD_HEIGHT = 2732;
// Lane config
var LANE_COUNT = 3;
var LANE_WIDTH = ROAD_WIDTH / LANE_COUNT;
// Player config
var PLAYER_START_LANE = 1; // 0 = left, 1 = center, 2 = right
var PLAYER_Y = 2732 - 400;
// Obstacle config
var OBSTACLE_MIN_INTERVAL = 60; // frames
var OBSTACLE_MAX_INTERVAL = 120; // frames
// Coin config
var COIN_MIN_INTERVAL = 80;
var COIN_MAX_INTERVAL = 160;
// Speed config
var BASE_SPEED = 16;
var SPEED_INCREMENT = 0.015; // per tick
var MAX_SPEED = 38;
// Game state
var playerCar;
var obstacles = [];
var coins = [];
var dragNode = null;
var dragOffsetX = 0;
var lastObstacleTick = 0;
var nextObstacleInterval = 90;
var lastCoinTick = 0;
var nextCoinInterval = 120;
var currentSpeed = BASE_SPEED;
var ticksSurvived = 0;
// Draw road background (just a gray rectangle)
var roadBg = LK.getAsset('lane', {
width: ROAD_WIDTH,
height: ROAD_HEIGHT,
color: 0x444444,
anchorX: 0,
anchorY: 0,
x: ROAD_X,
y: ROAD_Y
});
game.addChild(roadBg);
// Draw lane markers
var laneMarkers = [];
for (var i = 1; i < LANE_COUNT; i++) {
var marker = LK.getAsset('lane', {
width: 40,
height: ROAD_HEIGHT,
color: 0xffffff,
anchorX: 0.5,
anchorY: 0,
x: ROAD_X + i * LANE_WIDTH,
y: ROAD_Y
});
marker.alpha = 0.18;
game.addChild(marker);
laneMarkers.push(marker);
}
// Score text
var scoreTxt = new Text2('0', {
size: 120,
fill: "#fff"
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Place player car
playerCar = new PlayerCar();
playerCar.x = ROAD_X + (PLAYER_START_LANE + 0.5) * LANE_WIDTH;
playerCar.y = PLAYER_Y;
game.addChild(playerCar);
// Helper: Clamp x to road
function clampToRoad(x) {
var minX = ROAD_X + playerCar.width / 2;
var maxX = ROAD_X + ROAD_WIDTH - playerCar.width / 2;
if (x < minX) return minX;
if (x > maxX) return maxX;
return x;
}
// Touch/drag controls
game.down = function (x, y, obj) {
// Only start drag if touch is on 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) {
dragNode = playerCar;
dragOffsetX = playerCar.x - x;
}
};
game.move = function (x, y, obj) {
if (dragNode) {
// Only allow horizontal movement, clamp to road
dragNode.x = clampToRoad(x + dragOffsetX);
}
};
game.up = function (x, y, obj) {
dragNode = null;
};
// Spawn obstacle
function spawnObstacle() {
var lane = Math.floor(Math.random() * LANE_COUNT);
var obs = new ObstacleCar();
obs.x = ROAD_X + (lane + 0.5) * LANE_WIDTH;
obs.y = -obs.height / 2;
obs.speed = currentSpeed;
obstacles.push(obs);
game.addChild(obs);
}
// Spawn coin
function spawnCoin() {
var lane = Math.floor(Math.random() * LANE_COUNT);
var coin = new Coin();
coin.x = ROAD_X + (lane + 0.5) * LANE_WIDTH;
coin.y = -coin.height / 2 - 100;
coin.speed = currentSpeed;
coins.push(coin);
game.addChild(coin);
}
// Main game update
game.update = function () {
ticksSurvived++;
// Increase speed over time
if (currentSpeed < MAX_SPEED) {
currentSpeed += SPEED_INCREMENT;
}
// Update obstacles
for (var i = obstacles.length - 1; i >= 0; i--) {
var obs = obstacles[i];
obs.speed = currentSpeed;
obs.update();
// Remove if off screen
if (obs.y - obs.height / 2 > 2732) {
obs.destroy();
obstacles.splice(i, 1);
continue;
}
// Collision with player
if (obs.intersects(playerCar)) {
LK.effects.flashScreen(0xff0000, 800);
LK.showGameOver();
return;
}
}
// Update coins
for (var j = coins.length - 1; j >= 0; j--) {
var coin = coins[j];
coin.speed = currentSpeed;
coin.update();
// Remove if off screen
if (coin.y - coin.height / 2 > 2732) {
coin.destroy();
coins.splice(j, 1);
continue;
}
// Collect coin
if (coin.intersects(playerCar)) {
LK.setScore(LK.getScore() + 1);
scoreTxt.setText(LK.getScore());
// Animate coin
tween(coin, {
scaleX: 1.5,
scaleY: 1.5,
alpha: 0
}, {
duration: 200,
easing: tween.easeOut,
onFinish: function onFinish() {
coin.destroy();
}
});
coins.splice(j, 1);
continue;
}
}
// Spawn obstacles
if (LK.ticks - lastObstacleTick >= nextObstacleInterval) {
spawnObstacle();
lastObstacleTick = LK.ticks;
nextObstacleInterval = OBSTACLE_MIN_INTERVAL + Math.floor(Math.random() * (OBSTACLE_MAX_INTERVAL - OBSTACLE_MIN_INTERVAL));
}
// Spawn coins
if (LK.ticks - lastCoinTick >= nextCoinInterval) {
spawnCoin();
lastCoinTick = LK.ticks;
nextCoinInterval = COIN_MIN_INTERVAL + Math.floor(Math.random() * (COIN_MAX_INTERVAL - COIN_MIN_INTERVAL));
}
};
// Set initial score
LK.setScore(0);
scoreTxt.setText('0'); ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,252 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+
+/****
+* Classes
+****/
+// Coin
+var Coin = Container.expand(function () {
+ var self = Container.call(this);
+ var coinAsset = self.attachAsset('coin', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 0; // Will be set on spawn
+ self.update = function () {
+ self.y += self.speed;
+ };
+ return self;
+});
+// Obstacle Car
+var ObstacleCar = Container.expand(function () {
+ var self = Container.call(this);
+ var obsAsset = self.attachAsset('obstacle', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 0; // Will be set on spawn
+ self.update = function () {
+ self.y += self.speed;
+ };
+ return self;
+});
+// Player Car
+var PlayerCar = Container.expand(function () {
+ var self = Container.call(this);
+ var carAsset = self.attachAsset('car', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ // For collision, use the container itself
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x222222
+});
+
+/****
+* Game Code
+****/
+// Road lane
+// Coin
+// Obstacle (enemy car)
+// Car (player)
+// Road config
+var ROAD_WIDTH = 900;
+var ROAD_X = (2048 - ROAD_WIDTH) / 2;
+var ROAD_Y = 0;
+var ROAD_HEIGHT = 2732;
+// Lane config
+var LANE_COUNT = 3;
+var LANE_WIDTH = ROAD_WIDTH / LANE_COUNT;
+// Player config
+var PLAYER_START_LANE = 1; // 0 = left, 1 = center, 2 = right
+var PLAYER_Y = 2732 - 400;
+// Obstacle config
+var OBSTACLE_MIN_INTERVAL = 60; // frames
+var OBSTACLE_MAX_INTERVAL = 120; // frames
+// Coin config
+var COIN_MIN_INTERVAL = 80;
+var COIN_MAX_INTERVAL = 160;
+// Speed config
+var BASE_SPEED = 16;
+var SPEED_INCREMENT = 0.015; // per tick
+var MAX_SPEED = 38;
+// Game state
+var playerCar;
+var obstacles = [];
+var coins = [];
+var dragNode = null;
+var dragOffsetX = 0;
+var lastObstacleTick = 0;
+var nextObstacleInterval = 90;
+var lastCoinTick = 0;
+var nextCoinInterval = 120;
+var currentSpeed = BASE_SPEED;
+var ticksSurvived = 0;
+// Draw road background (just a gray rectangle)
+var roadBg = LK.getAsset('lane', {
+ width: ROAD_WIDTH,
+ height: ROAD_HEIGHT,
+ color: 0x444444,
+ anchorX: 0,
+ anchorY: 0,
+ x: ROAD_X,
+ y: ROAD_Y
+});
+game.addChild(roadBg);
+// Draw lane markers
+var laneMarkers = [];
+for (var i = 1; i < LANE_COUNT; i++) {
+ var marker = LK.getAsset('lane', {
+ width: 40,
+ height: ROAD_HEIGHT,
+ color: 0xffffff,
+ anchorX: 0.5,
+ anchorY: 0,
+ x: ROAD_X + i * LANE_WIDTH,
+ y: ROAD_Y
+ });
+ marker.alpha = 0.18;
+ game.addChild(marker);
+ laneMarkers.push(marker);
+}
+// Score text
+var scoreTxt = new Text2('0', {
+ size: 120,
+ fill: "#fff"
+});
+scoreTxt.anchor.set(0.5, 0);
+LK.gui.top.addChild(scoreTxt);
+// Place player car
+playerCar = new PlayerCar();
+playerCar.x = ROAD_X + (PLAYER_START_LANE + 0.5) * LANE_WIDTH;
+playerCar.y = PLAYER_Y;
+game.addChild(playerCar);
+// Helper: Clamp x to road
+function clampToRoad(x) {
+ var minX = ROAD_X + playerCar.width / 2;
+ var maxX = ROAD_X + ROAD_WIDTH - playerCar.width / 2;
+ if (x < minX) return minX;
+ if (x > maxX) return maxX;
+ return x;
+}
+// Touch/drag controls
+game.down = function (x, y, obj) {
+ // Only start drag if touch is on 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) {
+ dragNode = playerCar;
+ dragOffsetX = playerCar.x - x;
+ }
+};
+game.move = function (x, y, obj) {
+ if (dragNode) {
+ // Only allow horizontal movement, clamp to road
+ dragNode.x = clampToRoad(x + dragOffsetX);
+ }
+};
+game.up = function (x, y, obj) {
+ dragNode = null;
+};
+// Spawn obstacle
+function spawnObstacle() {
+ var lane = Math.floor(Math.random() * LANE_COUNT);
+ var obs = new ObstacleCar();
+ obs.x = ROAD_X + (lane + 0.5) * LANE_WIDTH;
+ obs.y = -obs.height / 2;
+ obs.speed = currentSpeed;
+ obstacles.push(obs);
+ game.addChild(obs);
+}
+// Spawn coin
+function spawnCoin() {
+ var lane = Math.floor(Math.random() * LANE_COUNT);
+ var coin = new Coin();
+ coin.x = ROAD_X + (lane + 0.5) * LANE_WIDTH;
+ coin.y = -coin.height / 2 - 100;
+ coin.speed = currentSpeed;
+ coins.push(coin);
+ game.addChild(coin);
+}
+// Main game update
+game.update = function () {
+ ticksSurvived++;
+ // Increase speed over time
+ if (currentSpeed < MAX_SPEED) {
+ currentSpeed += SPEED_INCREMENT;
+ }
+ // Update obstacles
+ for (var i = obstacles.length - 1; i >= 0; i--) {
+ var obs = obstacles[i];
+ obs.speed = currentSpeed;
+ obs.update();
+ // Remove if off screen
+ if (obs.y - obs.height / 2 > 2732) {
+ obs.destroy();
+ obstacles.splice(i, 1);
+ continue;
+ }
+ // Collision with player
+ if (obs.intersects(playerCar)) {
+ LK.effects.flashScreen(0xff0000, 800);
+ LK.showGameOver();
+ return;
+ }
+ }
+ // Update coins
+ for (var j = coins.length - 1; j >= 0; j--) {
+ var coin = coins[j];
+ coin.speed = currentSpeed;
+ coin.update();
+ // Remove if off screen
+ if (coin.y - coin.height / 2 > 2732) {
+ coin.destroy();
+ coins.splice(j, 1);
+ continue;
+ }
+ // Collect coin
+ if (coin.intersects(playerCar)) {
+ LK.setScore(LK.getScore() + 1);
+ scoreTxt.setText(LK.getScore());
+ // Animate coin
+ tween(coin, {
+ scaleX: 1.5,
+ scaleY: 1.5,
+ alpha: 0
+ }, {
+ duration: 200,
+ easing: tween.easeOut,
+ onFinish: function onFinish() {
+ coin.destroy();
+ }
+ });
+ coins.splice(j, 1);
+ continue;
+ }
+ }
+ // Spawn obstacles
+ if (LK.ticks - lastObstacleTick >= nextObstacleInterval) {
+ spawnObstacle();
+ lastObstacleTick = LK.ticks;
+ nextObstacleInterval = OBSTACLE_MIN_INTERVAL + Math.floor(Math.random() * (OBSTACLE_MAX_INTERVAL - OBSTACLE_MIN_INTERVAL));
+ }
+ // Spawn coins
+ if (LK.ticks - lastCoinTick >= nextCoinInterval) {
+ spawnCoin();
+ lastCoinTick = LK.ticks;
+ nextCoinInterval = COIN_MIN_INTERVAL + Math.floor(Math.random() * (COIN_MAX_INTERVAL - COIN_MIN_INTERVAL));
+ }
+};
+// Set initial score
+LK.setScore(0);
+scoreTxt.setText('0');
\ No newline at end of file