User prompt
Please fix the bug: 'Error: Invalid value. Only literals or 1-level deep objects/arrays containing literals are allowed.' in or related to this line: 'storage.records = records; // Save updated records to storage' Line Number: 149
User prompt
Please fix the bug: 'Error: Invalid value. Only literals or 1-level deep objects/arrays containing literals are allowed.' in or related to this line: 'storage.records = records; // Save updated records to storage' Line Number: 149
User prompt
Dale más estilo a la tabla
Code edit (1 edits merged)
Please save this source code
User prompt
haz que la variable lista records se guarde y cargue ↪💡 Consider importing and using the following plugins: @upit/storage.v1
Code edit (1 edits merged)
Please save this source code
User prompt
agrega records variale list un ejemplo de su funcionamiento
User prompt
haz que las filas de la tabla records sean de la variable de lista records, en la columna name que vaya nameplayer y best time, playertime y top el numero de posición de la lista segun su orden 1->10
User prompt
crea una lista llamada records con las siguientes especificaciones: - se agrupa por mejor intento - guarda nameplayer y playertime - se ordena en orden de 1->10 segun el que tenga mayor valor de playertime
User prompt
crea una variable tipo texto llamada "nameplayer" crea una variable tipo numerica para registrar el tiempo
Code edit (1 edits merged)
Please save this source code
User prompt
haz que cuando player muera y se detenga el juego salte un cuadro emergente pidiendo nombre al jugador
User prompt
disminuye el tamaño de los textos de la tabla y su posición para que no colicionen entre si
User prompt
mejora el tamaño, color y posición de la tabla de records
User prompt
ajusta tamaño y disposición de los textos de la tabla de records
User prompt
ajusta el tamaño y disposición de los textos
User prompt
crea una tabla en el menu record con las siguientes especificaciones: - Una columna con de top (un maximo de 10) - Una columna para name - Una columna para best time un maximo de 10 filas
User prompt
crea una nueva pagina por separado para records
User prompt
Please fix the bug: 'Cannot read properties of undefined (reading 'addChild')' in or related to this line: 'menuContainer.addChild(recordButtonAsset);' Line Number: 223
User prompt
Please fix the bug: 'Cannot read properties of undefined (reading 'addChild')' in or related to this line: 'menuContainer.addChild(recordButtonAsset);' Line Number: 223
User prompt
Please fix the bug: 'Cannot set properties of undefined (setting 'down')' in or related to this line: 'recordButtonAsset.down = function (x, y, obj) {' Line Number: 217
User prompt
crea un nuevo menu por separado para records con titulo de "Record menu" y en la parte inferior un buttom back menu
User prompt
haz que al presionar gamestart buttom desaparezca todo el menu
User prompt
agrega la transparencia de los botones a 0
User prompt
agrega buttom asset a los botones
/****
* Plugins
****/
var facekit = LK.import("@upit/facekit.v1");
/****
* Classes
****/
var Background = Container.expand(function () {
var self = Container.call(this);
var backgroundGraphics = self.attachAsset('Background', {
anchorX: 0.5,
anchorY: 0.5
});
self.x = 2048 / 2; // Set the x position to the center of the screen
self.y = 2732 / 2; // Set the y position to the center of the screen
});
var EnemyArrow = Container.expand(function () {
var self = Container.call(this);
var bEnemyArrowGraphics = self.attachAsset('EnemyArrow', {
anchorX: 0.5,
anchorY: 0.5
});
// Set the x and y position to a random value at the edges of the spawn area
enemyLogic(self);
var targetX = player.x;
var targetY = player.y;
self.update = function () {
if (!gamestart) {
return;
} // Ensure enemy logic only executes when gamestart is true
var dx = targetX - self.x;
var dy = targetY - self.y;
var angle = Math.atan2(dy, dx);
self.x += Math.cos(angle) * 7.5;
self.y += Math.sin(angle) * 7.5;
self.rotation = angle;
if (Math.abs(self.x - targetX) < 5 && Math.abs(self.y - targetY) < 5) {
targetX += Math.cos(angle) * 1000;
targetY += Math.sin(angle) * 1000;
}
// Check if the EnemyArrow has moved to the opposite side of its spawn point
if (self.x < 0 || self.x > 3000 || self.y < 0 || self.y > 3000) {
self.destroy(); // Remove the EnemyArrow from the game
}
};
});
var EnemySaw = Container.expand(function () {
var self = Container.call(this);
var bEnemySawGraphics = self.attachAsset('EnemySaw', {
anchorX: 0.5,
anchorY: 0.5
});
// Set the x and y position to a random value at the edges of the spawn area
enemyLogic(self);
var targetX = player.x;
var targetY = player.y;
self.update = function () {
if (!gamestart) {
return;
} // Ensure enemy logic only executes when gamestart is true
var dx = targetX - self.x;
var dy = targetY - self.y;
var angle = Math.atan2(dy, dx);
if (!self.stopSaw && !self.hasStopped && Math.sqrt(dx * dx + dy * dy) < 400) {
self.stopSaw = true;
self.hasStopped = true; // Ensure it only stops the first time
LK.setTimeout(function () {
self.stopSaw = false;
targetX = player.x;
targetY = player.y;
}, 2000);
}
if (!self.stopSaw) {
var speedMultiplier = self.hasStopped ? 1.5 : 1;
self.x += Math.cos(angle) * 7.5 * speedMultiplier;
self.y += Math.sin(angle) * 7.5 * speedMultiplier;
}
self.rotation += 0.03; // Add constant rotation to EnemySaw
if (Math.abs(self.x - targetX) < 5 && Math.abs(self.y - targetY) < 5) {
targetX += Math.cos(angle) * 1000;
targetY += Math.sin(angle) * 1000;
}
// Check if the EnemySaw has moved to the opposite side of its spawn point
if (self.x < 0 || self.x > 3000 || self.y < 0 || self.y > 3000) {
self.destroy(); // Remove the EnemySaw from the game
}
};
});
var Player = Container.expand(function () {
var self = Container.call(this);
var faceGraphics = self.attachAsset('faceObject', {
anchorX: 0.5,
anchorY: 0.5
});
self.update = function () {
// Define a smoothing factor
if (!gamestart) {
return;
} // Ensure playe05 movement only occurs when gamestart is true
var smoothing = 0.05;
// Update the position of the face follower to follow the nose tip with smoothing
var targetX = facekit.noseTip.x;
var targetY = facekit.noseTip.y;
// Adjust the range of movement for the faceFollower object to be within a square in the middle of the screen
var leftBound = (2048 - 1000) / 2;
var rightBound = leftBound + 1000;
var topBound = (2732 - 1000) / 2;
var bottomBound = topBound + 1000;
// Limit target position within the defined bounds
targetX = Math.max(leftBound, Math.min(rightBound, targetX));
targetY = Math.max(topBound, Math.min(bottomBound, targetY));
// Apply smoothing
self.x += (targetX - self.x) * smoothing;
self.y += (targetY - self.y) * smoothing;
// Check for collision with EnemyArrow
for (var i = 0; i < enemyArrows.length; i++) {
if (self.intersects(enemyArrows[i])) {
self.destroy(); // Eliminate player
gamestart = false; // Set gamestart to false
// Show a popup to ask for the player's name
var playerName = prompt("Enter your name:");
// Add the player's name and time to the records list
records.push({
name: playerName,
time: playerTime
});
// Sort the records list by time in descending order and keep only the top 10
records.sort(function (a, b) {
return b.time - a.time;
});
records = records.slice(0, 10);
// LK.showGameOver(); // End the game
break;
}
}
// Check for collision with EnemySaw
for (var i = 0; i < enemySaw.length; i++) {
if (self.intersects(enemySaw[i])) {
self.destroy(); // Eliminate player
gamestart = false; // Set gamestart to false
LK.showGameOver(); // End the game
break;
}
}
};
});
var RangedLimiter = Container.expand(function () {
var self = Container.call(this);
var limiterGraphics = self.attachAsset('RangedLimiter', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0.5
});
});
/****
* Initialize Game
****/
var game = new LK.Game({
backgroundColor: 0x000000
});
/****
* Game Code
****/
var nameplayer = ""; // Variable to store the player's name
var playerTime = 0; // Variable to track the player's time
var records = [{
name: "Player1",
time: 120
}, {
name: "Player2",
time: 110
}, {
name: "Player3",
time: 100
}, {
name: "Player4",
time: 90
}, {
name: "Player5",
time: 80
}, {
name: "Player6",
time: 70
}, {
name: "Player7",
time: 60
}, {
name: "Player8",
time: 50
}, {
name: "Player9",
time: 40
}, {
name: "Player10",
time: 30
}]; // List to store player records
var gamestart = false;
function enemyLogic(entity) {
var edge = Math.random();
if (edge < 0.25) {
// Top edge
entity.x = Math.random() * 2000;
entity.y = 0;
} else if (edge < 0.5) {
// Bottom edge
entity.x = Math.random() * 2000;
entity.y = 3000;
} else if (edge < 0.75) {
// Left edge
entity.x = 0;
entity.y = Math.random() * 2000;
} else {
// Right edge
entity.x = 3000;
entity.y = Math.random() * 2000;
}
// Allow specifying enemy spawn time, default to random between 2 and 4 seconds if not provided
entity.spawnTime = entity.spawnTime || Math.random() * 2000 + 2000;
}
var background = game.addChild(new Background());
// Create a timer text object
var timerTxt = new Text2('0', {
size: 100,
fill: 0xFFFFFF
});
// Set the anchor to the center of the top edge
timerTxt.anchor.set(0.5, 0);
// Add the timer text to the GUI overlay at the top-center of the screen
LK.gui.top.addChild(timerTxt);
// Initialize a variable to keep track of elapsed time
var elapsedTime = 0;
// Create a timer that updates every second
var timerInterval = LK.setInterval(function () {
if (!gamestart) {
return;
} // Ensure timer only updates when gamestart is true
elapsedTime++;
var minutes = Math.floor(elapsedTime / 60); // Calculate minutes
var seconds = elapsedTime % 60; // Calculate remaining seconds
var timeString = minutes > 0 ? minutes + "m " + seconds + "s" : seconds + "s"; // Format time string
timerTxt.setText(timeString);
}, 1000);
var player = game.addChild(new Player());
player.x = 2048 / 2; // Center the player on the x-axis
player.y = 2732 / 2; // Center the player on the y-axis
game.up = function (x, y, obj) {
player.scaleX = 1;
player.scaleY = 1;
};
game.down = function (x, y, obj) {
player.scaleX = 0.5;
player.scaleY = 0.5;
};
// Create a list to store EnemyArrow instances
var enemyArrows = [];
// Create a timer that creates a new EnemyArrow every random interval between 1 and 2 seconds
var enemyArrowInterval = LK.setInterval(function () {
if (!gamestart) {
return;
}
var enemyArrow = game.addChild(new EnemyArrow());
enemyArrows.push(enemyArrow); // Add the new EnemyArrow to the list
// Set a timeout to remove the EnemyArrow after 20 seconds
LK.setTimeout(function () {
if (enemyArrows.includes(enemyArrow)) {
enemyArrow.destroy();
enemyArrows.splice(enemyArrows.indexOf(enemyArrow), 1);
}
}, 20000);
}, Math.random() * 380 + 1000);
var enemySaw = [];
LK.setTimeout(function () {
var enemySawInterval = LK.setInterval(function () {
if (!gamestart) {
return;
}
var newEnemySaw = game.addChild(new EnemySaw());
enemySaw.push(newEnemySaw); // Add the new EnemySaw to the list
// Set a timeout to remove the EnemySaw after 20 seconds
LK.setTimeout(function () {
if (enemySaw.includes(newEnemySaw)) {
newEnemySaw.destroy();
enemySaw.splice(enemySaw.indexOf(newEnemySaw), 1);
}
}, 20000);
}, 1500 + 1000);
}, 5000); // Delay the start by 30 seconds
var rangerlimited = game.addChild(new RangedLimiter());
rangerlimited.x = 2048 / 2; // Center the RangedLimiter on the x-axis
rangerlimited.y = 2732 / 2; // Center the RangedLimiter on the y-axis
// Create an initial menu
var menuContainer = new Container();
// Add a black background to the menu
var menuBackground = LK.getAsset('BackgroundMenu', {
anchorX: 0.5,
anchorY: 0.5
});
menuBackground.x = 2048 / 2;
menuBackground.y = 2732 / 2;
menuContainer.addChild(menuBackground);
// Add a title to the menu
var title = new Text2('Game Title', {
size: 150,
fill: 0xFFFFFF,
font: "'Press Start 2P', cursive" // Arcade style font
});
title.anchor.set(0.5, 0.5);
title.x = 2048 / 2;
title.y = 500;
menuContainer.addChild(title);
// Create buttons
var startButtonAsset = LK.getAsset('Buttom', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0 // Set transparency to 0
});
startButtonAsset.x = 2048 / 2;
startButtonAsset.y = 1000;
menuContainer.addChild(startButtonAsset);
var startButton = new Text2('Game Start', {
size: 100,
fill: 0xFFFFFF,
font: "'Press Start 2P', cursive" // Arcade style font
});
startButton.anchor.set(0.5, 0.5);
startButton.x = 2048 / 2;
startButton.y = 1000;
menuContainer.addChild(startButton);
var recordButtonAsset = LK.getAsset('Buttom', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0 // Set transparency to 0
});
recordButtonAsset.x = 2048 / 2;
recordButtonAsset.y = 1300;
menuContainer.addChild(recordButtonAsset);
var recordButton = new Text2('Record', {
size: 100,
fill: 0xFFFFFF,
font: "'Press Start 2P', cursive" // Arcade style font
});
recordButton.anchor.set(0.5, 0.5);
recordButton.x = 2048 / 2;
recordButton.y = 1300;
menuContainer.addChild(recordButton);
var howToPlayButtonAsset = LK.getAsset('Buttom', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0 // Set transparency to 0
});
howToPlayButtonAsset.x = 2048 / 2;
howToPlayButtonAsset.y = 1600;
menuContainer.addChild(howToPlayButtonAsset);
var howToPlayButton = new Text2('How to Play', {
size: 100,
fill: 0xFFFFFF,
font: "'Press Start 2P', cursive" // Arcade style font
});
howToPlayButton.anchor.set(0.5, 0.5);
howToPlayButton.x = 2048 / 2;
howToPlayButton.y = 1600;
menuContainer.addChild(howToPlayButton);
var creditsButtonAsset = LK.getAsset('Buttom', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0 // Set transparency to 0
});
creditsButtonAsset.x = 2048 / 2;
creditsButtonAsset.y = 1900;
menuContainer.addChild(creditsButtonAsset);
var creditsButton = new Text2('Credits', {
size: 100,
fill: 0xFFFFFF,
font: "'Press Start 2P', cursive" // Arcade style font
});
creditsButton.anchor.set(0.5, 0.5);
creditsButton.x = 2048 / 2;
creditsButton.y = 1900;
menuContainer.addChild(creditsButton);
game.addChild(menuContainer);
;
// Add event listener to 'Record' button
recordButtonAsset.down = function (x, y, obj) {
showRecordsPage(); // Show the records page
};
// Function to display the records page
function showRecordsPage() {
// Create a new container for the records page
var recordsContainer = new Container();
// Add a black background to the records page
var recordsBackground = LK.getAsset('BackgroundMenu', {
anchorX: 0.5,
anchorY: 0.5
});
recordsBackground.x = 2048 / 2;
recordsBackground.y = 2732 / 2;
recordsContainer.addChild(recordsBackground);
// Add a title to the records page
var recordsTitle = new Text2('Records', {
size: 150,
fill: 0xFFFFFF,
font: "'Press Start 2P', cursive"
});
recordsTitle.anchor.set(0.5, 0.5);
recordsTitle.x = 2048 / 2;
recordsTitle.y = 500;
recordsContainer.addChild(recordsTitle);
// Create a table for the records
var tableStartY = 700;
var rowHeight = 150;
var columnWidths = [200, 800, 400]; // Widths for Top, Name, Best Time columns
// Add table headers
var headers = ['Top', 'Name', 'Best Time'];
for (var i = 0; i < headers.length; i++) {
var header = new Text2(headers[i], {
size: 60,
fill: 0xFFFFFF,
font: "'Press Start 2P', cursive"
});
header.anchor.set(0.5, 0.5);
header.x = 2048 / 2 - 600 + columnWidths.slice(0, i).reduce(function (a, b) {
return a + b;
}, 0) + columnWidths[i] / 2;
header.y = tableStartY;
recordsContainer.addChild(header);
}
// Add table rows
for (var row = 0; row < 10; row++) {
for (var col = 0; col < headers.length; col++) {
var cellText = '';
if (row < records.length) {
if (col === 0) {
cellText = (row + 1).toString(); // Top position
} else if (col === 1) {
cellText = records[row].name; // Player name
} else if (col === 2) {
cellText = records[row].time.toString(); // Best time
}
}
var cell = new Text2(cellText, {
size: 80,
fill: 0xFFFFFF,
font: "'Press Start 2P', cursive"
});
cell.anchor.set(0.5, 0.5);
cell.x = 2048 / 2 - 600 + columnWidths.slice(0, col).reduce(function (a, b) {
return a + b;
}, 0) + columnWidths[col] / 2;
cell.y = tableStartY + (row + 1) * rowHeight;
recordsContainer.addChild(cell);
}
}
// Add a back button to return to the main menu
var backButtonAsset = LK.getAsset('Buttom', {
anchorX: 0.5,
anchorY: 0.5,
alpha: 0
});
backButtonAsset.x = 2048 / 2;
backButtonAsset.y = 2300;
recordsContainer.addChild(backButtonAsset);
var backButton = new Text2('Back', {
size: 100,
fill: 0xFFFFFF,
font: "'Press Start 2P', cursive"
});
backButton.anchor.set(0.5, 0.5);
backButton.x = 2048 / 2;
backButton.y = 2400;
recordsContainer.addChild(backButton);
// Add event listener to 'Back' button
backButtonAsset.down = function (x, y, obj) {
recordsContainer.visible = false; // Hide the records page
menuContainer.visible = true; // Show the main menu
};
// Add the records page to the game
game.addChild(recordsContainer);
}
// Add event listener to 'Game Start' button
startButtonAsset.down = function (x, y, obj) {
menuContainer.visible = false; // Hide the menu
gamestart = true; // Start the game
}; ===================================================================
--- original.js
+++ change.js
@@ -468,9 +468,9 @@
font: "'Press Start 2P', cursive"
});
backButton.anchor.set(0.5, 0.5);
backButton.x = 2048 / 2;
- backButton.y = 2300;
+ backButton.y = 2400;
recordsContainer.addChild(backButton);
// Add event listener to 'Back' button
backButtonAsset.down = function (x, y, obj) {
recordsContainer.visible = false; // Hide the records page