/****
* 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 = 0;
self.lane = 0;
self.lastY = self.y;
self.hasBeenDodged = false;
self.update = function () {
self.lastY = self.y;
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.targetLane = 1;
self.currentLane = 1;
self.laneWidth = 2048 / 3;
self.isMoving = false;
self.moveTo = function (lane) {
if (lane !== self.currentLane && !self.isMoving) {
self.targetLane = lane;
self.isMoving = true;
var targetX = self.laneWidth * lane + self.laneWidth / 2;
tween(self, {
x: targetX
}, {
duration: 200,
easing: tween.easeInOut,
onFinish: function onFinish() {
self.currentLane = lane;
self.isMoving = false;
}
});
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x1a1a1a
});
/****
* Game Code
****/
var playerCar = game.addChild(new PlayerCar());
playerCar.x = game.width / 2;
playerCar.y = game.height - 150;
playerCar.currentLane = 1;
var enemyCars = [];
var score = 0;
var baseSpeed = 8;
var currentSpeed = baseSpeed;
var gameActive = true;
var dodgedCount = 0;
var spawnRate = 60;
var framesSinceLastSpawn = 0;
var scoreTxt = new Text2('0', {
size: 120,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
var speedIndicator = new Text2('Speed: 1.0x', {
size: 80,
fill: 0xFF6B35
});
speedIndicator.anchor.set(0.5, 0);
speedIndicator.y = 150;
LK.gui.top.addChild(speedIndicator);
function updateScore(points) {
score += points;
LK.setScore(Math.floor(score / 10));
scoreTxt.setText(LK.getScore().toString());
var speedMultiplier = 1 + LK.getScore() * 0.02;
currentSpeed = baseSpeed * speedMultiplier;
speedIndicator.setText('Speed: ' + speedMultiplier.toFixed(1) + 'x');
if (LK.getScore() >= 500) {
LK.showYouWin();
}
}
function spawnEnemyCar() {
var lane = Math.floor(Math.random() * 3);
var newEnemy = game.addChild(new EnemyCar());
var laneWidth = game.width / 3;
newEnemy.x = laneWidth * lane + laneWidth / 2;
newEnemy.y = -150;
newEnemy.lane = lane;
newEnemy.speed = currentSpeed;
newEnemy.lastY = newEnemy.y;
newEnemy.hasBeenDodged = false;
enemyCars.push(newEnemy);
}
function checkCollision(enemy) {
var playerLaneWidth = playerCar.laneWidth;
var playerLaneX = playerCar.laneWidth * playerCar.currentLane + playerCar.laneWidth / 2;
var enemyLaneX = playerCar.laneWidth * enemy.lane + playerCar.laneWidth / 2;
if (playerLaneX === enemyLaneX && enemy.y >= playerCar.y - 100 && enemy.y <= playerCar.y + 100) {
return true;
}
return false;
}
game.down = function (x, y, obj) {
if (!gameActive) return;
var touchX = x;
var laneWidth = game.width / 3;
if (touchX < laneWidth) {
playerCar.moveTo(0);
} else if (touchX < laneWidth * 2) {
playerCar.moveTo(1);
} else {
playerCar.moveTo(2);
}
};
game.update = function () {
if (!gameActive) return;
updateScore(1);
framesSinceLastSpawn++;
var adjustedSpawnRate = Math.max(20, spawnRate - Math.floor(LK.getScore() / 50));
if (framesSinceLastSpawn >= adjustedSpawnRate) {
spawnEnemyCar();
framesSinceLastSpawn = 0;
}
for (var i = enemyCars.length - 1; i >= 0; i--) {
var enemy = enemyCars[i];
enemy.update();
if (enemy.lastY !== undefined && enemy.lastY < game.height && enemy.y >= game.height) {
if (!enemy.hasBeenDodged) {
enemy.hasBeenDodged = true;
updateScore(100);
LK.getSound('dodge').play();
}
enemy.destroy();
enemyCars.splice(i, 1);
continue;
}
if (checkCollision(enemy)) {
gameActive = false;
LK.effects.flashScreen(0xFF0000, 1000);
LK.getSound('collision').play();
LK.showGameOver();
}
}
};
LK.playMusic('bgmusic', {
loop: true
}); /****
* 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 = 0;
self.lane = 0;
self.lastY = self.y;
self.hasBeenDodged = false;
self.update = function () {
self.lastY = self.y;
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.targetLane = 1;
self.currentLane = 1;
self.laneWidth = 2048 / 3;
self.isMoving = false;
self.moveTo = function (lane) {
if (lane !== self.currentLane && !self.isMoving) {
self.targetLane = lane;
self.isMoving = true;
var targetX = self.laneWidth * lane + self.laneWidth / 2;
tween(self, {
x: targetX
}, {
duration: 200,
easing: tween.easeInOut,
onFinish: function onFinish() {
self.currentLane = lane;
self.isMoving = false;
}
});
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x1a1a1a
});
/****
* Game Code
****/
var playerCar = game.addChild(new PlayerCar());
playerCar.x = game.width / 2;
playerCar.y = game.height - 150;
playerCar.currentLane = 1;
var enemyCars = [];
var score = 0;
var baseSpeed = 8;
var currentSpeed = baseSpeed;
var gameActive = true;
var dodgedCount = 0;
var spawnRate = 60;
var framesSinceLastSpawn = 0;
var scoreTxt = new Text2('0', {
size: 120,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
var speedIndicator = new Text2('Speed: 1.0x', {
size: 80,
fill: 0xFF6B35
});
speedIndicator.anchor.set(0.5, 0);
speedIndicator.y = 150;
LK.gui.top.addChild(speedIndicator);
function updateScore(points) {
score += points;
LK.setScore(Math.floor(score / 10));
scoreTxt.setText(LK.getScore().toString());
var speedMultiplier = 1 + LK.getScore() * 0.02;
currentSpeed = baseSpeed * speedMultiplier;
speedIndicator.setText('Speed: ' + speedMultiplier.toFixed(1) + 'x');
if (LK.getScore() >= 500) {
LK.showYouWin();
}
}
function spawnEnemyCar() {
var lane = Math.floor(Math.random() * 3);
var newEnemy = game.addChild(new EnemyCar());
var laneWidth = game.width / 3;
newEnemy.x = laneWidth * lane + laneWidth / 2;
newEnemy.y = -150;
newEnemy.lane = lane;
newEnemy.speed = currentSpeed;
newEnemy.lastY = newEnemy.y;
newEnemy.hasBeenDodged = false;
enemyCars.push(newEnemy);
}
function checkCollision(enemy) {
var playerLaneWidth = playerCar.laneWidth;
var playerLaneX = playerCar.laneWidth * playerCar.currentLane + playerCar.laneWidth / 2;
var enemyLaneX = playerCar.laneWidth * enemy.lane + playerCar.laneWidth / 2;
if (playerLaneX === enemyLaneX && enemy.y >= playerCar.y - 100 && enemy.y <= playerCar.y + 100) {
return true;
}
return false;
}
game.down = function (x, y, obj) {
if (!gameActive) return;
var touchX = x;
var laneWidth = game.width / 3;
if (touchX < laneWidth) {
playerCar.moveTo(0);
} else if (touchX < laneWidth * 2) {
playerCar.moveTo(1);
} else {
playerCar.moveTo(2);
}
};
game.update = function () {
if (!gameActive) return;
updateScore(1);
framesSinceLastSpawn++;
var adjustedSpawnRate = Math.max(20, spawnRate - Math.floor(LK.getScore() / 50));
if (framesSinceLastSpawn >= adjustedSpawnRate) {
spawnEnemyCar();
framesSinceLastSpawn = 0;
}
for (var i = enemyCars.length - 1; i >= 0; i--) {
var enemy = enemyCars[i];
enemy.update();
if (enemy.lastY !== undefined && enemy.lastY < game.height && enemy.y >= game.height) {
if (!enemy.hasBeenDodged) {
enemy.hasBeenDodged = true;
updateScore(100);
LK.getSound('dodge').play();
}
enemy.destroy();
enemyCars.splice(i, 1);
continue;
}
if (checkCollision(enemy)) {
gameActive = false;
LK.effects.flashScreen(0xFF0000, 1000);
LK.getSound('collision').play();
LK.showGameOver();
}
}
};
LK.playMusic('bgmusic', {
loop: true
});