/**** * 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