/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1", {
highScore: 0,
leaderboard: []
});
/****
* Classes
****/
var Car = Container.expand(function () {
var self = Container.call(this);
var carGraphics = self.attachAsset('car', {
anchorX: 0.5,
anchorY: 0.5
});
self.targetX = 1024;
self.speed = 3;
self.hasShield = false;
self.isInvincible = false;
self.shieldTimer = 0;
self.invincibleTimer = 0;
self.update = function () {
if (self.x < self.targetX - 2) {
self.x += self.speed + 5;
} else if (self.x > self.targetX + 2) {
self.x -= self.speed + 5;
}
if (self.hasShield) {
self.shieldTimer--;
if (self.shieldTimer <= 0) {
self.hasShield = false;
carGraphics.tint = 0xffffff;
}
}
if (self.isInvincible) {
self.invincibleTimer--;
carGraphics.alpha = 0.6 + Math.sin(LK.ticks * 0.1) * 0.4;
if (self.invincibleTimer <= 0) {
self.isInvincible = false;
carGraphics.alpha = 1;
}
}
};
return self;
});
var EnemyCar = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('opponentCar', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = -8;
self.carColor = 0xffffff;
self.update = function () {
self.y += self.speed;
};
enemyGraphics.tint = self.carColor;
return self;
});
var Invincibility = Container.expand(function () {
var self = Container.call(this);
var invincibilityGraphics = self.attachAsset('invincibility', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 6;
self.update = function () {
self.y += self.speed;
self.alpha = 0.7 + Math.sin(LK.ticks * 0.05) * 0.3;
};
return self;
});
var Shield = Container.expand(function () {
var self = Container.call(this);
var shieldGraphics = self.attachAsset('shield', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 6;
self.rotation = 0;
self.update = function () {
self.y += self.speed;
self.rotation -= 0.05;
};
return self;
});
var SpeedBoost = Container.expand(function () {
var self = Container.call(this);
var boostGraphics = self.attachAsset('speedBoost', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 6;
self.rotation = 0;
self.update = function () {
self.y += self.speed;
self.rotation += 0.05;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000000
});
/****
* Game Code
****/
var startScreenActive = true;
var startScreen = new Container();
var asphalt = LK.getAsset('asphalt', {
anchorX: 0.5,
anchorY: 0.5
});
game.addChildAt(asphalt, 0);
asphalt.x = 1024;
asphalt.y = 1366;
var titleText = new Text2('SPEED RACER', {
size: 200,
fill: '#ffffff'
});
titleText.anchor.set(0.5, 0.5);
titleText.x = 1024;
titleText.y = 300;
startScreen.addChild(titleText);
var instructionText = new Text2('Tap to start\nTap and drag to control your car\nDodge obstacles and collect powerups', {
size: 80,
fill: '#ffffff'
});
instructionText.anchor.set(0.5, 0.5);
instructionText.x = 1024;
instructionText.y = 1200;
startScreen.addChild(instructionText);
var highScoreTxt = new Text2('High Score: ' + storage.highScore, {
size: 100,
fill: '#ffff00'
});
highScoreTxt.anchor.set(0.5, 0.5);
highScoreTxt.x = 1024;
highScoreTxt.y = 1500;
startScreen.addChild(highScoreTxt);
var leaderboardText = '';
if (storage.leaderboard && storage.leaderboard.length > 0) {
leaderboardText = 'LEADERBOARD\n';
for (var lb = 0; lb < Math.min(5, storage.leaderboard.length); lb++) {
leaderboardText += lb + 1 + '. ' + storage.leaderboard[lb] + '\n';
}
} else {
leaderboardText = 'LEADERBOARD\nNo scores yet';
}
var leaderboardTxt = new Text2(leaderboardText, {
size: 60,
//{1j_lb}
fill: '#00ff00'
}); //{1j_lb2}
leaderboardTxt.anchor.set(0.5, 0.5);
leaderboardTxt.x = 1024;
leaderboardTxt.y = 1850;
leaderboardTxt.visible = false;
startScreen.addChild(leaderboardTxt);
var leaderboardButtonTxt = new Text2('Leaderboard', {
size: 80,
fill: '#ffff00'
});
leaderboardButtonTxt.anchor.set(0.5, 0.5);
leaderboardButtonTxt.x = 1024;
leaderboardButtonTxt.y = 1850;
startScreen.addChild(leaderboardButtonTxt);
var leaderboardVisible = false;
var leaderboardButton = new Container();
leaderboardButton.addChild(leaderboardButtonTxt);
var leaderboardButtonBg = LK.getAsset('finishLine', {
anchorX: 0.5,
anchorY: 0.5
});
leaderboardButton.addChildAt(leaderboardButtonBg, 0);
leaderboardButton.x = 1024;
leaderboardButton.y = 1850;
leaderboardButton.down = function (x, y, obj) {
leaderboardVisible = !leaderboardVisible;
leaderboardTxt.visible = leaderboardVisible;
leaderboardButtonTxt.visible = !leaderboardVisible;
};
startScreen.addChild(leaderboardButton);
game.addChild(startScreen);
var car = game.addChild(new Car());
car.x = 1024;
car.y = 2400;
var obstacles = [];
var powerups = [];
var score = 0;
var distanceTraveled = 0;
var gameSpeed = 8;
var baseSpeed = 8;
var maxSpeed = 15;
var speedIncreaseRate = 0.002;
var spawnRate = 60;
gameSpeed = baseSpeed;
var obstacleSpawnCounter = 0;
var powerupSpawnCounter = 0;
var hasShield = false;
var isInvincible = false;
var dragNode = null;
var scoreTxt = new Text2('Score: 0', {
size: 100,
fill: '#ffffff'
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
var distanceTxt = new Text2('Distance: 0', {
size: 80,
fill: '#ffffff'
});
distanceTxt.anchor.set(0.5, 0);
distanceTxt.y = 100;
LK.gui.top.addChild(distanceTxt);
var speedTxt = new Text2('Speed: 1.0x', {
size: 80,
fill: '#ffffff'
});
speedTxt.anchor.set(0.5, 0);
speedTxt.y = 180;
LK.gui.top.addChild(speedTxt);
var brakeTxt = new Text2('BRAKE', {
size: 100,
fill: '#ff0000'
});
brakeTxt.anchor.set(0.5, 0.5);
brakeTxt.x = 1024;
brakeTxt.y = 2600;
LK.gui.addChild(brakeTxt);
var isBraking = false;
var brakeZoneLeft = 0;
var brakeZoneRight = 300;
var brakeZoneTop = 2400;
var brakeZoneBottom = 2732;
function showFinishScreen() {
finishScreenActive = true;
finishScreen = new Container();
var finishBg = LK.getAsset('asphalt', {
anchorX: 0.5,
anchorY: 0.5
});
finishScreen.addChildAt(finishBg, 0);
finishBg.x = 1024;
finishBg.y = 1366;
var finishTitleText = new Text2('RACE FINISHED', {
size: 200,
fill: '#ffff00'
});
finishTitleText.anchor.set(0.5, 0.5);
finishTitleText.x = 1024;
finishTitleText.y = 400;
finishScreen.addChild(finishTitleText);
var finalScoreTxt = new Text2('Final Score: ' + score, {
size: 150,
fill: '#ffffff'
});
finalScoreTxt.anchor.set(0.5, 0.5);
finalScoreTxt.x = 1024;
finalScoreTxt.y = 700;
finishScreen.addChild(finalScoreTxt);
var distanceResultTxt = new Text2('Distance: ' + Math.floor(distanceTraveled / 10) + ' units', {
size: 120,
fill: '#00ff00'
});
distanceResultTxt.anchor.set(0.5, 0.5);
distanceResultTxt.x = 1024;
distanceResultTxt.y = 950;
finishScreen.addChild(distanceResultTxt);
var speedResultTxt = new Text2('Max Speed: ' + (gameSpeed / baseSpeed).toFixed(1) + 'x', {
size: 120,
fill: '#00ffff'
});
speedResultTxt.anchor.set(0.5, 0.5);
speedResultTxt.x = 1024;
speedResultTxt.y = 1150;
finishScreen.addChild(speedResultTxt);
var tapToContinueTxt = new Text2('Tap to continue', {
size: 100,
fill: '#ffffff'
});
tapToContinueTxt.anchor.set(0.5, 0.5);
tapToContinueTxt.x = 1024;
tapToContinueTxt.y = 1500;
finishScreen.addChild(tapToContinueTxt);
game.addChild(finishScreen);
}
function spawnObstacle() {
var newEnemyCar = new EnemyCar();
var randomLane = Math.floor(Math.random() * 3);
newEnemyCar.x = 400 + randomLane * 400;
newEnemyCar.y = -100;
newEnemyCar.speed = gameSpeed;
var carColors = [0xff0000, 0x00ffff, 0xffff00, 0xff00ff, 0x00ff00, 0xff8800];
newEnemyCar.carColor = carColors[Math.floor(Math.random() * carColors.length)];
newEnemyCar.children[0].tint = newEnemyCar.carColor;
obstacles.push(newEnemyCar);
game.addChild(newEnemyCar);
}
function spawnPowerup() {
var powerupType = Math.floor(Math.random() * 3);
var newPowerup;
var randomLane = Math.floor(Math.random() * 3);
var randomX = 400 + randomLane * 400;
if (powerupType === 0) {
newPowerup = new SpeedBoost();
} else if (powerupType === 1) {
newPowerup = new Shield();
} else {
newPowerup = new Invincibility();
}
newPowerup.x = randomX;
newPowerup.y = -100;
newPowerup.speed = gameSpeed;
newPowerup.powerupType = powerupType;
powerups.push(newPowerup);
game.addChild(newPowerup);
}
function handleMove(x, y, obj) {
if (dragNode) {
if (x >= 0 && x <= 300) {
dragNode.targetX = Math.max(300, dragNode.targetX - 15);
dragNode.children[0].rotation = -0.15;
} else if (x >= 1748 && x <= 2048) {
dragNode.targetX = Math.min(1748, dragNode.targetX + 15);
dragNode.children[0].rotation = 0.15;
} else if (x > 300 && x < 1748) {
dragNode.targetX = Math.max(300, Math.min(1748, x));
dragNode.children[0].rotation = dragNode.children[0].rotation * 0.8;
}
}
if (x >= brakeZoneLeft && x <= brakeZoneRight && y >= brakeZoneTop && y <= brakeZoneBottom) {
isBraking = true;
} else {
isBraking = false;
}
}
game.move = handleMove;
game.down = function (x, y, obj) {
if (startScreenActive) {
startScreenActive = false;
startScreen.destroy();
return;
}
dragNode = car;
handleMove(x, y, obj);
};
var finishScreenActive = false;
var finishScreen = null;
game.up = function (x, y, obj) {
dragNode = null;
if (finishScreenActive) {
//{1Q_new}
finishScreenActive = false;
finishScreen.destroy();
LK.showGameOver();
return;
}
};
game.update = function () {
if (startScreenActive) {
return;
}
if (finishScreenActive) {
return;
}
if (isBraking) {
gameSpeed = Math.max(baseSpeed, gameSpeed - 0.5);
} else {
distanceTraveled += gameSpeed;
gameSpeed = Math.min(maxSpeed, baseSpeed + distanceTraveled * speedIncreaseRate);
}
for (var i = obstacles.length - 1; i >= 0; i--) {
var obstacle = obstacles[i];
if (obstacle.lastY === undefined) obstacle.lastY = obstacle.y;
obstacle.speed = gameSpeed;
obstacle.update();
if (obstacle.lastY >= -50 && obstacle.y < -50) {
obstacle.destroy();
obstacles.splice(i, 1);
continue;
}
if (obstacle.lastY <= 2800 && obstacle.y > 2800) {
obstacle.destroy();
obstacles.splice(i, 1);
score += 10;
continue;
}
var isColliding = obstacle.intersects(car);
if (isColliding && !car.isInvincible) {
if (car.hasShield) {
car.hasShield = false;
car.shieldTimer = 0;
carGraphics = car.children[0];
carGraphics.tint = 0xffffff;
obstacle.destroy();
obstacles.splice(i, 1);
LK.getSound('collision').play();
continue;
} else {
LK.effects.flashScreen(0xff0000, 500);
LK.getSound('collision').play();
showFinishScreen();
}
}
obstacle.lastY = obstacle.y;
}
for (var j = powerups.length - 1; j >= 0; j--) {
var powerup = powerups[j];
if (powerup.lastY === undefined) powerup.lastY = powerup.y;
powerup.speed = gameSpeed;
if (powerup.lastY >= -50 && powerup.y < -50) {
powerup.destroy();
powerups.splice(j, 1);
continue;
}
if (powerup.lastY <= 2800 && powerup.y > 2800) {
powerup.destroy();
powerups.splice(j, 1);
continue;
}
var isPowerupColliding = powerup.intersects(car);
if (isPowerupColliding) {
LK.getSound('powerup').play();
if (powerup.powerupType === 0) {
LK.getSound('boost').play();
gameSpeed = Math.min(maxSpeed, gameSpeed + 3);
score += 50;
} else if (powerup.powerupType === 1) {
car.hasShield = true;
car.shieldTimer = 300;
var carGraphics = car.children[0];
carGraphics.tint = 0x00ff00;
score += 30;
} else if (powerup.powerupType === 2) {
car.isInvincible = true;
car.invincibleTimer = 240;
score += 40;
}
powerup.destroy();
powerups.splice(j, 1);
}
powerup.lastY = powerup.y;
}
obstacleSpawnCounter++;
if (obstacleSpawnCounter >= Math.max(30, spawnRate - Math.floor(distanceTraveled / 10000))) {
spawnObstacle();
obstacleSpawnCounter = 0;
}
powerupSpawnCounter++;
if (powerupSpawnCounter >= 200) {
spawnPowerup();
powerupSpawnCounter = 0;
}
scoreTxt.setText('Score: ' + score);
distanceTxt.setText('Distance: ' + Math.floor(distanceTraveled / 10));
var speedMultiplier = (gameSpeed / baseSpeed).toFixed(1);
speedTxt.setText('Speed: ' + speedMultiplier + 'x');
if (score > storage.highScore) {
storage.highScore = score;
}
if (!storage.leaderboard) {
storage.leaderboard = [];
}
storage.leaderboard.push(score);
storage.leaderboard.sort(function (a, b) {
return b - a;
});
if (storage.leaderboard.length > 10) {
storage.leaderboard = storage.leaderboard.slice(0, 10);
}
};
LK.playMusic('racingMusic', {
loop: true,
volume: 0.7
}); /****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1", {
highScore: 0,
leaderboard: []
});
/****
* Classes
****/
var Car = Container.expand(function () {
var self = Container.call(this);
var carGraphics = self.attachAsset('car', {
anchorX: 0.5,
anchorY: 0.5
});
self.targetX = 1024;
self.speed = 3;
self.hasShield = false;
self.isInvincible = false;
self.shieldTimer = 0;
self.invincibleTimer = 0;
self.update = function () {
if (self.x < self.targetX - 2) {
self.x += self.speed + 5;
} else if (self.x > self.targetX + 2) {
self.x -= self.speed + 5;
}
if (self.hasShield) {
self.shieldTimer--;
if (self.shieldTimer <= 0) {
self.hasShield = false;
carGraphics.tint = 0xffffff;
}
}
if (self.isInvincible) {
self.invincibleTimer--;
carGraphics.alpha = 0.6 + Math.sin(LK.ticks * 0.1) * 0.4;
if (self.invincibleTimer <= 0) {
self.isInvincible = false;
carGraphics.alpha = 1;
}
}
};
return self;
});
var EnemyCar = Container.expand(function () {
var self = Container.call(this);
var enemyGraphics = self.attachAsset('opponentCar', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = -8;
self.carColor = 0xffffff;
self.update = function () {
self.y += self.speed;
};
enemyGraphics.tint = self.carColor;
return self;
});
var Invincibility = Container.expand(function () {
var self = Container.call(this);
var invincibilityGraphics = self.attachAsset('invincibility', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 6;
self.update = function () {
self.y += self.speed;
self.alpha = 0.7 + Math.sin(LK.ticks * 0.05) * 0.3;
};
return self;
});
var Shield = Container.expand(function () {
var self = Container.call(this);
var shieldGraphics = self.attachAsset('shield', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 6;
self.rotation = 0;
self.update = function () {
self.y += self.speed;
self.rotation -= 0.05;
};
return self;
});
var SpeedBoost = Container.expand(function () {
var self = Container.call(this);
var boostGraphics = self.attachAsset('speedBoost', {
anchorX: 0.5,
anchorY: 0.5
});
self.speed = 6;
self.rotation = 0;
self.update = function () {
self.y += self.speed;
self.rotation += 0.05;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000000
});
/****
* Game Code
****/
var startScreenActive = true;
var startScreen = new Container();
var asphalt = LK.getAsset('asphalt', {
anchorX: 0.5,
anchorY: 0.5
});
game.addChildAt(asphalt, 0);
asphalt.x = 1024;
asphalt.y = 1366;
var titleText = new Text2('SPEED RACER', {
size: 200,
fill: '#ffffff'
});
titleText.anchor.set(0.5, 0.5);
titleText.x = 1024;
titleText.y = 300;
startScreen.addChild(titleText);
var instructionText = new Text2('Tap to start\nTap and drag to control your car\nDodge obstacles and collect powerups', {
size: 80,
fill: '#ffffff'
});
instructionText.anchor.set(0.5, 0.5);
instructionText.x = 1024;
instructionText.y = 1200;
startScreen.addChild(instructionText);
var highScoreTxt = new Text2('High Score: ' + storage.highScore, {
size: 100,
fill: '#ffff00'
});
highScoreTxt.anchor.set(0.5, 0.5);
highScoreTxt.x = 1024;
highScoreTxt.y = 1500;
startScreen.addChild(highScoreTxt);
var leaderboardText = '';
if (storage.leaderboard && storage.leaderboard.length > 0) {
leaderboardText = 'LEADERBOARD\n';
for (var lb = 0; lb < Math.min(5, storage.leaderboard.length); lb++) {
leaderboardText += lb + 1 + '. ' + storage.leaderboard[lb] + '\n';
}
} else {
leaderboardText = 'LEADERBOARD\nNo scores yet';
}
var leaderboardTxt = new Text2(leaderboardText, {
size: 60,
//{1j_lb}
fill: '#00ff00'
}); //{1j_lb2}
leaderboardTxt.anchor.set(0.5, 0.5);
leaderboardTxt.x = 1024;
leaderboardTxt.y = 1850;
leaderboardTxt.visible = false;
startScreen.addChild(leaderboardTxt);
var leaderboardButtonTxt = new Text2('Leaderboard', {
size: 80,
fill: '#ffff00'
});
leaderboardButtonTxt.anchor.set(0.5, 0.5);
leaderboardButtonTxt.x = 1024;
leaderboardButtonTxt.y = 1850;
startScreen.addChild(leaderboardButtonTxt);
var leaderboardVisible = false;
var leaderboardButton = new Container();
leaderboardButton.addChild(leaderboardButtonTxt);
var leaderboardButtonBg = LK.getAsset('finishLine', {
anchorX: 0.5,
anchorY: 0.5
});
leaderboardButton.addChildAt(leaderboardButtonBg, 0);
leaderboardButton.x = 1024;
leaderboardButton.y = 1850;
leaderboardButton.down = function (x, y, obj) {
leaderboardVisible = !leaderboardVisible;
leaderboardTxt.visible = leaderboardVisible;
leaderboardButtonTxt.visible = !leaderboardVisible;
};
startScreen.addChild(leaderboardButton);
game.addChild(startScreen);
var car = game.addChild(new Car());
car.x = 1024;
car.y = 2400;
var obstacles = [];
var powerups = [];
var score = 0;
var distanceTraveled = 0;
var gameSpeed = 8;
var baseSpeed = 8;
var maxSpeed = 15;
var speedIncreaseRate = 0.002;
var spawnRate = 60;
gameSpeed = baseSpeed;
var obstacleSpawnCounter = 0;
var powerupSpawnCounter = 0;
var hasShield = false;
var isInvincible = false;
var dragNode = null;
var scoreTxt = new Text2('Score: 0', {
size: 100,
fill: '#ffffff'
});
scoreTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(scoreTxt);
var distanceTxt = new Text2('Distance: 0', {
size: 80,
fill: '#ffffff'
});
distanceTxt.anchor.set(0.5, 0);
distanceTxt.y = 100;
LK.gui.top.addChild(distanceTxt);
var speedTxt = new Text2('Speed: 1.0x', {
size: 80,
fill: '#ffffff'
});
speedTxt.anchor.set(0.5, 0);
speedTxt.y = 180;
LK.gui.top.addChild(speedTxt);
var brakeTxt = new Text2('BRAKE', {
size: 100,
fill: '#ff0000'
});
brakeTxt.anchor.set(0.5, 0.5);
brakeTxt.x = 1024;
brakeTxt.y = 2600;
LK.gui.addChild(brakeTxt);
var isBraking = false;
var brakeZoneLeft = 0;
var brakeZoneRight = 300;
var brakeZoneTop = 2400;
var brakeZoneBottom = 2732;
function showFinishScreen() {
finishScreenActive = true;
finishScreen = new Container();
var finishBg = LK.getAsset('asphalt', {
anchorX: 0.5,
anchorY: 0.5
});
finishScreen.addChildAt(finishBg, 0);
finishBg.x = 1024;
finishBg.y = 1366;
var finishTitleText = new Text2('RACE FINISHED', {
size: 200,
fill: '#ffff00'
});
finishTitleText.anchor.set(0.5, 0.5);
finishTitleText.x = 1024;
finishTitleText.y = 400;
finishScreen.addChild(finishTitleText);
var finalScoreTxt = new Text2('Final Score: ' + score, {
size: 150,
fill: '#ffffff'
});
finalScoreTxt.anchor.set(0.5, 0.5);
finalScoreTxt.x = 1024;
finalScoreTxt.y = 700;
finishScreen.addChild(finalScoreTxt);
var distanceResultTxt = new Text2('Distance: ' + Math.floor(distanceTraveled / 10) + ' units', {
size: 120,
fill: '#00ff00'
});
distanceResultTxt.anchor.set(0.5, 0.5);
distanceResultTxt.x = 1024;
distanceResultTxt.y = 950;
finishScreen.addChild(distanceResultTxt);
var speedResultTxt = new Text2('Max Speed: ' + (gameSpeed / baseSpeed).toFixed(1) + 'x', {
size: 120,
fill: '#00ffff'
});
speedResultTxt.anchor.set(0.5, 0.5);
speedResultTxt.x = 1024;
speedResultTxt.y = 1150;
finishScreen.addChild(speedResultTxt);
var tapToContinueTxt = new Text2('Tap to continue', {
size: 100,
fill: '#ffffff'
});
tapToContinueTxt.anchor.set(0.5, 0.5);
tapToContinueTxt.x = 1024;
tapToContinueTxt.y = 1500;
finishScreen.addChild(tapToContinueTxt);
game.addChild(finishScreen);
}
function spawnObstacle() {
var newEnemyCar = new EnemyCar();
var randomLane = Math.floor(Math.random() * 3);
newEnemyCar.x = 400 + randomLane * 400;
newEnemyCar.y = -100;
newEnemyCar.speed = gameSpeed;
var carColors = [0xff0000, 0x00ffff, 0xffff00, 0xff00ff, 0x00ff00, 0xff8800];
newEnemyCar.carColor = carColors[Math.floor(Math.random() * carColors.length)];
newEnemyCar.children[0].tint = newEnemyCar.carColor;
obstacles.push(newEnemyCar);
game.addChild(newEnemyCar);
}
function spawnPowerup() {
var powerupType = Math.floor(Math.random() * 3);
var newPowerup;
var randomLane = Math.floor(Math.random() * 3);
var randomX = 400 + randomLane * 400;
if (powerupType === 0) {
newPowerup = new SpeedBoost();
} else if (powerupType === 1) {
newPowerup = new Shield();
} else {
newPowerup = new Invincibility();
}
newPowerup.x = randomX;
newPowerup.y = -100;
newPowerup.speed = gameSpeed;
newPowerup.powerupType = powerupType;
powerups.push(newPowerup);
game.addChild(newPowerup);
}
function handleMove(x, y, obj) {
if (dragNode) {
if (x >= 0 && x <= 300) {
dragNode.targetX = Math.max(300, dragNode.targetX - 15);
dragNode.children[0].rotation = -0.15;
} else if (x >= 1748 && x <= 2048) {
dragNode.targetX = Math.min(1748, dragNode.targetX + 15);
dragNode.children[0].rotation = 0.15;
} else if (x > 300 && x < 1748) {
dragNode.targetX = Math.max(300, Math.min(1748, x));
dragNode.children[0].rotation = dragNode.children[0].rotation * 0.8;
}
}
if (x >= brakeZoneLeft && x <= brakeZoneRight && y >= brakeZoneTop && y <= brakeZoneBottom) {
isBraking = true;
} else {
isBraking = false;
}
}
game.move = handleMove;
game.down = function (x, y, obj) {
if (startScreenActive) {
startScreenActive = false;
startScreen.destroy();
return;
}
dragNode = car;
handleMove(x, y, obj);
};
var finishScreenActive = false;
var finishScreen = null;
game.up = function (x, y, obj) {
dragNode = null;
if (finishScreenActive) {
//{1Q_new}
finishScreenActive = false;
finishScreen.destroy();
LK.showGameOver();
return;
}
};
game.update = function () {
if (startScreenActive) {
return;
}
if (finishScreenActive) {
return;
}
if (isBraking) {
gameSpeed = Math.max(baseSpeed, gameSpeed - 0.5);
} else {
distanceTraveled += gameSpeed;
gameSpeed = Math.min(maxSpeed, baseSpeed + distanceTraveled * speedIncreaseRate);
}
for (var i = obstacles.length - 1; i >= 0; i--) {
var obstacle = obstacles[i];
if (obstacle.lastY === undefined) obstacle.lastY = obstacle.y;
obstacle.speed = gameSpeed;
obstacle.update();
if (obstacle.lastY >= -50 && obstacle.y < -50) {
obstacle.destroy();
obstacles.splice(i, 1);
continue;
}
if (obstacle.lastY <= 2800 && obstacle.y > 2800) {
obstacle.destroy();
obstacles.splice(i, 1);
score += 10;
continue;
}
var isColliding = obstacle.intersects(car);
if (isColliding && !car.isInvincible) {
if (car.hasShield) {
car.hasShield = false;
car.shieldTimer = 0;
carGraphics = car.children[0];
carGraphics.tint = 0xffffff;
obstacle.destroy();
obstacles.splice(i, 1);
LK.getSound('collision').play();
continue;
} else {
LK.effects.flashScreen(0xff0000, 500);
LK.getSound('collision').play();
showFinishScreen();
}
}
obstacle.lastY = obstacle.y;
}
for (var j = powerups.length - 1; j >= 0; j--) {
var powerup = powerups[j];
if (powerup.lastY === undefined) powerup.lastY = powerup.y;
powerup.speed = gameSpeed;
if (powerup.lastY >= -50 && powerup.y < -50) {
powerup.destroy();
powerups.splice(j, 1);
continue;
}
if (powerup.lastY <= 2800 && powerup.y > 2800) {
powerup.destroy();
powerups.splice(j, 1);
continue;
}
var isPowerupColliding = powerup.intersects(car);
if (isPowerupColliding) {
LK.getSound('powerup').play();
if (powerup.powerupType === 0) {
LK.getSound('boost').play();
gameSpeed = Math.min(maxSpeed, gameSpeed + 3);
score += 50;
} else if (powerup.powerupType === 1) {
car.hasShield = true;
car.shieldTimer = 300;
var carGraphics = car.children[0];
carGraphics.tint = 0x00ff00;
score += 30;
} else if (powerup.powerupType === 2) {
car.isInvincible = true;
car.invincibleTimer = 240;
score += 40;
}
powerup.destroy();
powerups.splice(j, 1);
}
powerup.lastY = powerup.y;
}
obstacleSpawnCounter++;
if (obstacleSpawnCounter >= Math.max(30, spawnRate - Math.floor(distanceTraveled / 10000))) {
spawnObstacle();
obstacleSpawnCounter = 0;
}
powerupSpawnCounter++;
if (powerupSpawnCounter >= 200) {
spawnPowerup();
powerupSpawnCounter = 0;
}
scoreTxt.setText('Score: ' + score);
distanceTxt.setText('Distance: ' + Math.floor(distanceTraveled / 10));
var speedMultiplier = (gameSpeed / baseSpeed).toFixed(1);
speedTxt.setText('Speed: ' + speedMultiplier + 'x');
if (score > storage.highScore) {
storage.highScore = score;
}
if (!storage.leaderboard) {
storage.leaderboard = [];
}
storage.leaderboard.push(score);
storage.leaderboard.sort(function (a, b) {
return b - a;
});
if (storage.leaderboard.length > 10) {
storage.leaderboard = storage.leaderboard.slice(0, 10);
}
};
LK.playMusic('racingMusic', {
loop: true,
volume: 0.7
});
Yol çalışması. In-Game asset. 2d. High contrast. No shadows
Hızlama işareti. In-Game asset. 2d. High contrast. No shadows
Kalkan işareti. In-Game asset. 2d. High contrast. No shadows
Yarış pisti. Düm düz In-Game asset. 2d. High contrast. No shadows
İleri bakan araba. In-Game asset. 2d. High contrast. No shadows
Önüne bakan araba. In-Game asset. 2d. High contrast. No shadows