Code edit (1 edits merged)
Please save this source code
Code edit (1 edits merged)
Please save this source code
User prompt
increase speed of lighs moving out
User prompt
instead of destroying the lights, lightbackground and center asset, have them move offscreen to the right, at the same speed that the score records are moving in screen
User prompt
lights can turn off between 1 and 4 seconds
Code edit (4 edits merged)
Please save this source code
User prompt
player can only tap on the game twice. to start and stop time. after second touch, disable touch screen.
User prompt
do not allow player to touch screen again after reaction time is set
User prompt
Disable tap after second touch
User prompt
disaable tap after second touch
User prompt
reduce cell width
User prompt
reduce gridlines size to fit the current date better
User prompt
Draw the grid using assets for the ranked table. Need to see all the lines for the cels
User prompt
The table looks very retro. Lets replace the text line for an asset
User prompt
highligh you result in the ranked table
User prompt
Replace ------------------------------------ by an asset line
User prompt
show lines of the table, columns and rows
User prompt
add more space between each column in the records tabel
User prompt
remove flag text, just keep the image
User prompt
can we adjust the anchor of the flags so that they are aligned between rank and player in each row
User prompt
flag assets should be between the rank and the name
Code edit (1 edits merged)
Please save this source code
/****
* 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();
}
}; ===================================================================
--- original.js
+++ change.js
@@ -129,9 +129,9 @@
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 = 30; // Adjust speed as needed
+ var moveOffscreenSpeed = 40; // Adjust speed as needed
lightIndicators.forEach(function (lightIndicator) {
lightIndicator.update = function () {
lightIndicator.x += moveOffscreenSpeed;
if (lightIndicator.x > 2048 + lightIndicator.width) {