/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
// Coin Class
var Coin = Container.expand(function () {
var self = Container.call(this);
// Gold ellipse for coin
var coin = self.attachAsset('coin', {
anchorX: 0.5,
anchorY: 0.5,
color: 0xffd700,
width: 100,
height: 100,
shape: 'ellipse'
});
self.width = coin.width;
self.height = coin.height;
// Speed will be set on spawn
self.speed = 10;
self.update = function () {
self.y += self.speed;
};
return self;
});
// Obstacle Car Class
var ObstacleCar = Container.expand(function () {
var self = Container.call(this);
// Random color for variety
var colors = [0x1e90ff, 0x32cd32, 0xffa500, 0x8a2be2, 0xff1493, 0x00ced1];
var color = colors[Math.floor(Math.random() * colors.length)];
var car = self.attachAsset('obstacleCar', {
anchorX: 0.5,
anchorY: 0.5,
color: color,
width: 200,
height: 300
});
self.width = car.width;
self.height = car.height;
// Speed will be set on spawn
self.speed = 10;
self.update = function () {
self.y += self.speed;
};
return self;
});
// Player Car Class
var PlayerCar = Container.expand(function () {
var self = Container.call(this);
// Attach car asset (red box)
var car = self.attachAsset('playerCar', {
anchorX: 0.5,
anchorY: 0.5
});
// Set initial size (about 200x300 px)
car.width = 200;
car.height = 300;
// For collision, use self as the hitbox
self.width = car.width;
self.height = car.height;
// No update needed; position is set by drag
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x222222
});
/****
* Game Code
****/
// Game area: 2048x2732
// Road boundaries (leave 200px margin on each side)
var roadLeft = 200;
var roadRight = 2048 - 200;
var roadWidth = roadRight - roadLeft;
// Lane count and positions
var laneCount = 4;
var laneWidth = roadWidth / laneCount;
var laneCenters = [];
for (var i = 0; i < laneCount; i++) {
laneCenters.push(roadLeft + laneWidth * (i + 0.5));
}
// Game state variables
var playerCar;
var obstacles = [];
var coins = [];
var dragNode = null;
var lastCrash = false;
var speed = 18; // Initial speed (pixels per frame)
var minSpeed = 12;
var maxSpeed = 38;
var speedIncreaseEvery = 600; // Increase speed every 600 ticks (~10s)
var ticksSinceStart = 0;
var distance = 0; // Distance in meters (1 meter = 10px)
var coinScore = 0;
// Score text
var scoreTxt = new Text2('0', {
size: 120,
fill: "#fff"
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
// Coin text
var coinTxt = new Text2('0', {
size: 80,
fill: 0xFFD700
});
coinTxt.anchor.set(0.5, 0);
LK.gui.topRight.addChild(coinTxt);
// Draw road (gray box)
var road = LK.getAsset('road', {
anchorX: 0,
anchorY: 0,
color: 0x444444,
width: roadWidth,
height: 2732
});
road.x = roadLeft;
road.y = 0;
game.addChild(road);
// Draw lane lines (white boxes)
for (var i = 1; i < laneCount; i++) {
var line = LK.getAsset('laneLine' + i, {
anchorX: 0.5,
anchorY: 0,
color: 0xffffff,
width: 16,
height: 2732,
shape: 'box'
});
line.x = roadLeft + laneWidth * i;
line.y = 0;
line.alpha = 0.2;
game.addChild(line);
}
// Create player car
playerCar = new PlayerCar();
playerCar.x = laneCenters[1]; // Start in lane 2
playerCar.y = 2732 - 400;
game.addChild(playerCar);
// Touch/drag controls
function handleMove(x, y, obj) {
if (dragNode) {
// Clamp x to road
var newX = Math.max(roadLeft + playerCar.width / 2, Math.min(roadRight - playerCar.width / 2, x));
dragNode.x = newX;
}
// Crash detection
var crashed = false;
for (var i = 0; i < obstacles.length; i++) {
if (playerCar.intersects(obstacles[i])) {
crashed = true;
break;
}
}
if (!lastCrash && crashed) {
LK.effects.flashScreen(0xff0000, 1000);
LK.showGameOver();
}
lastCrash = crashed;
// Coin collection
for (var i = coins.length - 1; i >= 0; i--) {
if (playerCar.intersects(coins[i])) {
coinScore += 1;
coinTxt.setText(coinScore);
LK.effects.flashObject(coins[i], 0xffd700, 300);
coins[i].destroy();
coins.splice(i, 1);
}
}
}
game.move = handleMove;
game.down = function (x, y, obj) {
// Only allow drag if touch is on player car or below it
if (x >= playerCar.x - playerCar.width / 2 && x <= playerCar.x + playerCar.width / 2 && y >= playerCar.y - playerCar.height / 2 && y <= playerCar.y + playerCar.height / 2) {
dragNode = playerCar;
} else if (y > playerCar.y) {
dragNode = playerCar;
}
handleMove(x, y, obj);
};
game.up = function (x, y, obj) {
dragNode = null;
};
// Main game loop
game.update = function () {
ticksSinceStart += 1;
// Increase speed over time
if (ticksSinceStart % speedIncreaseEvery === 0 && speed < maxSpeed) {
speed += 2;
if (speed > maxSpeed) speed = maxSpeed;
}
// Move obstacles and coins
for (var i = obstacles.length - 1; i >= 0; i--) {
var obs = obstacles[i];
obs.speed = speed;
obs.update();
if (obs.y > 2732 + 200) {
obs.destroy();
obstacles.splice(i, 1);
}
}
for (var i = coins.length - 1; i >= 0; i--) {
var coin = coins[i];
coin.speed = speed;
coin.update();
if (coin.y > 2732 + 100) {
coin.destroy();
coins.splice(i, 1);
}
}
// Spawn obstacles
// Every 45 ticks (~0.75s at 60fps)
if (LK.ticks % 45 === 0) {
// Randomly pick 1-2 lanes to spawn cars
var lanesToUse = [];
var laneIndexes = [0, 1, 2, 3];
// Shuffle
for (var i = laneIndexes.length - 1; i > 0; i--) {
var j = Math.floor(Math.random() * (i + 1));
var t = laneIndexes[i];
laneIndexes[i] = laneIndexes[j];
laneIndexes[j] = t;
}
var carCount = Math.random() < 0.7 ? 1 : 2;
for (var i = 0; i < carCount; i++) {
lanesToUse.push(laneIndexes[i]);
}
for (var i = 0; i < lanesToUse.length; i++) {
var obs = new ObstacleCar();
obs.x = laneCenters[lanesToUse[i]];
obs.y = -200;
obs.speed = speed;
obstacles.push(obs);
game.addChild(obs);
}
}
// Spawn coins
// Every 60 ticks (~1s)
if (LK.ticks % 60 === 0) {
// 50% chance to spawn a coin in a random lane not blocked by a car
if (Math.random() < 0.5) {
// Find lanes without a car near the top
var freeLanes = [];
for (var i = 0; i < laneCount; i++) {
var blocked = false;
for (var j = 0; j < obstacles.length; j++) {
if (Math.abs(obstacles[j].x - laneCenters[i]) < 10 && obstacles[j].y < 200) {
blocked = true;
break;
}
}
if (!blocked) freeLanes.push(i);
}
if (freeLanes.length > 0) {
var laneIdx = freeLanes[Math.floor(Math.random() * freeLanes.length)];
var coin = new Coin();
coin.x = laneCenters[laneIdx];
coin.y = -100;
coin.speed = speed;
coins.push(coin);
game.addChild(coin);
}
}
}
// Update distance and score
distance += speed / 10; // 1 meter = 10px
var score = Math.floor(distance) + coinScore * 10;
scoreTxt.setText(score);
// Coin text (already updated on collect)
};
// Set initial score and coin text
scoreTxt.setText('0');
coinTxt.setText('0'); ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,283 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+
+/****
+* Classes
+****/
+// Coin Class
+var Coin = Container.expand(function () {
+ var self = Container.call(this);
+ // Gold ellipse for coin
+ var coin = self.attachAsset('coin', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ color: 0xffd700,
+ width: 100,
+ height: 100,
+ shape: 'ellipse'
+ });
+ self.width = coin.width;
+ self.height = coin.height;
+ // Speed will be set on spawn
+ self.speed = 10;
+ self.update = function () {
+ self.y += self.speed;
+ };
+ return self;
+});
+// Obstacle Car Class
+var ObstacleCar = Container.expand(function () {
+ var self = Container.call(this);
+ // Random color for variety
+ var colors = [0x1e90ff, 0x32cd32, 0xffa500, 0x8a2be2, 0xff1493, 0x00ced1];
+ var color = colors[Math.floor(Math.random() * colors.length)];
+ var car = self.attachAsset('obstacleCar', {
+ anchorX: 0.5,
+ anchorY: 0.5,
+ color: color,
+ width: 200,
+ height: 300
+ });
+ self.width = car.width;
+ self.height = car.height;
+ // Speed will be set on spawn
+ self.speed = 10;
+ self.update = function () {
+ self.y += self.speed;
+ };
+ return self;
+});
+// Player Car Class
+var PlayerCar = Container.expand(function () {
+ var self = Container.call(this);
+ // Attach car asset (red box)
+ var car = self.attachAsset('playerCar', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ // Set initial size (about 200x300 px)
+ car.width = 200;
+ car.height = 300;
+ // For collision, use self as the hitbox
+ self.width = car.width;
+ self.height = car.height;
+ // No update needed; position is set by drag
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x222222
+});
+
+/****
+* Game Code
+****/
+// Game area: 2048x2732
+// Road boundaries (leave 200px margin on each side)
+var roadLeft = 200;
+var roadRight = 2048 - 200;
+var roadWidth = roadRight - roadLeft;
+// Lane count and positions
+var laneCount = 4;
+var laneWidth = roadWidth / laneCount;
+var laneCenters = [];
+for (var i = 0; i < laneCount; i++) {
+ laneCenters.push(roadLeft + laneWidth * (i + 0.5));
+}
+// Game state variables
+var playerCar;
+var obstacles = [];
+var coins = [];
+var dragNode = null;
+var lastCrash = false;
+var speed = 18; // Initial speed (pixels per frame)
+var minSpeed = 12;
+var maxSpeed = 38;
+var speedIncreaseEvery = 600; // Increase speed every 600 ticks (~10s)
+var ticksSinceStart = 0;
+var distance = 0; // Distance in meters (1 meter = 10px)
+var coinScore = 0;
+// Score text
+var scoreTxt = new Text2('0', {
+ size: 120,
+ fill: "#fff"
+});
+scoreTxt.anchor.set(0.5, 0);
+LK.gui.top.addChild(scoreTxt);
+// Coin text
+var coinTxt = new Text2('0', {
+ size: 80,
+ fill: 0xFFD700
+});
+coinTxt.anchor.set(0.5, 0);
+LK.gui.topRight.addChild(coinTxt);
+// Draw road (gray box)
+var road = LK.getAsset('road', {
+ anchorX: 0,
+ anchorY: 0,
+ color: 0x444444,
+ width: roadWidth,
+ height: 2732
+});
+road.x = roadLeft;
+road.y = 0;
+game.addChild(road);
+// Draw lane lines (white boxes)
+for (var i = 1; i < laneCount; i++) {
+ var line = LK.getAsset('laneLine' + i, {
+ anchorX: 0.5,
+ anchorY: 0,
+ color: 0xffffff,
+ width: 16,
+ height: 2732,
+ shape: 'box'
+ });
+ line.x = roadLeft + laneWidth * i;
+ line.y = 0;
+ line.alpha = 0.2;
+ game.addChild(line);
+}
+// Create player car
+playerCar = new PlayerCar();
+playerCar.x = laneCenters[1]; // Start in lane 2
+playerCar.y = 2732 - 400;
+game.addChild(playerCar);
+// Touch/drag controls
+function handleMove(x, y, obj) {
+ if (dragNode) {
+ // Clamp x to road
+ var newX = Math.max(roadLeft + playerCar.width / 2, Math.min(roadRight - playerCar.width / 2, x));
+ dragNode.x = newX;
+ }
+ // Crash detection
+ var crashed = false;
+ for (var i = 0; i < obstacles.length; i++) {
+ if (playerCar.intersects(obstacles[i])) {
+ crashed = true;
+ break;
+ }
+ }
+ if (!lastCrash && crashed) {
+ LK.effects.flashScreen(0xff0000, 1000);
+ LK.showGameOver();
+ }
+ lastCrash = crashed;
+ // Coin collection
+ for (var i = coins.length - 1; i >= 0; i--) {
+ if (playerCar.intersects(coins[i])) {
+ coinScore += 1;
+ coinTxt.setText(coinScore);
+ LK.effects.flashObject(coins[i], 0xffd700, 300);
+ coins[i].destroy();
+ coins.splice(i, 1);
+ }
+ }
+}
+game.move = handleMove;
+game.down = function (x, y, obj) {
+ // Only allow drag if touch is on player car or below it
+ if (x >= playerCar.x - playerCar.width / 2 && x <= playerCar.x + playerCar.width / 2 && y >= playerCar.y - playerCar.height / 2 && y <= playerCar.y + playerCar.height / 2) {
+ dragNode = playerCar;
+ } else if (y > playerCar.y) {
+ dragNode = playerCar;
+ }
+ handleMove(x, y, obj);
+};
+game.up = function (x, y, obj) {
+ dragNode = null;
+};
+// Main game loop
+game.update = function () {
+ ticksSinceStart += 1;
+ // Increase speed over time
+ if (ticksSinceStart % speedIncreaseEvery === 0 && speed < maxSpeed) {
+ speed += 2;
+ if (speed > maxSpeed) speed = maxSpeed;
+ }
+ // Move obstacles and coins
+ for (var i = obstacles.length - 1; i >= 0; i--) {
+ var obs = obstacles[i];
+ obs.speed = speed;
+ obs.update();
+ if (obs.y > 2732 + 200) {
+ obs.destroy();
+ obstacles.splice(i, 1);
+ }
+ }
+ for (var i = coins.length - 1; i >= 0; i--) {
+ var coin = coins[i];
+ coin.speed = speed;
+ coin.update();
+ if (coin.y > 2732 + 100) {
+ coin.destroy();
+ coins.splice(i, 1);
+ }
+ }
+ // Spawn obstacles
+ // Every 45 ticks (~0.75s at 60fps)
+ if (LK.ticks % 45 === 0) {
+ // Randomly pick 1-2 lanes to spawn cars
+ var lanesToUse = [];
+ var laneIndexes = [0, 1, 2, 3];
+ // Shuffle
+ for (var i = laneIndexes.length - 1; i > 0; i--) {
+ var j = Math.floor(Math.random() * (i + 1));
+ var t = laneIndexes[i];
+ laneIndexes[i] = laneIndexes[j];
+ laneIndexes[j] = t;
+ }
+ var carCount = Math.random() < 0.7 ? 1 : 2;
+ for (var i = 0; i < carCount; i++) {
+ lanesToUse.push(laneIndexes[i]);
+ }
+ for (var i = 0; i < lanesToUse.length; i++) {
+ var obs = new ObstacleCar();
+ obs.x = laneCenters[lanesToUse[i]];
+ obs.y = -200;
+ obs.speed = speed;
+ obstacles.push(obs);
+ game.addChild(obs);
+ }
+ }
+ // Spawn coins
+ // Every 60 ticks (~1s)
+ if (LK.ticks % 60 === 0) {
+ // 50% chance to spawn a coin in a random lane not blocked by a car
+ if (Math.random() < 0.5) {
+ // Find lanes without a car near the top
+ var freeLanes = [];
+ for (var i = 0; i < laneCount; i++) {
+ var blocked = false;
+ for (var j = 0; j < obstacles.length; j++) {
+ if (Math.abs(obstacles[j].x - laneCenters[i]) < 10 && obstacles[j].y < 200) {
+ blocked = true;
+ break;
+ }
+ }
+ if (!blocked) freeLanes.push(i);
+ }
+ if (freeLanes.length > 0) {
+ var laneIdx = freeLanes[Math.floor(Math.random() * freeLanes.length)];
+ var coin = new Coin();
+ coin.x = laneCenters[laneIdx];
+ coin.y = -100;
+ coin.speed = speed;
+ coins.push(coin);
+ game.addChild(coin);
+ }
+ }
+ }
+ // Update distance and score
+ distance += speed / 10; // 1 meter = 10px
+ var score = Math.floor(distance) + coinScore * 10;
+ scoreTxt.setText(score);
+ // Coin text (already updated on collect)
+};
+// Set initial score and coin text
+scoreTxt.setText('0');
+coinTxt.setText('0');
\ No newline at end of file