/**** * Classes ****/ // No need to manually define assets, LK will handle this automatically. // Define a simple class for the light indicator var LightIndicator = Container.expand(function () { var self = Container.call(this); var light = self.attachAsset('light', { anchorX: 0.5, anchorY: 0.5 }); self.setColor = function (color) { light.tint = color; }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0xFFFFFF // Init game with a white background }); /**** * Game Code ****/ // Initialize variables var lightIndicator; var startTime; var reactionTimeText; var gameStarted = false; var countdown = 5; var lightsOff = false; var jumpstart = false; var scoreRecords = [{ name: 'Alice', score: 150 }, { name: 'Bob', score: 180 }, { name: 'Charlie', score: 200 }, { name: 'David', score: 220 }, { name: 'Eve', score: 260 }, { name: 'Frank', score: 300 }, { name: 'Grace', score: 360 }, { name: 'Hannah', score: 360 }, { name: 'Ivy', score: 400 }, { name: 'Jack', score: 450 }]; // Function to start the game function startGame() { gameStarted = true; startTime = Date.now(); var countdownInterval = LK.setInterval(function () { countdown--; if (countdown >= 0 && !jumpstart) { lightIndicators[5 - countdown - 1].setColor(0xFF0000); // Set light to red lightIndicators2[5 - countdown - 1].setColor(0xFF0000); // Set light to red LK.getSound('lights').play(); // Play sound when light is turned on } if (countdown === 0 && !jumpstart) { LK.clearInterval(countdownInterval); if (!jumpstart) { LK.setTimeout(turnOffLight, Math.random() * 3000 + 1000); // Turn off light after a random time between 1-4 seconds } } }, 1000); } // Function to turn off the light function turnOffLight() { lightIndicators.forEach(function (lightIndicator) { lightIndicator.setColor(0x9f9d9d); // Set light to offlight color }); lightIndicators2.forEach(function (lightIndicator) { lightIndicator.setColor(0x9f9d9d); // Set light to offlight color }); startTime = Date.now(); // Record the time when the light turns off lightsOff = true; // Set the flag to true when lights turn off if (!jumpstart) { LK.getSound('start').play(); // Play sound when lights go off } } // Function to handle screen tap var touchCount = 0; function handleTap(x, y, obj) { touchCount++; if (!gameStarted) { startGame(); instructionText.visible = false; // Hide instructions text after first tap } else if (touchCount == 2 && !lightsOff) { reactionTimeText.setText('JUMP START!'); gameStarted = false; jumpstart = true; game.down = null; // Disable further taps LK.getSound('jumpstart').play(); // Play 'jumpstart' sound when jumpstart happens LK.setTimeout(function () { LK.showGameOver(); LK.setTimeout(function () { game.down = handleTap; // Re-enable tap after game over }, 2000); // Re-enable tap after 2 seconds }, 2000); // Show game over after 2 seconds } else { var reactionTime = Date.now() - startTime; LK.setScore(reactionTime); reactionTimeText.setText((LK.getScore() / 1000).toFixed(3).padStart(6, '0')); reactionTimeText.scale.x = 1.1; reactionTimeText.scale.y = 1.1; LK.setTimeout(function () { reactionTimeText.scale.x = 1; reactionTimeText.scale.y = 1; }, 100); LK.getSound('speed').play(); // Play 'speed' sound when reaction time is updated gameStarted = false; game.down = null; // Disable further taps // Move lights, light background, and center asset offscreen to the right var moveOffscreenSpeed = 40; // Adjust speed as needed lightIndicators.forEach(function (lightIndicator) { lightIndicator.update = function () { lightIndicator.x += moveOffscreenSpeed; if (lightIndicator.x > 2048 + lightIndicator.width) { lightIndicator.visible = false; } }; }); lightIndicators2.forEach(function (lightIndicator) { lightIndicator.update = function () { lightIndicator.x += moveOffscreenSpeed; if (lightIndicator.x > 2048 + lightIndicator.width) { lightIndicator.visible = false; } }; }); staticLightIndicators1.forEach(function (lightIndicator) { lightIndicator.update = function () { lightIndicator.x += moveOffscreenSpeed; if (lightIndicator.x > 2048 + lightIndicator.width) { lightIndicator.visible = false; } }; }); staticLightIndicators2.forEach(function (lightIndicator) { lightIndicator.update = function () { lightIndicator.x += moveOffscreenSpeed; if (lightIndicator.x > 2048 + lightIndicator.width) { lightIndicator.visible = false; } }; }); lightBackgrounds.forEach(function (lightBackground) { lightBackground.update = function () { lightBackground.x += moveOffscreenSpeed; if (lightBackground.x > 2048 + lightBackground.width) { lightBackground.visible = false; } }; }); centerAsset.update = function () { centerAsset.x += moveOffscreenSpeed; if (centerAsset.x > 2048 + centerAsset.width) { centerAsset.visible = false; } }; } if (touchCount == 2 && !jumpstart) { game.down = null; // Disable further taps // Add the current score to the score records with 'YOU' as the name var youScore = { name: 'YOU', score: LK.getScore() }; var inserted = false; for (var i = 0; i < scoreRecords.length; i++) { if (scoreRecords[i].name === 'YOU') { continue; } if (youScore.score < scoreRecords[i].score) { scoreRecords.splice(i, 0, youScore); inserted = true; break; } } if (!inserted) { if (youScore.score >= 450 && !scoreRecords.some(function (record) { return record.name === 'YOU'; })) { scoreRecords.push(youScore); } else if (!scoreRecords.some(function (record) { return record.name === 'YOU'; })) { scoreRecords.push(youScore); scoreRecords = scoreRecords.slice(0, 10); // Limit to top 10 scores including the player } } // Ensure names in the score table remain in the same order var names = ['Verstappen', 'Leclerc', 'Norris', 'Colapinto', 'Sainz', 'Hamilton', 'Piastri', 'Russel', 'Tsunoda', 'Albon']; var youIndex = scoreRecords.findIndex(function (record) { return record.name === 'YOU'; }); for (var i = 0; i < scoreRecords.length; i++) { if (i !== youIndex) { scoreRecords[i].name = names[i < youIndex ? i : i - 1]; } } // Create a table for the score records var scoreTable = new Container(); scoreTable.x = 2048 / 2 - 100; scoreTable.y = 2732 / 2 - 650; scoreTable.pivot.set(scoreTable.width / 2, 0); // Add table headers var headers = ["Rank", "Driver", "Time (s)"]; for (var i = 0; i < headers.length; i++) { var headerText = new Text2(headers[i], { size: 90, fill: "#000000", stroke: "#000000", strokeThickness: 1, font: "'Formula 1', sans-serif", align: 'center' }); headerText.x = i * 600 - 700 + (i === 0 ? 100 : 0); // Adjust spacing between columns, move rank header 100 pixels to the right headerText.y = 0; scoreTable.addChild(headerText); } // Add score records to the table for (var i = 0; i < scoreRecords.length; i++) { var rankText = new Text2(scoreRecords[i].name === 'YOU' && youScore.score > 450 ? scoreRecords.length.toString() : (i + 1).toString(), { size: scoreRecords[i].name === 'YOU' ? 90 : 80, // Increase size by 30% if it's the player fill: scoreRecords[i].name === 'YOU' ? "#FF1801" : "#000000", stroke: "#000000", strokeThickness: 1, font: "'Formula 1', sans-serif", align: 'center' }); rankText.x = -600; // Align rank column rankText.y = (i + 1) * 100; scoreTable.addChild(rankText); if (scoreRecords[i].name && scoreRecords[i].name !== 'YOU') { var flagBackground = LK.getAsset('flagBackground', { anchorX: 0.5, anchorY: 0.1, x: -200, y: (i + 1) * 100 + 18 }); scoreTable.addChild(flagBackground); var flagAsset = LK.getAsset('flag_' + scoreRecords[i].name.toLowerCase(), { anchorX: 0.5, anchorY: 0.1, x: -200, y: (i + 1) * 100 + 20 }); scoreTable.addChild(flagAsset); } var nameText = new Text2(scoreRecords[i].name || "", { size: scoreRecords[i].name === 'YOU' ? 90 : 80, fill: scoreRecords[i].name === 'YOU' ? "#FF1801" : "#000000", stroke: "#000000", strokeThickness: 1, font: "'Formula 1', sans-serif", align: 'center' }); nameText.x = -100; // Align name column nameText.y = (i + 1) * 100; scoreTable.addChild(nameText); var timeText = new Text2((scoreRecords[i].score / 1000).toFixed(3) + "s", { size: scoreRecords[i].name === 'YOU' ? 90 : 80, fill: scoreRecords[i].name === 'YOU' ? "#FF1801" : "#000000", stroke: "#000000", strokeThickness: 1, font: "'Formula 1', sans-serif", align: 'center' }); timeText.x = 500; // Align time column timeText.y = (i + 1) * 100; scoreTable.addChild(timeText); } if (youScore.score > 450 && !scoreRecords.some(function (record) { return record.name === 'YOU'; })) { var rankText = new Text2(scoreRecords.length.toString(), { size: 90, fill: "#FF1801", stroke: "#000000", strokeThickness: 0, font: "'Formula 1', sans-serif", align: 'center' }); rankText.x = -600; rankText.y = (scoreRecords.length + 1) * 100; scoreTable.addChild(rankText); var nameText = new Text2('YOU', { size: 90, fill: "#FF1801", stroke: "#000000", strokeThickness: 0, font: "'Formula 1', sans-serif", align: 'center' }); nameText.x = -100; nameText.y = (scoreRecords.length + 1) * 100; scoreTable.addChild(nameText); var timeText = new Text2((youScore.score / 1000).toFixed(3) + "s", { size: 90, fill: "#FF1801", stroke: "#000000", strokeThickness: 0, font: "'Formula 1', sans-serif", align: 'center' }); timeText.x = 500; timeText.y = (scoreRecords.length + 1) * 100; scoreTable.addChild(timeText); } scoreTable.x = -scoreTable.width; // Start offscreen to the left game.addChild(scoreTable); // Animate the score table to its final position var targetX = 2048 / 2 - 100; var animationDuration = 60; // Duration in ticks (1 second) var animationStep = (targetX - scoreTable.x) / animationDuration; game.update = function () { if (scoreTable.x < targetX) { scoreTable.x += animationStep; if (scoreTable.x >= targetX) { scoreTable.x = targetX; // Ensure it stops exactly at the target position } } }; // No background image needed for the records table // Removed grid lines for the ranked table LK.setTimeout(function () { touchCount = 0; // Reset touch count game.down = handleTap; // Re-enable tap LK.showGameOver(); }, 5000); // Show game over after 5 seconds to allow time to read the scores } } // Initialize light indicators var lightIndicators = []; var lightIndicators2 = []; var lightBackgrounds = []; var staticLightIndicators1 = []; var staticLightIndicators2 = []; for (var i = 0; i < 5; i++) { var lightBackground = game.addChild(LK.getAsset('lightbackground', { anchorX: 0.5, anchorY: 0.5, x: 2048 / 2 + (i - 2) * 200, y: 2732 / 2 - 70 })); lightBackgrounds.push(lightBackground); var lightIndicator = game.addChild(new LightIndicator()); lightIndicator.x = 2048 / 2 + (i - 2) * 200; // Position lights horizontally with some spacing lightIndicator.y = 2732 / 2; lightIndicator.setColor(0x9f9d9d); // Set initial light color to white lightIndicators.push(lightIndicator); var lightIndicator2 = game.addChild(new LightIndicator()); lightIndicator2.x = 2048 / 2 + (i - 2) * 200; // Position lights horizontally with some spacing lightIndicator2.y = 2732 / 2 + 150; // Position the second line of lights 200px below the first line lightIndicator2.setColor(0x9f9d9d); // Set initial light color to white lightIndicators2.push(lightIndicator2); // Add static lights var staticLight1 = game.addChild(new LightIndicator()); staticLight1.x = 2048 / 2 + (i - 2) * 200; // Position lights horizontally with some spacing staticLight1.y = 2732 / 2 - 150; // Position the first line of static lights 200px above the first line staticLight1.setColor(0x9f9d9d); // Set initial light color to white staticLightIndicators1.push(staticLight1); var staticLight2 = game.addChild(new LightIndicator()); staticLight2.x = 2048 / 2 + (i - 2) * 200; // Position lights horizontally with some spacing staticLight2.y = 2732 / 2 - 300; // Position the second line of static lights 400px above the first line staticLight2.setColor(0x9f9d9d); // Set initial light color to white staticLightIndicators2.push(staticLight2); } // Initialize reaction time text reactionTimeText = new Text2('00.000', { size: 200, fill: "#000000" }); reactionTimeText.anchor.set(0.5, 1); reactionTimeText.y -= 250; // Move reaction time 400 pixels up LK.gui.bottom.addChild(reactionTimeText); // Add instruction text below the lights var instructionText = new Text2("Tap to start the race. Tap again when the lights go out.", { size: 70, fill: "#000000", font: "'Formula 1', sans-serif" }); instructionText.anchor.set(0.5, 0); instructionText.x = 2048 / 2; instructionText.y = 2732 / 2 + 450; game.addChild(instructionText); // Add 'f1' asset to the top of the screen var f1Asset = game.addChild(LK.getAsset('f1', { anchorX: 0.5, anchorY: 0.5, x: 2048 / 2, y: 400 })); // Add 'centerAsset' to the center of the lights var centerAsset = game.addChildAt(LK.getAsset('centerAsset', { anchorX: 0.5, anchorY: 0.5, x: 2048 / 2, y: 2732 / 2 - 60 }), 0); // Set up event listeners game.down = handleTap; game.update = function () { // Add a slight increase and decrease in size to the instruction text instructionText.scale.x = 1 + 0.02 * Math.sin(LK.ticks / 20); instructionText.scale.y = 1 + 0.02 * Math.sin(LK.ticks / 20); // Update positions of elements moving offscreen lightIndicators.forEach(function (lightIndicator) { if (lightIndicator.update) { lightIndicator.update(); } }); lightIndicators2.forEach(function (lightIndicator) { if (lightIndicator.update) { lightIndicator.update(); } }); staticLightIndicators1.forEach(function (lightIndicator) { if (lightIndicator.update) { lightIndicator.update(); } }); staticLightIndicators2.forEach(function (lightIndicator) { if (lightIndicator.update) { lightIndicator.update(); } }); lightBackgrounds.forEach(function (lightBackground) { if (lightBackground.update) { lightBackground.update(); } }); if (centerAsset.update) { centerAsset.update(); } };
/****
* Classes
****/
// No need to manually define assets, LK will handle this automatically.
// Define a simple class for the light indicator
var LightIndicator = Container.expand(function () {
var self = Container.call(this);
var light = self.attachAsset('light', {
anchorX: 0.5,
anchorY: 0.5
});
self.setColor = function (color) {
light.tint = color;
};
return self;
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0xFFFFFF // Init game with a white background
});
/****
* Game Code
****/
// Initialize variables
var lightIndicator;
var startTime;
var reactionTimeText;
var gameStarted = false;
var countdown = 5;
var lightsOff = false;
var jumpstart = false;
var scoreRecords = [{
name: 'Alice',
score: 150
}, {
name: 'Bob',
score: 180
}, {
name: 'Charlie',
score: 200
}, {
name: 'David',
score: 220
}, {
name: 'Eve',
score: 260
}, {
name: 'Frank',
score: 300
}, {
name: 'Grace',
score: 360
}, {
name: 'Hannah',
score: 360
}, {
name: 'Ivy',
score: 400
}, {
name: 'Jack',
score: 450
}];
// Function to start the game
function startGame() {
gameStarted = true;
startTime = Date.now();
var countdownInterval = LK.setInterval(function () {
countdown--;
if (countdown >= 0 && !jumpstart) {
lightIndicators[5 - countdown - 1].setColor(0xFF0000); // Set light to red
lightIndicators2[5 - countdown - 1].setColor(0xFF0000); // Set light to red
LK.getSound('lights').play(); // Play sound when light is turned on
}
if (countdown === 0 && !jumpstart) {
LK.clearInterval(countdownInterval);
if (!jumpstart) {
LK.setTimeout(turnOffLight, Math.random() * 3000 + 1000); // Turn off light after a random time between 1-4 seconds
}
}
}, 1000);
}
// Function to turn off the light
function turnOffLight() {
lightIndicators.forEach(function (lightIndicator) {
lightIndicator.setColor(0x9f9d9d); // Set light to offlight color
});
lightIndicators2.forEach(function (lightIndicator) {
lightIndicator.setColor(0x9f9d9d); // Set light to offlight color
});
startTime = Date.now(); // Record the time when the light turns off
lightsOff = true; // Set the flag to true when lights turn off
if (!jumpstart) {
LK.getSound('start').play(); // Play sound when lights go off
}
}
// Function to handle screen tap
var touchCount = 0;
function handleTap(x, y, obj) {
touchCount++;
if (!gameStarted) {
startGame();
instructionText.visible = false; // Hide instructions text after first tap
} else if (touchCount == 2 && !lightsOff) {
reactionTimeText.setText('JUMP START!');
gameStarted = false;
jumpstart = true;
game.down = null; // Disable further taps
LK.getSound('jumpstart').play(); // Play 'jumpstart' sound when jumpstart happens
LK.setTimeout(function () {
LK.showGameOver();
LK.setTimeout(function () {
game.down = handleTap; // Re-enable tap after game over
}, 2000); // Re-enable tap after 2 seconds
}, 2000); // Show game over after 2 seconds
} else {
var reactionTime = Date.now() - startTime;
LK.setScore(reactionTime);
reactionTimeText.setText((LK.getScore() / 1000).toFixed(3).padStart(6, '0'));
reactionTimeText.scale.x = 1.1;
reactionTimeText.scale.y = 1.1;
LK.setTimeout(function () {
reactionTimeText.scale.x = 1;
reactionTimeText.scale.y = 1;
}, 100);
LK.getSound('speed').play(); // Play 'speed' sound when reaction time is updated
gameStarted = false;
game.down = null; // Disable further taps
// Move lights, light background, and center asset offscreen to the right
var moveOffscreenSpeed = 40; // Adjust speed as needed
lightIndicators.forEach(function (lightIndicator) {
lightIndicator.update = function () {
lightIndicator.x += moveOffscreenSpeed;
if (lightIndicator.x > 2048 + lightIndicator.width) {
lightIndicator.visible = false;
}
};
});
lightIndicators2.forEach(function (lightIndicator) {
lightIndicator.update = function () {
lightIndicator.x += moveOffscreenSpeed;
if (lightIndicator.x > 2048 + lightIndicator.width) {
lightIndicator.visible = false;
}
};
});
staticLightIndicators1.forEach(function (lightIndicator) {
lightIndicator.update = function () {
lightIndicator.x += moveOffscreenSpeed;
if (lightIndicator.x > 2048 + lightIndicator.width) {
lightIndicator.visible = false;
}
};
});
staticLightIndicators2.forEach(function (lightIndicator) {
lightIndicator.update = function () {
lightIndicator.x += moveOffscreenSpeed;
if (lightIndicator.x > 2048 + lightIndicator.width) {
lightIndicator.visible = false;
}
};
});
lightBackgrounds.forEach(function (lightBackground) {
lightBackground.update = function () {
lightBackground.x += moveOffscreenSpeed;
if (lightBackground.x > 2048 + lightBackground.width) {
lightBackground.visible = false;
}
};
});
centerAsset.update = function () {
centerAsset.x += moveOffscreenSpeed;
if (centerAsset.x > 2048 + centerAsset.width) {
centerAsset.visible = false;
}
};
}
if (touchCount == 2 && !jumpstart) {
game.down = null; // Disable further taps
// Add the current score to the score records with 'YOU' as the name
var youScore = {
name: 'YOU',
score: LK.getScore()
};
var inserted = false;
for (var i = 0; i < scoreRecords.length; i++) {
if (scoreRecords[i].name === 'YOU') {
continue;
}
if (youScore.score < scoreRecords[i].score) {
scoreRecords.splice(i, 0, youScore);
inserted = true;
break;
}
}
if (!inserted) {
if (youScore.score >= 450 && !scoreRecords.some(function (record) {
return record.name === 'YOU';
})) {
scoreRecords.push(youScore);
} else if (!scoreRecords.some(function (record) {
return record.name === 'YOU';
})) {
scoreRecords.push(youScore);
scoreRecords = scoreRecords.slice(0, 10); // Limit to top 10 scores including the player
}
}
// Ensure names in the score table remain in the same order
var names = ['Verstappen', 'Leclerc', 'Norris', 'Colapinto', 'Sainz', 'Hamilton', 'Piastri', 'Russel', 'Tsunoda', 'Albon'];
var youIndex = scoreRecords.findIndex(function (record) {
return record.name === 'YOU';
});
for (var i = 0; i < scoreRecords.length; i++) {
if (i !== youIndex) {
scoreRecords[i].name = names[i < youIndex ? i : i - 1];
}
}
// Create a table for the score records
var scoreTable = new Container();
scoreTable.x = 2048 / 2 - 100;
scoreTable.y = 2732 / 2 - 650;
scoreTable.pivot.set(scoreTable.width / 2, 0);
// Add table headers
var headers = ["Rank", "Driver", "Time (s)"];
for (var i = 0; i < headers.length; i++) {
var headerText = new Text2(headers[i], {
size: 90,
fill: "#000000",
stroke: "#000000",
strokeThickness: 1,
font: "'Formula 1', sans-serif",
align: 'center'
});
headerText.x = i * 600 - 700 + (i === 0 ? 100 : 0); // Adjust spacing between columns, move rank header 100 pixels to the right
headerText.y = 0;
scoreTable.addChild(headerText);
}
// Add score records to the table
for (var i = 0; i < scoreRecords.length; i++) {
var rankText = new Text2(scoreRecords[i].name === 'YOU' && youScore.score > 450 ? scoreRecords.length.toString() : (i + 1).toString(), {
size: scoreRecords[i].name === 'YOU' ? 90 : 80,
// Increase size by 30% if it's the player
fill: scoreRecords[i].name === 'YOU' ? "#FF1801" : "#000000",
stroke: "#000000",
strokeThickness: 1,
font: "'Formula 1', sans-serif",
align: 'center'
});
rankText.x = -600; // Align rank column
rankText.y = (i + 1) * 100;
scoreTable.addChild(rankText);
if (scoreRecords[i].name && scoreRecords[i].name !== 'YOU') {
var flagBackground = LK.getAsset('flagBackground', {
anchorX: 0.5,
anchorY: 0.1,
x: -200,
y: (i + 1) * 100 + 18
});
scoreTable.addChild(flagBackground);
var flagAsset = LK.getAsset('flag_' + scoreRecords[i].name.toLowerCase(), {
anchorX: 0.5,
anchorY: 0.1,
x: -200,
y: (i + 1) * 100 + 20
});
scoreTable.addChild(flagAsset);
}
var nameText = new Text2(scoreRecords[i].name || "", {
size: scoreRecords[i].name === 'YOU' ? 90 : 80,
fill: scoreRecords[i].name === 'YOU' ? "#FF1801" : "#000000",
stroke: "#000000",
strokeThickness: 1,
font: "'Formula 1', sans-serif",
align: 'center'
});
nameText.x = -100; // Align name column
nameText.y = (i + 1) * 100;
scoreTable.addChild(nameText);
var timeText = new Text2((scoreRecords[i].score / 1000).toFixed(3) + "s", {
size: scoreRecords[i].name === 'YOU' ? 90 : 80,
fill: scoreRecords[i].name === 'YOU' ? "#FF1801" : "#000000",
stroke: "#000000",
strokeThickness: 1,
font: "'Formula 1', sans-serif",
align: 'center'
});
timeText.x = 500; // Align time column
timeText.y = (i + 1) * 100;
scoreTable.addChild(timeText);
}
if (youScore.score > 450 && !scoreRecords.some(function (record) {
return record.name === 'YOU';
})) {
var rankText = new Text2(scoreRecords.length.toString(), {
size: 90,
fill: "#FF1801",
stroke: "#000000",
strokeThickness: 0,
font: "'Formula 1', sans-serif",
align: 'center'
});
rankText.x = -600;
rankText.y = (scoreRecords.length + 1) * 100;
scoreTable.addChild(rankText);
var nameText = new Text2('YOU', {
size: 90,
fill: "#FF1801",
stroke: "#000000",
strokeThickness: 0,
font: "'Formula 1', sans-serif",
align: 'center'
});
nameText.x = -100;
nameText.y = (scoreRecords.length + 1) * 100;
scoreTable.addChild(nameText);
var timeText = new Text2((youScore.score / 1000).toFixed(3) + "s", {
size: 90,
fill: "#FF1801",
stroke: "#000000",
strokeThickness: 0,
font: "'Formula 1', sans-serif",
align: 'center'
});
timeText.x = 500;
timeText.y = (scoreRecords.length + 1) * 100;
scoreTable.addChild(timeText);
}
scoreTable.x = -scoreTable.width; // Start offscreen to the left
game.addChild(scoreTable);
// Animate the score table to its final position
var targetX = 2048 / 2 - 100;
var animationDuration = 60; // Duration in ticks (1 second)
var animationStep = (targetX - scoreTable.x) / animationDuration;
game.update = function () {
if (scoreTable.x < targetX) {
scoreTable.x += animationStep;
if (scoreTable.x >= targetX) {
scoreTable.x = targetX; // Ensure it stops exactly at the target position
}
}
};
// No background image needed for the records table
// Removed grid lines for the ranked table
LK.setTimeout(function () {
touchCount = 0; // Reset touch count
game.down = handleTap; // Re-enable tap
LK.showGameOver();
}, 5000); // Show game over after 5 seconds to allow time to read the scores
}
}
// Initialize light indicators
var lightIndicators = [];
var lightIndicators2 = [];
var lightBackgrounds = [];
var staticLightIndicators1 = [];
var staticLightIndicators2 = [];
for (var i = 0; i < 5; i++) {
var lightBackground = game.addChild(LK.getAsset('lightbackground', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2 + (i - 2) * 200,
y: 2732 / 2 - 70
}));
lightBackgrounds.push(lightBackground);
var lightIndicator = game.addChild(new LightIndicator());
lightIndicator.x = 2048 / 2 + (i - 2) * 200; // Position lights horizontally with some spacing
lightIndicator.y = 2732 / 2;
lightIndicator.setColor(0x9f9d9d); // Set initial light color to white
lightIndicators.push(lightIndicator);
var lightIndicator2 = game.addChild(new LightIndicator());
lightIndicator2.x = 2048 / 2 + (i - 2) * 200; // Position lights horizontally with some spacing
lightIndicator2.y = 2732 / 2 + 150; // Position the second line of lights 200px below the first line
lightIndicator2.setColor(0x9f9d9d); // Set initial light color to white
lightIndicators2.push(lightIndicator2);
// Add static lights
var staticLight1 = game.addChild(new LightIndicator());
staticLight1.x = 2048 / 2 + (i - 2) * 200; // Position lights horizontally with some spacing
staticLight1.y = 2732 / 2 - 150; // Position the first line of static lights 200px above the first line
staticLight1.setColor(0x9f9d9d); // Set initial light color to white
staticLightIndicators1.push(staticLight1);
var staticLight2 = game.addChild(new LightIndicator());
staticLight2.x = 2048 / 2 + (i - 2) * 200; // Position lights horizontally with some spacing
staticLight2.y = 2732 / 2 - 300; // Position the second line of static lights 400px above the first line
staticLight2.setColor(0x9f9d9d); // Set initial light color to white
staticLightIndicators2.push(staticLight2);
}
// Initialize reaction time text
reactionTimeText = new Text2('00.000', {
size: 200,
fill: "#000000"
});
reactionTimeText.anchor.set(0.5, 1);
reactionTimeText.y -= 250; // Move reaction time 400 pixels up
LK.gui.bottom.addChild(reactionTimeText);
// Add instruction text below the lights
var instructionText = new Text2("Tap to start the race. Tap again when the lights go out.", {
size: 70,
fill: "#000000",
font: "'Formula 1', sans-serif"
});
instructionText.anchor.set(0.5, 0);
instructionText.x = 2048 / 2;
instructionText.y = 2732 / 2 + 450;
game.addChild(instructionText);
// Add 'f1' asset to the top of the screen
var f1Asset = game.addChild(LK.getAsset('f1', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 400
}));
// Add 'centerAsset' to the center of the lights
var centerAsset = game.addChildAt(LK.getAsset('centerAsset', {
anchorX: 0.5,
anchorY: 0.5,
x: 2048 / 2,
y: 2732 / 2 - 60
}), 0);
// Set up event listeners
game.down = handleTap;
game.update = function () {
// Add a slight increase and decrease in size to the instruction text
instructionText.scale.x = 1 + 0.02 * Math.sin(LK.ticks / 20);
instructionText.scale.y = 1 + 0.02 * Math.sin(LK.ticks / 20);
// Update positions of elements moving offscreen
lightIndicators.forEach(function (lightIndicator) {
if (lightIndicator.update) {
lightIndicator.update();
}
});
lightIndicators2.forEach(function (lightIndicator) {
if (lightIndicator.update) {
lightIndicator.update();
}
});
staticLightIndicators1.forEach(function (lightIndicator) {
if (lightIndicator.update) {
lightIndicator.update();
}
});
staticLightIndicators2.forEach(function (lightIndicator) {
if (lightIndicator.update) {
lightIndicator.update();
}
});
lightBackgrounds.forEach(function (lightBackground) {
if (lightBackground.update) {
lightBackground.update();
}
});
if (centerAsset.update) {
centerAsset.update();
}
};