/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
/****
* Classes
****/
var EnemyCar = Container.expand(function () {
var self = Container.call(this);
var carGraphics = self.attachAsset('enemyCar', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = gameSpeed;
self.update = function () {
self.y += self.speed;
};
return self;
});
var Obstacle = Container.expand(function () {
var self = Container.call(this);
var obstacleGraphics = self.attachAsset('obstacle', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = gameSpeed;
self.update = function () {
self.y += self.speed;
};
return self;
});
var PlayerCar = Container.expand(function () {
var self = Container.call(this);
var carGraphics = self.attachAsset('playerCar', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 0;
self.maxSpeed = 8;
self.invulnerable = false;
self.invulnerabilityTime = 0;
self.update = function () {
if (self.invulnerable) {
self.invulnerabilityTime--;
if (self.invulnerabilityTime <= 0) {
self.invulnerable = false;
carGraphics.alpha = 1;
} else {
carGraphics.alpha = Math.floor(self.invulnerabilityTime / 10) % 2 ? 0.5 : 1;
}
}
};
self.makeInvulnerable = function (duration) {
self.invulnerable = true;
self.invulnerabilityTime = duration;
};
return self;
});
var PowerUp = Container.expand(function () {
var self = Container.call(this);
var powerUpGraphics = self.attachAsset('powerUp', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = gameSpeed;
self.update = function () {
self.y += self.speed;
self.rotation += 0.1;
};
return self;
});
var RoadLine = Container.expand(function () {
var self = Container.call(this);
var lineGraphics = self.attachAsset('roadLine', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = gameSpeed;
self.update = function () {
self.y += self.speed;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x2c3e50
});
/****
* Game Code
****/
// Game variables
var gameSpeed = 6;
var maxGameSpeed = 15;
var speedIncrement = 0.002;
var lanes = [400, 680, 960, 1240, 1520];
var playerCar;
var enemyCars = [];
var obstacles = [];
var powerUps = [];
var roadLines = [];
var dragNode = null;
var distance = 0;
var spawnTimer = 0;
var roadLineTimer = 0;
// UI Elements
var scoreText = new Text2('Score: 0', {
size: 80,
fill: 0xFFFFFF
});
scoreText.anchor.set(0, 0);
scoreText.x = 150;
scoreText.y = 50;
LK.gui.topLeft.addChild(scoreText);
var distanceText = new Text2('Distance: 0m', {
size: 60,
fill: 0xFFFFFF
});
distanceText.anchor.set(1, 0);
distanceText.x = -50;
distanceText.y = 120;
LK.gui.topRight.addChild(distanceText);
// Initialize player car
playerCar = game.addChild(new PlayerCar());
playerCar.x = lanes[2]; // Start in middle lane
playerCar.y = 2400;
// Input handling
function handleMove(x, y, obj) {
if (dragNode) {
var newX = x;
// Clamp to lanes
var closestLane = lanes[0];
var minDistance = Math.abs(newX - lanes[0]);
for (var i = 1; i < lanes.length; i++) {
var distance = Math.abs(newX - lanes[i]);
if (distance < minDistance) {
minDistance = distance;
closestLane = lanes[i];
}
}
// Smooth movement to closest lane
tween(playerCar, {
x: closestLane
}, {
duration: 200,
easing: tween.easeOut
});
}
}
game.move = handleMove;
game.down = function (x, y, obj) {
dragNode = playerCar;
handleMove(x, y, obj);
};
game.up = function (x, y, obj) {
dragNode = null;
};
// Spawn functions
function spawnEnemyCar() {
var lane = lanes[Math.floor(Math.random() * lanes.length)];
var enemyCar = new EnemyCar();
enemyCar.x = lane;
enemyCar.y = -100;
enemyCar.speed = gameSpeed;
enemyCars.push(enemyCar);
game.addChild(enemyCar);
}
function spawnObstacle() {
var lane = lanes[Math.floor(Math.random() * lanes.length)];
var obstacle = new Obstacle();
obstacle.x = lane;
obstacle.y = -100;
obstacle.speed = gameSpeed;
obstacles.push(obstacle);
game.addChild(obstacle);
}
function spawnPowerUp() {
var lane = lanes[Math.floor(Math.random() * lanes.length)];
var powerUp = new PowerUp();
powerUp.x = lane;
powerUp.y = -100;
powerUp.speed = gameSpeed;
powerUps.push(powerUp);
game.addChild(powerUp);
}
function spawnRoadLine() {
for (var i = 0; i < lanes.length - 1; i++) {
var lineX = (lanes[i] + lanes[i + 1]) / 2;
var roadLine = new RoadLine();
roadLine.x = lineX;
roadLine.y = -100;
roadLine.speed = gameSpeed;
roadLines.push(roadLine);
game.addChild(roadLine);
}
}
// Collision detection
function checkCollisions() {
// Check enemy car collisions
for (var i = enemyCars.length - 1; i >= 0; i--) {
var enemy = enemyCars[i];
if (enemy.lastIntersecting === undefined) enemy.lastIntersecting = false;
var currentIntersecting = playerCar.intersects(enemy) && !playerCar.invulnerable;
if (!enemy.lastIntersecting && currentIntersecting) {
LK.getSound('crash').play();
LK.effects.flashScreen(0xff0000, 500);
LK.showGameOver();
return;
}
enemy.lastIntersecting = currentIntersecting;
}
// Check obstacle collisions
for (var i = obstacles.length - 1; i >= 0; i--) {
var obstacle = obstacles[i];
if (obstacle.lastIntersecting === undefined) obstacle.lastIntersecting = false;
var currentIntersecting = playerCar.intersects(obstacle) && !playerCar.invulnerable;
if (!obstacle.lastIntersecting && currentIntersecting) {
LK.getSound('crash').play();
LK.effects.flashScreen(0xff0000, 500);
LK.showGameOver();
return;
}
obstacle.lastIntersecting = currentIntersecting;
}
// Check power-up collection
for (var i = powerUps.length - 1; i >= 0; i--) {
var powerUp = powerUps[i];
if (powerUp.lastIntersecting === undefined) powerUp.lastIntersecting = false;
var currentIntersecting = playerCar.intersects(powerUp);
if (!powerUp.lastIntersecting && currentIntersecting) {
LK.getSound('collect').play();
LK.setScore(LK.getScore() + 100);
playerCar.makeInvulnerable(180); // 3 seconds at 60fps
LK.effects.flashObject(playerCar, 0xf1c40f, 500);
powerUp.destroy();
powerUps.splice(i, 1);
continue;
}
powerUp.lastIntersecting = currentIntersecting;
}
}
// Clean up off-screen objects
function cleanupObjects() {
// Clean enemy cars
for (var i = enemyCars.length - 1; i >= 0; i--) {
var enemy = enemyCars[i];
if (enemy.y > 2800) {
enemy.destroy();
enemyCars.splice(i, 1);
LK.setScore(LK.getScore() + 10);
}
}
// Clean obstacles
for (var i = obstacles.length - 1; i >= 0; i--) {
var obstacle = obstacles[i];
if (obstacle.y > 2800) {
obstacle.destroy();
obstacles.splice(i, 1);
LK.setScore(LK.getScore() + 5);
}
}
// Clean power-ups
for (var i = powerUps.length - 1; i >= 0; i--) {
var powerUp = powerUps[i];
if (powerUp.y > 2800) {
powerUp.destroy();
powerUps.splice(i, 1);
}
}
// Clean road lines
for (var i = roadLines.length - 1; i >= 0; i--) {
var roadLine = roadLines[i];
if (roadLine.y > 2800) {
roadLine.destroy();
roadLines.splice(i, 1);
}
}
}
// Update game speed and difficulty
function updateGameSpeed() {
gameSpeed = Math.min(gameSpeed + speedIncrement, maxGameSpeed);
// Update speed for all moving objects
for (var i = 0; i < enemyCars.length; i++) {
enemyCars[i].speed = gameSpeed;
}
for (var i = 0; i < obstacles.length; i++) {
obstacles[i].speed = gameSpeed;
}
for (var i = 0; i < powerUps.length; i++) {
powerUps[i].speed = gameSpeed;
}
for (var i = 0; i < roadLines.length; i++) {
roadLines[i].speed = gameSpeed;
}
}
// Main game update loop
game.update = function () {
// Update distance
distance += gameSpeed * 0.1;
// Update UI
scoreText.setText('Score: ' + LK.getScore());
distanceText.setText('Distance: ' + Math.floor(distance) + 'm');
// Update game speed
updateGameSpeed();
// Spawn logic
spawnTimer++;
if (spawnTimer >= 60) {
// Spawn every second
var rand = Math.random();
if (rand < 0.5) {
spawnEnemyCar();
} else if (rand < 0.8) {
spawnObstacle();
} else {
spawnPowerUp();
}
spawnTimer = 0;
}
// Road line spawning
roadLineTimer++;
if (roadLineTimer >= 180) {
// Spawn road lines every 3 seconds
spawnRoadLine();
roadLineTimer = 0;
}
// Check collisions
checkCollisions();
// Clean up objects
cleanupObjects();
}; ===================================================================
--- original.js
+++ change.js
@@ -1,6 +1,334 @@
-/****
+/****
+* Plugins
+****/
+var tween = LK.import("@upit/tween.v1");
+
+/****
+* Classes
+****/
+var EnemyCar = Container.expand(function () {
+ var self = Container.call(this);
+ var carGraphics = self.attachAsset('enemyCar', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = gameSpeed;
+ self.update = function () {
+ self.y += self.speed;
+ };
+ return self;
+});
+var Obstacle = Container.expand(function () {
+ var self = Container.call(this);
+ var obstacleGraphics = self.attachAsset('obstacle', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = gameSpeed;
+ self.update = function () {
+ self.y += self.speed;
+ };
+ return self;
+});
+var PlayerCar = Container.expand(function () {
+ var self = Container.call(this);
+ var carGraphics = self.attachAsset('playerCar', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = 0;
+ self.maxSpeed = 8;
+ self.invulnerable = false;
+ self.invulnerabilityTime = 0;
+ self.update = function () {
+ if (self.invulnerable) {
+ self.invulnerabilityTime--;
+ if (self.invulnerabilityTime <= 0) {
+ self.invulnerable = false;
+ carGraphics.alpha = 1;
+ } else {
+ carGraphics.alpha = Math.floor(self.invulnerabilityTime / 10) % 2 ? 0.5 : 1;
+ }
+ }
+ };
+ self.makeInvulnerable = function (duration) {
+ self.invulnerable = true;
+ self.invulnerabilityTime = duration;
+ };
+ return self;
+});
+var PowerUp = Container.expand(function () {
+ var self = Container.call(this);
+ var powerUpGraphics = self.attachAsset('powerUp', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = gameSpeed;
+ self.update = function () {
+ self.y += self.speed;
+ self.rotation += 0.1;
+ };
+ return self;
+});
+var RoadLine = Container.expand(function () {
+ var self = Container.call(this);
+ var lineGraphics = self.attachAsset('roadLine', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ self.speed = gameSpeed;
+ self.update = function () {
+ self.y += self.speed;
+ };
+ return self;
+});
+
+/****
* Initialize Game
-****/
+****/
var game = new LK.Game({
- backgroundColor: 0x000000
-});
\ No newline at end of file
+ backgroundColor: 0x2c3e50
+});
+
+/****
+* Game Code
+****/
+// Game variables
+var gameSpeed = 6;
+var maxGameSpeed = 15;
+var speedIncrement = 0.002;
+var lanes = [400, 680, 960, 1240, 1520];
+var playerCar;
+var enemyCars = [];
+var obstacles = [];
+var powerUps = [];
+var roadLines = [];
+var dragNode = null;
+var distance = 0;
+var spawnTimer = 0;
+var roadLineTimer = 0;
+// UI Elements
+var scoreText = new Text2('Score: 0', {
+ size: 80,
+ fill: 0xFFFFFF
+});
+scoreText.anchor.set(0, 0);
+scoreText.x = 150;
+scoreText.y = 50;
+LK.gui.topLeft.addChild(scoreText);
+var distanceText = new Text2('Distance: 0m', {
+ size: 60,
+ fill: 0xFFFFFF
+});
+distanceText.anchor.set(1, 0);
+distanceText.x = -50;
+distanceText.y = 120;
+LK.gui.topRight.addChild(distanceText);
+// Initialize player car
+playerCar = game.addChild(new PlayerCar());
+playerCar.x = lanes[2]; // Start in middle lane
+playerCar.y = 2400;
+// Input handling
+function handleMove(x, y, obj) {
+ if (dragNode) {
+ var newX = x;
+ // Clamp to lanes
+ var closestLane = lanes[0];
+ var minDistance = Math.abs(newX - lanes[0]);
+ for (var i = 1; i < lanes.length; i++) {
+ var distance = Math.abs(newX - lanes[i]);
+ if (distance < minDistance) {
+ minDistance = distance;
+ closestLane = lanes[i];
+ }
+ }
+ // Smooth movement to closest lane
+ tween(playerCar, {
+ x: closestLane
+ }, {
+ duration: 200,
+ easing: tween.easeOut
+ });
+ }
+}
+game.move = handleMove;
+game.down = function (x, y, obj) {
+ dragNode = playerCar;
+ handleMove(x, y, obj);
+};
+game.up = function (x, y, obj) {
+ dragNode = null;
+};
+// Spawn functions
+function spawnEnemyCar() {
+ var lane = lanes[Math.floor(Math.random() * lanes.length)];
+ var enemyCar = new EnemyCar();
+ enemyCar.x = lane;
+ enemyCar.y = -100;
+ enemyCar.speed = gameSpeed;
+ enemyCars.push(enemyCar);
+ game.addChild(enemyCar);
+}
+function spawnObstacle() {
+ var lane = lanes[Math.floor(Math.random() * lanes.length)];
+ var obstacle = new Obstacle();
+ obstacle.x = lane;
+ obstacle.y = -100;
+ obstacle.speed = gameSpeed;
+ obstacles.push(obstacle);
+ game.addChild(obstacle);
+}
+function spawnPowerUp() {
+ var lane = lanes[Math.floor(Math.random() * lanes.length)];
+ var powerUp = new PowerUp();
+ powerUp.x = lane;
+ powerUp.y = -100;
+ powerUp.speed = gameSpeed;
+ powerUps.push(powerUp);
+ game.addChild(powerUp);
+}
+function spawnRoadLine() {
+ for (var i = 0; i < lanes.length - 1; i++) {
+ var lineX = (lanes[i] + lanes[i + 1]) / 2;
+ var roadLine = new RoadLine();
+ roadLine.x = lineX;
+ roadLine.y = -100;
+ roadLine.speed = gameSpeed;
+ roadLines.push(roadLine);
+ game.addChild(roadLine);
+ }
+}
+// Collision detection
+function checkCollisions() {
+ // Check enemy car collisions
+ for (var i = enemyCars.length - 1; i >= 0; i--) {
+ var enemy = enemyCars[i];
+ if (enemy.lastIntersecting === undefined) enemy.lastIntersecting = false;
+ var currentIntersecting = playerCar.intersects(enemy) && !playerCar.invulnerable;
+ if (!enemy.lastIntersecting && currentIntersecting) {
+ LK.getSound('crash').play();
+ LK.effects.flashScreen(0xff0000, 500);
+ LK.showGameOver();
+ return;
+ }
+ enemy.lastIntersecting = currentIntersecting;
+ }
+ // Check obstacle collisions
+ for (var i = obstacles.length - 1; i >= 0; i--) {
+ var obstacle = obstacles[i];
+ if (obstacle.lastIntersecting === undefined) obstacle.lastIntersecting = false;
+ var currentIntersecting = playerCar.intersects(obstacle) && !playerCar.invulnerable;
+ if (!obstacle.lastIntersecting && currentIntersecting) {
+ LK.getSound('crash').play();
+ LK.effects.flashScreen(0xff0000, 500);
+ LK.showGameOver();
+ return;
+ }
+ obstacle.lastIntersecting = currentIntersecting;
+ }
+ // Check power-up collection
+ for (var i = powerUps.length - 1; i >= 0; i--) {
+ var powerUp = powerUps[i];
+ if (powerUp.lastIntersecting === undefined) powerUp.lastIntersecting = false;
+ var currentIntersecting = playerCar.intersects(powerUp);
+ if (!powerUp.lastIntersecting && currentIntersecting) {
+ LK.getSound('collect').play();
+ LK.setScore(LK.getScore() + 100);
+ playerCar.makeInvulnerable(180); // 3 seconds at 60fps
+ LK.effects.flashObject(playerCar, 0xf1c40f, 500);
+ powerUp.destroy();
+ powerUps.splice(i, 1);
+ continue;
+ }
+ powerUp.lastIntersecting = currentIntersecting;
+ }
+}
+// Clean up off-screen objects
+function cleanupObjects() {
+ // Clean enemy cars
+ for (var i = enemyCars.length - 1; i >= 0; i--) {
+ var enemy = enemyCars[i];
+ if (enemy.y > 2800) {
+ enemy.destroy();
+ enemyCars.splice(i, 1);
+ LK.setScore(LK.getScore() + 10);
+ }
+ }
+ // Clean obstacles
+ for (var i = obstacles.length - 1; i >= 0; i--) {
+ var obstacle = obstacles[i];
+ if (obstacle.y > 2800) {
+ obstacle.destroy();
+ obstacles.splice(i, 1);
+ LK.setScore(LK.getScore() + 5);
+ }
+ }
+ // Clean power-ups
+ for (var i = powerUps.length - 1; i >= 0; i--) {
+ var powerUp = powerUps[i];
+ if (powerUp.y > 2800) {
+ powerUp.destroy();
+ powerUps.splice(i, 1);
+ }
+ }
+ // Clean road lines
+ for (var i = roadLines.length - 1; i >= 0; i--) {
+ var roadLine = roadLines[i];
+ if (roadLine.y > 2800) {
+ roadLine.destroy();
+ roadLines.splice(i, 1);
+ }
+ }
+}
+// Update game speed and difficulty
+function updateGameSpeed() {
+ gameSpeed = Math.min(gameSpeed + speedIncrement, maxGameSpeed);
+ // Update speed for all moving objects
+ for (var i = 0; i < enemyCars.length; i++) {
+ enemyCars[i].speed = gameSpeed;
+ }
+ for (var i = 0; i < obstacles.length; i++) {
+ obstacles[i].speed = gameSpeed;
+ }
+ for (var i = 0; i < powerUps.length; i++) {
+ powerUps[i].speed = gameSpeed;
+ }
+ for (var i = 0; i < roadLines.length; i++) {
+ roadLines[i].speed = gameSpeed;
+ }
+}
+// Main game update loop
+game.update = function () {
+ // Update distance
+ distance += gameSpeed * 0.1;
+ // Update UI
+ scoreText.setText('Score: ' + LK.getScore());
+ distanceText.setText('Distance: ' + Math.floor(distance) + 'm');
+ // Update game speed
+ updateGameSpeed();
+ // Spawn logic
+ spawnTimer++;
+ if (spawnTimer >= 60) {
+ // Spawn every second
+ var rand = Math.random();
+ if (rand < 0.5) {
+ spawnEnemyCar();
+ } else if (rand < 0.8) {
+ spawnObstacle();
+ } else {
+ spawnPowerUp();
+ }
+ spawnTimer = 0;
+ }
+ // Road line spawning
+ roadLineTimer++;
+ if (roadLineTimer >= 180) {
+ // Spawn road lines every 3 seconds
+ spawnRoadLine();
+ roadLineTimer = 0;
+ }
+ // Check collisions
+ checkCollisions();
+ // Clean up objects
+ cleanupObjects();
+};
\ No newline at end of file