/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); var storage = LK.import("@upit/storage.v1"); /**** * Classes ****/ var AICar = Container.expand(function () { var self = Container.call(this); var carGraphics = self.attachAsset('aiCar', { anchorX: 0.5, anchorY: 0.5 }); self.lane = 0; self.speed = 0; self.active = true; self.init = function (lane, yPos, speed) { self.lane = lane || Math.floor(Math.random() * 5); self.y = yPos || -300; self.x = 400 + self.lane * 300; self.speed = speed || Math.random() * 3 + 2; self.active = true; return self; }; self.update = function () { if (!self.active) { return; } self.y += self.speed * gameSpeed; // If car is off screen, mark for removal if (self.y > 2832) { self.active = false; overtakeCount += 1; LK.setScore(LK.getScore() + 10); LK.getSound('overtake').play(); } }; return self; }); var PlayerCar = Container.expand(function () { var self = Container.call(this); var carGraphics = self.attachAsset('car', { anchorX: 0.5, anchorY: 0.5 }); self.lane = 2; // Middle lane (0-indexed: 0, 1, 2, 3, 4) self.speed = 5; self.canMove = true; self.currentBoost = 0; self.maxBoost = 100; self.moveToLane = function (lane) { if (!self.canMove) { return; } if (lane >= 0 && lane <= 4 && lane !== self.lane) { self.canMove = false; var targetX = 400 + lane * 300; tween(self, { x: targetX }, { duration: 300, easing: tween.easeOut, onFinish: function onFinish() { self.lane = lane; self.canMove = true; } }); } }; self.applyBoost = function () { if (self.currentBoost > 0) { gameSpeed = baseGameSpeed * 1.5; self.currentBoost -= 1; if (self.currentBoost <= 0) { gameSpeed = baseGameSpeed; } } }; self.crash = function () { LK.getSound('crash').play(); self.canMove = false; LK.effects.flashObject(self, 0xff0000, 500); gameSpeed = baseGameSpeed * 0.3; LK.setTimeout(function () { self.canMove = true; gameSpeed = baseGameSpeed; }, 1500); }; return self; }); var TrackElement = Container.expand(function () { var self = Container.call(this); self.type = 'line'; // 'line', 'boost', 'obstacle' self.active = true; self.init = function (type, lane, yPos) { self.type = type || 'line'; self.active = true; var assetId = 'trackLine'; if (type === 'boost') { assetId = 'speedBoost'; } else if (type === 'obstacle') { assetId = 'obstacle'; } var elementGraphics = self.attachAsset(assetId, { anchorX: 0.5, anchorY: 0.5 }); self.lane = lane || 0; var x = self.type === 'line' ? 250 + lane * 300 : 400 + lane * 300; self.x = x; self.y = yPos || -100; return self; }; self.update = function () { if (!self.active) { return; } self.y += 7 * gameSpeed; // If element is off screen, mark for removal if (self.y > 2832) { self.active = false; } }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x008800 }); /**** * Game Code ****/ // Game variables var gameStarted = false; var baseGameSpeed = 1.0; var gameSpeed = baseGameSpeed; var lastUpdate = Date.now(); var trackPosition = 0; var spawnCounter = 0; var difficultyLevel = 1; var overtakeCount = 0; var distanceTraveled = 0; var raceTarget = 1000; // meters to complete the race // Track configuration var trackWidth = 1500; var trackHeight = 2732; var laneCount = 5; var laneWidth = 300; // Game elements var player; var trackElements = []; var aiCars = []; // UI elements var scoreTxt; var speedTxt; var boostTxt; var distanceTxt; // Initialize game function initGame() { // Set background game.setBackgroundColor(0x005500); // Create the track createTrack(); // Create player car player = new PlayerCar(); player.x = 400 + player.lane * 300; // Position in middle lane player.y = 2200; // Position near bottom of screen game.addChild(player); // Initialize UI createUI(); // Start game gameStarted = true; LK.playMusic('raceMusic'); LK.getSound('engine').play(); } function createTrack() { // Create track background (lanes) for (var i = 0; i < laneCount; i++) { var lane = LK.getAsset('trackLane', { anchorX: 0.5, anchorY: 0.5, alpha: 0.7 }); lane.x = 400 + i * 300; lane.y = 1366; // Middle of screen lane.height = trackHeight; game.addChild(lane); } // Create initial track lines for (var i = 0; i < 15; i++) { for (var j = 0; j < laneCount - 1; j++) { var line = new TrackElement().init('line', j, i * 200); trackElements.push(line); game.addChild(line); } } } function createUI() { // Score display scoreTxt = new Text2('Score: 0', { size: 60, fill: 0xFFFFFF }); scoreTxt.anchor.set(0, 0); LK.gui.topRight.addChild(scoreTxt); scoreTxt.x = -300; // Offset from right edge // Speed display speedTxt = new Text2('Speed: 100 km/h', { size: 60, fill: 0xFFFFFF }); speedTxt.anchor.set(0, 0); LK.gui.topRight.addChild(speedTxt); speedTxt.x = -300; // Offset from right edge speedTxt.y = 70; // Below score // Boost display boostTxt = new Text2('Boost: 0%', { size: 60, fill: 0xFFFFFF }); boostTxt.anchor.set(0, 0); LK.gui.topRight.addChild(boostTxt); boostTxt.x = -300; // Offset from right edge boostTxt.y = 140; // Below speed // Distance display distanceTxt = new Text2('Distance: 0m / ' + raceTarget + 'm', { size: 60, fill: 0xFFFFFF }); distanceTxt.anchor.set(0.5, 0); LK.gui.top.addChild(distanceTxt); distanceTxt.y = 70; // Below top } function updateUI() { scoreTxt.setText('Score: ' + LK.getScore()); speedTxt.setText('Speed: ' + Math.floor(100 * gameSpeed) + ' km/h'); boostTxt.setText('Boost: ' + player.currentBoost + '%'); distanceTxt.setText('Distance: ' + Math.floor(distanceTraveled) + 'm / ' + raceTarget + 'm'); } function spawnTrackElements() { spawnCounter++; // Spawn track lines if (spawnCounter % 20 === 0) { for (var j = 0; j < laneCount - 1; j++) { var line = new TrackElement().init('line', j, -100); trackElements.push(line); game.addChild(line); } } // Spawn boost (less frequent) if (spawnCounter % 180 === 0) { var boostLane = Math.floor(Math.random() * laneCount); var boost = new TrackElement().init('boost', boostLane, -100); trackElements.push(boost); game.addChild(boost); } // Spawn obstacles (frequency increases with difficulty) if (spawnCounter % Math.max(100 - difficultyLevel * 10, 30) === 0) { var obstacleLane = Math.floor(Math.random() * laneCount); var obstacle = new TrackElement().init('obstacle', obstacleLane, -100); trackElements.push(obstacle); game.addChild(obstacle); } // Spawn AI cars if (spawnCounter % Math.max(120 - difficultyLevel * 15, 40) === 0) { var aiLane = Math.floor(Math.random() * laneCount); // Don't spawn in same lane too often if (aiCars.length > 0) { var lastCar = aiCars[aiCars.length - 1]; if (lastCar.lane === aiLane && lastCar.y > -1000) { aiLane = (aiLane + 1) % laneCount; } } var aiSpeed = Math.random() * 2 + 2 + difficultyLevel * 0.3; var ai = new AICar().init(aiLane, -300, aiSpeed); aiCars.push(ai); game.addChild(ai); } } function checkCollisions() { // Check player collisions with AI cars for (var i = 0; i < aiCars.length; i++) { var car = aiCars[i]; if (car.active && player.lane === car.lane) { // Check vertical collision var playerTop = player.y - player.height / 2; var playerBottom = player.y + player.height / 2; var carTop = car.y - car.height / 2; var carBottom = car.y + car.height / 2; if (playerTop < carBottom && playerBottom > carTop) { player.crash(); car.active = false; // Remove the AI car LK.setScore(Math.max(0, LK.getScore() - 50)); // Penalty break; } } } // Check player collisions with track elements for (var i = 0; i < trackElements.length; i++) { var element = trackElements[i]; if (element.active && element.type !== 'line') { // Only check boost and obstacle elements if (player.lane === element.lane) { // Check vertical collision var playerTop = player.y - player.height / 3; // Smaller collision area var playerBottom = player.y + player.height / 3; var elementTop = element.y - element.height / 2; var elementBottom = element.y + element.height / 2; if (playerTop < elementBottom && playerBottom > elementTop) { if (element.type === 'boost') { // Collect boost player.currentBoost = Math.min(player.maxBoost, player.currentBoost + 25); LK.getSound('boost').play(); LK.setScore(LK.getScore() + 20); } else if (element.type === 'obstacle') { // Hit obstacle player.crash(); LK.setScore(Math.max(0, LK.getScore() - 30)); } element.active = false; break; } } } } } function cleanupInactiveElements() { // Clean up track elements for (var i = trackElements.length - 1; i >= 0; i--) { if (!trackElements[i].active) { trackElements[i].destroy(); trackElements.splice(i, 1); } } // Clean up AI cars for (var i = aiCars.length - 1; i >= 0; i--) { if (!aiCars[i].active) { aiCars[i].destroy(); aiCars.splice(i, 1); } } } function updateDifficulty() { // Increase difficulty based on distance traveled difficultyLevel = 1 + Math.floor(distanceTraveled / 200); // Cap difficulty at level 10 if (difficultyLevel > 10) { difficultyLevel = 10; } // Store high score if (LK.getScore() > (storage.highScore || 0)) { storage.highScore = LK.getScore(); } // Check win condition if (distanceTraveled >= raceTarget) { LK.showYouWin(); } } // Input handling game.down = function (x, y, obj) { if (!gameStarted) { initGame(); return; } // Determine tap position and move accordingly if (x < 1024) { // Left half of screen // Move left player.moveToLane(Math.max(0, player.lane - 1)); } else { // Right half of screen // Move right player.moveToLane(Math.min(4, player.lane + 1)); } }; // Apply boost on move up game.up = function (x, y, obj) { if (gameStarted && y > 2000) { // Only trigger boost for taps in bottom area player.applyBoost(); } }; // Main game loop game.update = function () { if (!gameStarted) { return; } // Calculate delta time var now = Date.now(); var deltaTime = now - lastUpdate; lastUpdate = now; // Update distance traveled distanceTraveled += deltaTime / 1000 * gameSpeed * 50; // Update track elements spawnTrackElements(); // Update all active track elements for (var i = 0; i < trackElements.length; i++) { trackElements[i].update(); } // Update all active AI cars for (var i = 0; i < aiCars.length; i++) { aiCars[i].update(); } // Check for collisions checkCollisions(); // Clean up inactive elements cleanupInactiveElements(); // Update difficulty updateDifficulty(); // Update UI updateUI(); }; // Initialize the start screen function initStartScreen() { game.setBackgroundColor(0x005500); var titleText = new Text2('Formula Speed', { size: 120, fill: 0xFFFFFF }); titleText.anchor.set(0.5, 0.5); titleText.x = 1024; titleText.y = 900; game.addChild(titleText); var subtitleText = new Text2('Grand Prix Challenge', { size: 80, fill: 0xFFFFFF }); subtitleText.anchor.set(0.5, 0.5); subtitleText.x = 1024; subtitleText.y = 1020; game.addChild(subtitleText); var instructionText = new Text2('Tap Left/Right to Change Lanes\nTap Bottom to Use Boost', { size: 60, fill: 0xFFFFFF }); instructionText.anchor.set(0.5, 0.5); instructionText.x = 1024; instructionText.y = 1200; game.addChild(instructionText); // Show high score if available if (storage.highScore) { var highScoreText = new Text2('High Score: ' + storage.highScore, { size: 60, fill: 0xFFFFFF }); highScoreText.anchor.set(0.5, 0.5); highScoreText.x = 1024; highScoreText.y = 1300; game.addChild(highScoreText); } var startText = new Text2('Tap Anywhere to Start', { size: 70, fill: 0xFFFFFF }); startText.anchor.set(0.5, 0.5); startText.x = 1024; startText.y = 1450; game.addChild(startText); // Create a demo car var demoCar = LK.getAsset('car', { anchorX: 0.5, anchorY: 0.5, x: 1024, y: 1700 }); game.addChild(demoCar); // Animate the demo car var _animateDemoCar = function animateDemoCar() { tween(demoCar, { y: 1650 }, { duration: 1000, easing: tween.easeInOut, onFinish: function onFinish() { tween(demoCar, { y: 1750 }, { duration: 1000, easing: tween.easeInOut, onFinish: _animateDemoCar }); } }); }; _animateDemoCar(); } // Start with the intro screen initStartScreen();
/****
* Plugins
****/
var tween = LK.import("@upit/tween.v1");
var storage = LK.import("@upit/storage.v1");
/****
* Classes
****/
var AICar = Container.expand(function () {
var self = Container.call(this);
var carGraphics = self.attachAsset('aiCar', {
anchorX: 0.5,
anchorY: 0.5
});
self.lane = 0;
self.speed = 0;
self.active = true;
self.init = function (lane, yPos, speed) {
self.lane = lane || Math.floor(Math.random() * 5);
self.y = yPos || -300;
self.x = 400 + self.lane * 300;
self.speed = speed || Math.random() * 3 + 2;
self.active = true;
return self;
};
self.update = function () {
if (!self.active) {
return;
}
self.y += self.speed * gameSpeed;
// If car is off screen, mark for removal
if (self.y > 2832) {
self.active = false;
overtakeCount += 1;
LK.setScore(LK.getScore() + 10);
LK.getSound('overtake').play();
}
};
return self;
});
var PlayerCar = Container.expand(function () {
var self = Container.call(this);
var carGraphics = self.attachAsset('car', {
anchorX: 0.5,
anchorY: 0.5
});
self.lane = 2; // Middle lane (0-indexed: 0, 1, 2, 3, 4)
self.speed = 5;
self.canMove = true;
self.currentBoost = 0;
self.maxBoost = 100;
self.moveToLane = function (lane) {
if (!self.canMove) {
return;
}
if (lane >= 0 && lane <= 4 && lane !== self.lane) {
self.canMove = false;
var targetX = 400 + lane * 300;
tween(self, {
x: targetX
}, {
duration: 300,
easing: tween.easeOut,
onFinish: function onFinish() {
self.lane = lane;
self.canMove = true;
}
});
}
};
self.applyBoost = function () {
if (self.currentBoost > 0) {
gameSpeed = baseGameSpeed * 1.5;
self.currentBoost -= 1;
if (self.currentBoost <= 0) {
gameSpeed = baseGameSpeed;
}
}
};
self.crash = function () {
LK.getSound('crash').play();
self.canMove = false;
LK.effects.flashObject(self, 0xff0000, 500);
gameSpeed = baseGameSpeed * 0.3;
LK.setTimeout(function () {
self.canMove = true;
gameSpeed = baseGameSpeed;
}, 1500);
};
return self;
});
var TrackElement = Container.expand(function () {
var self = Container.call(this);
self.type = 'line'; // 'line', 'boost', 'obstacle'
self.active = true;
self.init = function (type, lane, yPos) {
self.type = type || 'line';
self.active = true;
var assetId = 'trackLine';
if (type === 'boost') {
assetId = 'speedBoost';
} else if (type === 'obstacle') {
assetId = 'obstacle';
}
var elementGraphics = self.attachAsset(assetId, {
anchorX: 0.5,
anchorY: 0.5
});
self.lane = lane || 0;
var x = self.type === 'line' ? 250 + lane * 300 : 400 + lane * 300;
self.x = x;
self.y = yPos || -100;
return self;
};
self.update = function () {
if (!self.active) {
return;
}
self.y += 7 * gameSpeed;
// If element is off screen, mark for removal
if (self.y > 2832) {
self.active = false;
}
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x008800
});
/****
* Game Code
****/
// Game variables
var gameStarted = false;
var baseGameSpeed = 1.0;
var gameSpeed = baseGameSpeed;
var lastUpdate = Date.now();
var trackPosition = 0;
var spawnCounter = 0;
var difficultyLevel = 1;
var overtakeCount = 0;
var distanceTraveled = 0;
var raceTarget = 1000; // meters to complete the race
// Track configuration
var trackWidth = 1500;
var trackHeight = 2732;
var laneCount = 5;
var laneWidth = 300;
// Game elements
var player;
var trackElements = [];
var aiCars = [];
// UI elements
var scoreTxt;
var speedTxt;
var boostTxt;
var distanceTxt;
// Initialize game
function initGame() {
// Set background
game.setBackgroundColor(0x005500);
// Create the track
createTrack();
// Create player car
player = new PlayerCar();
player.x = 400 + player.lane * 300; // Position in middle lane
player.y = 2200; // Position near bottom of screen
game.addChild(player);
// Initialize UI
createUI();
// Start game
gameStarted = true;
LK.playMusic('raceMusic');
LK.getSound('engine').play();
}
function createTrack() {
// Create track background (lanes)
for (var i = 0; i < laneCount; i++) {
var lane = LK.getAsset('trackLane', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.7
});
lane.x = 400 + i * 300;
lane.y = 1366; // Middle of screen
lane.height = trackHeight;
game.addChild(lane);
}
// Create initial track lines
for (var i = 0; i < 15; i++) {
for (var j = 0; j < laneCount - 1; j++) {
var line = new TrackElement().init('line', j, i * 200);
trackElements.push(line);
game.addChild(line);
}
}
}
function createUI() {
// Score display
scoreTxt = new Text2('Score: 0', {
size: 60,
fill: 0xFFFFFF
});
scoreTxt.anchor.set(0, 0);
LK.gui.topRight.addChild(scoreTxt);
scoreTxt.x = -300; // Offset from right edge
// Speed display
speedTxt = new Text2('Speed: 100 km/h', {
size: 60,
fill: 0xFFFFFF
});
speedTxt.anchor.set(0, 0);
LK.gui.topRight.addChild(speedTxt);
speedTxt.x = -300; // Offset from right edge
speedTxt.y = 70; // Below score
// Boost display
boostTxt = new Text2('Boost: 0%', {
size: 60,
fill: 0xFFFFFF
});
boostTxt.anchor.set(0, 0);
LK.gui.topRight.addChild(boostTxt);
boostTxt.x = -300; // Offset from right edge
boostTxt.y = 140; // Below speed
// Distance display
distanceTxt = new Text2('Distance: 0m / ' + raceTarget + 'm', {
size: 60,
fill: 0xFFFFFF
});
distanceTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(distanceTxt);
distanceTxt.y = 70; // Below top
}
function updateUI() {
scoreTxt.setText('Score: ' + LK.getScore());
speedTxt.setText('Speed: ' + Math.floor(100 * gameSpeed) + ' km/h');
boostTxt.setText('Boost: ' + player.currentBoost + '%');
distanceTxt.setText('Distance: ' + Math.floor(distanceTraveled) + 'm / ' + raceTarget + 'm');
}
function spawnTrackElements() {
spawnCounter++;
// Spawn track lines
if (spawnCounter % 20 === 0) {
for (var j = 0; j < laneCount - 1; j++) {
var line = new TrackElement().init('line', j, -100);
trackElements.push(line);
game.addChild(line);
}
}
// Spawn boost (less frequent)
if (spawnCounter % 180 === 0) {
var boostLane = Math.floor(Math.random() * laneCount);
var boost = new TrackElement().init('boost', boostLane, -100);
trackElements.push(boost);
game.addChild(boost);
}
// Spawn obstacles (frequency increases with difficulty)
if (spawnCounter % Math.max(100 - difficultyLevel * 10, 30) === 0) {
var obstacleLane = Math.floor(Math.random() * laneCount);
var obstacle = new TrackElement().init('obstacle', obstacleLane, -100);
trackElements.push(obstacle);
game.addChild(obstacle);
}
// Spawn AI cars
if (spawnCounter % Math.max(120 - difficultyLevel * 15, 40) === 0) {
var aiLane = Math.floor(Math.random() * laneCount);
// Don't spawn in same lane too often
if (aiCars.length > 0) {
var lastCar = aiCars[aiCars.length - 1];
if (lastCar.lane === aiLane && lastCar.y > -1000) {
aiLane = (aiLane + 1) % laneCount;
}
}
var aiSpeed = Math.random() * 2 + 2 + difficultyLevel * 0.3;
var ai = new AICar().init(aiLane, -300, aiSpeed);
aiCars.push(ai);
game.addChild(ai);
}
}
function checkCollisions() {
// Check player collisions with AI cars
for (var i = 0; i < aiCars.length; i++) {
var car = aiCars[i];
if (car.active && player.lane === car.lane) {
// Check vertical collision
var playerTop = player.y - player.height / 2;
var playerBottom = player.y + player.height / 2;
var carTop = car.y - car.height / 2;
var carBottom = car.y + car.height / 2;
if (playerTop < carBottom && playerBottom > carTop) {
player.crash();
car.active = false; // Remove the AI car
LK.setScore(Math.max(0, LK.getScore() - 50)); // Penalty
break;
}
}
}
// Check player collisions with track elements
for (var i = 0; i < trackElements.length; i++) {
var element = trackElements[i];
if (element.active && element.type !== 'line') {
// Only check boost and obstacle elements
if (player.lane === element.lane) {
// Check vertical collision
var playerTop = player.y - player.height / 3; // Smaller collision area
var playerBottom = player.y + player.height / 3;
var elementTop = element.y - element.height / 2;
var elementBottom = element.y + element.height / 2;
if (playerTop < elementBottom && playerBottom > elementTop) {
if (element.type === 'boost') {
// Collect boost
player.currentBoost = Math.min(player.maxBoost, player.currentBoost + 25);
LK.getSound('boost').play();
LK.setScore(LK.getScore() + 20);
} else if (element.type === 'obstacle') {
// Hit obstacle
player.crash();
LK.setScore(Math.max(0, LK.getScore() - 30));
}
element.active = false;
break;
}
}
}
}
}
function cleanupInactiveElements() {
// Clean up track elements
for (var i = trackElements.length - 1; i >= 0; i--) {
if (!trackElements[i].active) {
trackElements[i].destroy();
trackElements.splice(i, 1);
}
}
// Clean up AI cars
for (var i = aiCars.length - 1; i >= 0; i--) {
if (!aiCars[i].active) {
aiCars[i].destroy();
aiCars.splice(i, 1);
}
}
}
function updateDifficulty() {
// Increase difficulty based on distance traveled
difficultyLevel = 1 + Math.floor(distanceTraveled / 200);
// Cap difficulty at level 10
if (difficultyLevel > 10) {
difficultyLevel = 10;
}
// Store high score
if (LK.getScore() > (storage.highScore || 0)) {
storage.highScore = LK.getScore();
}
// Check win condition
if (distanceTraveled >= raceTarget) {
LK.showYouWin();
}
}
// Input handling
game.down = function (x, y, obj) {
if (!gameStarted) {
initGame();
return;
}
// Determine tap position and move accordingly
if (x < 1024) {
// Left half of screen
// Move left
player.moveToLane(Math.max(0, player.lane - 1));
} else {
// Right half of screen
// Move right
player.moveToLane(Math.min(4, player.lane + 1));
}
};
// Apply boost on move up
game.up = function (x, y, obj) {
if (gameStarted && y > 2000) {
// Only trigger boost for taps in bottom area
player.applyBoost();
}
};
// Main game loop
game.update = function () {
if (!gameStarted) {
return;
}
// Calculate delta time
var now = Date.now();
var deltaTime = now - lastUpdate;
lastUpdate = now;
// Update distance traveled
distanceTraveled += deltaTime / 1000 * gameSpeed * 50;
// Update track elements
spawnTrackElements();
// Update all active track elements
for (var i = 0; i < trackElements.length; i++) {
trackElements[i].update();
}
// Update all active AI cars
for (var i = 0; i < aiCars.length; i++) {
aiCars[i].update();
}
// Check for collisions
checkCollisions();
// Clean up inactive elements
cleanupInactiveElements();
// Update difficulty
updateDifficulty();
// Update UI
updateUI();
};
// Initialize the start screen
function initStartScreen() {
game.setBackgroundColor(0x005500);
var titleText = new Text2('Formula Speed', {
size: 120,
fill: 0xFFFFFF
});
titleText.anchor.set(0.5, 0.5);
titleText.x = 1024;
titleText.y = 900;
game.addChild(titleText);
var subtitleText = new Text2('Grand Prix Challenge', {
size: 80,
fill: 0xFFFFFF
});
subtitleText.anchor.set(0.5, 0.5);
subtitleText.x = 1024;
subtitleText.y = 1020;
game.addChild(subtitleText);
var instructionText = new Text2('Tap Left/Right to Change Lanes\nTap Bottom to Use Boost', {
size: 60,
fill: 0xFFFFFF
});
instructionText.anchor.set(0.5, 0.5);
instructionText.x = 1024;
instructionText.y = 1200;
game.addChild(instructionText);
// Show high score if available
if (storage.highScore) {
var highScoreText = new Text2('High Score: ' + storage.highScore, {
size: 60,
fill: 0xFFFFFF
});
highScoreText.anchor.set(0.5, 0.5);
highScoreText.x = 1024;
highScoreText.y = 1300;
game.addChild(highScoreText);
}
var startText = new Text2('Tap Anywhere to Start', {
size: 70,
fill: 0xFFFFFF
});
startText.anchor.set(0.5, 0.5);
startText.x = 1024;
startText.y = 1450;
game.addChild(startText);
// Create a demo car
var demoCar = LK.getAsset('car', {
anchorX: 0.5,
anchorY: 0.5,
x: 1024,
y: 1700
});
game.addChild(demoCar);
// Animate the demo car
var _animateDemoCar = function animateDemoCar() {
tween(demoCar, {
y: 1650
}, {
duration: 1000,
easing: tween.easeInOut,
onFinish: function onFinish() {
tween(demoCar, {
y: 1750
}, {
duration: 1000,
easing: tween.easeInOut,
onFinish: _animateDemoCar
});
}
});
};
_animateDemoCar();
}
// Start with the intro screen
initStartScreen();