User prompt
haz que enemyninja cuando este a más de 400 pixeles de player se divida en 2 a 45 grados menos y más de la nueva posición de layer
User prompt
haz que enemyninja colisione con player
Code edit (3 edits merged)
Please save this source code
User prompt
haz que enemyninja gire
User prompt
agrega una rotacion a enemy ninja ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
agrega un nuevo enemigo llamado EnemiNinja para id 3
User prompt
agrega un nuevo levels selector con el id 3
Code edit (1 edits merged)
Please save this source code
User prompt
haz que saw aparezca desde el inicio en su nivel
User prompt
saw en endles mode aparece desde el inicio
User prompt
cuando levelid 0 saw aparece a partir de los 15 segundos, cuando es 2, aparece a partir del inicio
User prompt
haz que saw en nivel 0 empiece a aparecer despues de los 15 segundos, en cambio, en nivel 1 aparezca desde el inicio y con mayor frecuencia
User prompt
saw aparece muy pronto en nivel 0 y no despues de los 15 segundos
User prompt
arregla el bug que hace que nunca aparezca saw enemi en level 2
User prompt
saw nunca aparece en level 2
User prompt
si levelId es 2 saw aparece desde el incio si levelID es 0 aparece despues de 15 segundos
User prompt
repite lo mismo para saw para 0 o 2
User prompt
agregale a la función de aparición de arrow para que solo funcione si level id es igual a 0 o 1
User prompt
haz una función reusable para los select level para que cambien leveliD segun su orden de izquierda a derecha
User prompt
agrega una valiable numerica levelID
User prompt
haz que la lista de levelid sea variables numericas
User prompt
Please fix the bug: 'Timeout.tick error: levelID is not defined' in or related to this line: 'if (!gamestart || levelID !== 0 && levelID !== 1) {' Line Number: 375
User prompt
agrega una logica a la aparición de arrow para que solo funcione si estan en levelID 0 o 1
User prompt
crea una variable levelID y agrega endless como 0, arrow 1 y saw 2
User prompt
al iniciar el gamestart que aparezcan enemigo segun la id, endless todos, arrow solo arrow y saw -> saw y que las guarde en sus listas
/**** * Plugins ****/ var facekit = LK.import("@upit/facekit.v1"); var storage = LK.import("@upit/storage.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 }); enemyLogic(self); var targetX = player.x; var targetY = player.y; self.update = function () { if (!gamestart) { return; } var dx = targetX - self.x; var dy = targetY - self.y; var angle = Math.atan2(dy, dx); self.x += Math.cos(angle) * 8.5; self.y += Math.sin(angle) * 8.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; } 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 }); enemyLogic(self); var targetX = player.x; var targetY = player.y; self.update = function () { if (!gamestart) { return; } 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) < 100) { self.stopSaw = true; self.hasStopped = true; 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; 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(); } }; }); var Energy = Container.expand(function () { var self = Container.call(this); var energyGraphics = self.attachAsset('Energy', { anchorX: 0.5, anchorY: 0.5 }); self.value = 100; // Initial energy value self.decrease = function (amount) { self.value = Math.max(0, self.value - amount); }; self.increase = function (amount) { self.value = Math.min(100, self.value + amount); }; }); var Life = Container.expand(function () { var self = Container.call(this); var lifeGraphics = self.attachAsset('Life', { anchorX: 0.5, anchorY: 0.5 }); self.value = 100; // Initial life value self.decrease = function (amount) { self.value = Math.max(0, self.value - amount); if (self.value === 0) { lifeQuantity = Math.max(0, lifeQuantity - 1); updateLifeIcons(); if (lifeQuantity === 0) { self.destroy(); LK.showGameOver(); } } }; self.increase = function (amount) { self.value = Math.min(100, self.value + amount); }; }); var Player = Container.expand(function () { var self = Container.call(this); var faceGraphics = self.attachAsset('faceObject', { anchorX: 0.5, anchorY: 0.5 }); self.update = function () { if (!gamestart) { return; } var smoothing = 0.05; var targetX = facekit.noseTip.x; var targetY = facekit.noseTip.y; var leftBound = (2048 - 1000) / 2; var rightBound = leftBound + 1000; var topBound = (2732 - 1000) / 2; var bottomBound = topBound + 1000; targetX = Math.max(leftBound, Math.min(rightBound, targetX)); targetY = Math.max(topBound, Math.min(bottomBound, targetY)); self.x += (targetX - self.x) * smoothing; self.y += (targetY - self.y) * smoothing; for (var i = 0; i < enemyArrows.length; i++) { if (self.intersects(enemyArrows[i])) { lifeQuantity = Math.max(0, lifeQuantity - 1); updateLifeIcons(); enemyArrows[i].destroy(); // Destroy the enemy arrow enemyArrows.splice(i, 1); // Remove the enemy arrow from the array if (lifeQuantity === 0) { self.destroy(); // Eliminate player LK.showGameOver(); // End the game } break; } } for (var i = 0; i < enemySaw.length; i++) { if (self.intersects(enemySaw[i])) { lifeQuantity = Math.max(0, lifeQuantity - 1); updateLifeIcons(); enemySaw[i].destroy(); // Destroy the enemy saw enemySaw.splice(i, 1); // Remove the enemy saw from the array if (lifeQuantity === 0) { 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 levelID = null; // Variable to store the current level ID function showSelectLevelPage() { // Create a new container for the select level page var selectLevelContainer = new Container(); // Add a background to the select level page var selectLevelBackground = LK.getAsset('BackgroundMenu', { anchorX: 0.5, anchorY: 0.5 }); selectLevelBackground.x = 2048 / 2; selectLevelBackground.y = 2732 / 2; selectLevelContainer.addChild(selectLevelBackground); // Add a title to the select level page var selectLevelTitle = new Text2('Select Level', { size: 150, fill: 0xFFFFFF, font: "'Press Start 2P', cursive" }); selectLevelTitle.anchor.set(0.5, 0.5); selectLevelTitle.x = 2048 / 2; selectLevelTitle.y = 500; selectLevelContainer.addChild(selectLevelTitle); // 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; selectLevelContainer.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; selectLevelContainer.addChild(backButton); // Add event listener to 'Back' button backButtonAsset.down = function (x, y, obj) { selectLevelContainer.visible = false; // Hide the select level page menuContainer.visible = true; // Show the main menu }; // Add level selectors var levelNames = ['endless', 'arrow', 'saw']; var levelIDs = { endless: 0, arrow: 1, saw: 2 }; // Assign IDs to levels for (var i = 0; i < levelNames.length; i++) { var levelSelector = LK.getAsset('level', { anchorX: 0.5, anchorY: 0.5 }); levelSelector.x = 2048 / 2 - 600 + i * 600; // Position each level selector in a row levelSelector.y = 1500; // Align vertically levelSelector.levelType = levelNames[i]; // Assign level type to selector // Add interaction to start the game when a level is selected levelSelector.down = function (x, y, obj) { gamestart = true; // Start the game selectLevelContainer.visible = false; // Hide the select level page levelID = levelIDs[obj.levelType]; // Set levelID based on selected level type console.log("Starting level:", obj.levelType, "with ID:", levelID); // Log the selected level type and ID // Additional logic to initialize the selected level can be added here }; selectLevelContainer.addChild(levelSelector); // Add level text below each level selector var levelText = new Text2(levelNames[i], { size: 80, fill: 0xFFFFFF, font: "'Press Start 2P', cursive" }); levelText.anchor.set(0.5, 0.5); levelText.x = levelSelector.x; levelText.y = levelSelector.y + 300; // Position text below the selector selectLevelContainer.addChild(levelText); } // Add the select level page to the game game.addChild(selectLevelContainer); } var nameplayer = "aaa"; // Variable to store the player's name var playerTime = 0; // Variable to track the player's time var records = storage.records || [{ name: "kaoshi", time: 120 }, { name: "Slime", time: 110 }, { name: "Pepe", time: 100 }, { name: "Arturo", time: 90 }, { name: "Juan", time: 80 }, { name: "NoSe", time: 70 }, { name: "JJAJA", time: 60 }, { name: "Alguien", time: 50 }, { name: "Leera", time: 40 }]; // List to store player records records = storage.records || records; var lifeQuantity = 3; // Initial life quantity var energyQuantity = 100; // Initial energy quantity var gamestart = false; function enemyLogic(entity) { var edge = Math.random(); if (edge < 0.25) { entity.x = Math.random() * 2000; entity.y = 0; } else if (edge < 0.5) { entity.x = Math.random() * 2000; entity.y = 3000; } else if (edge < 0.75) { entity.x = 0; entity.y = Math.random() * 2000; } else { entity.x = 3000; entity.y = Math.random() * 2000; } entity.spawnTime = entity.spawnTime || Math.random() * 2000 + 2000; } var background = game.addChild(new Background()); var timerTxt = new Text2('0', { size: 100, fill: 0xFFFFFF }); timerTxt.anchor.set(0.5, 0); LK.gui.top.addChild(timerTxt); var elapsedTime = 0; 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 = []; var enemyArrows = []; var enemySaw = []; function initializeEnemies() { if (levelID === 0) { // Endless mode for (var i = 0; i < 5; i++) { var arrow = game.addChild(new EnemyArrow()); enemyArrows.push(arrow); var saw = game.addChild(new EnemySaw()); enemySaw.push(saw); } } else if (levelID === 1) { // Arrow mode for (var i = 0; i < 5; i++) { var arrow = game.addChild(new EnemyArrow()); enemyArrows.push(arrow); } } else if (levelID === 2) { // Saw mode for (var i = 0; i < 5; i++) { var saw = game.addChild(new EnemySaw()); enemySaw.push(saw); } } } initializeEnemies(); var lifeIcons = []; for (var i = 0; i < lifeQuantity; i++) { var lifeIcon = game.addChild(new Life()); lifeIcon.x = 2048 / 2 - 600 + i * 160; // Position each life icon to the right of the previous one lifeIcon.y = 100; // Align vertically with the timer lifeIcons.push(lifeIcon); } // Function to update life icons when life decreases function updateLifeIcons() { for (var i = 0; i < lifeIcons.length; i++) { if (i < lifeQuantity) { lifeIcons[i].visible = true; } else { lifeIcons[i].visible = false; } } } var energy = game.addChild(new Energy()); energy.x = 2048 / 2 + 600; // Position energy to the right of the timer energy.y = 100; // Align vertically with the timer var energyText = new Text2(energyQuantity + '%', { size: 80, fill: 0xFFFFFF }); energyText.anchor.set(1, 0.5); // Anchor to the right center energyText.x = energy.x - 100; // Position to the left of energy energyText.y = energy.y; game.addChild(energyText); 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(); /* * Menu inicial */ 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) { // Create a temporary text message var tempMessage = new Text2('Option not yet implemented due to engine errors', { size: 40, fill: 0xFF0000, font: "'Press Start 2P', cursive" }); tempMessage.anchor.set(0.5, 0.5); tempMessage.x = 2048 / 2; tempMessage.y = 2732 - 300; // Position at the bottom of the screen game.addChild(tempMessage); // Set a timeout to remove the message after a few seconds LK.setTimeout(function () { game.removeChild(tempMessage); }, 3000); }; // 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); } startButtonAsset.down = function (x, y, obj) { menuContainer.visible = false; // Hide the menu // Redirect to 'select level' page showSelectLevelPage(); };
/****
* Plugins
****/
var facekit = LK.import("@upit/facekit.v1");
var storage = LK.import("@upit/storage.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
});
enemyLogic(self);
var targetX = player.x;
var targetY = player.y;
self.update = function () {
if (!gamestart) {
return;
}
var dx = targetX - self.x;
var dy = targetY - self.y;
var angle = Math.atan2(dy, dx);
self.x += Math.cos(angle) * 8.5;
self.y += Math.sin(angle) * 8.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;
}
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
});
enemyLogic(self);
var targetX = player.x;
var targetY = player.y;
self.update = function () {
if (!gamestart) {
return;
}
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) < 100) {
self.stopSaw = true;
self.hasStopped = true;
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;
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();
}
};
});
var Energy = Container.expand(function () {
var self = Container.call(this);
var energyGraphics = self.attachAsset('Energy', {
anchorX: 0.5,
anchorY: 0.5
});
self.value = 100; // Initial energy value
self.decrease = function (amount) {
self.value = Math.max(0, self.value - amount);
};
self.increase = function (amount) {
self.value = Math.min(100, self.value + amount);
};
});
var Life = Container.expand(function () {
var self = Container.call(this);
var lifeGraphics = self.attachAsset('Life', {
anchorX: 0.5,
anchorY: 0.5
});
self.value = 100; // Initial life value
self.decrease = function (amount) {
self.value = Math.max(0, self.value - amount);
if (self.value === 0) {
lifeQuantity = Math.max(0, lifeQuantity - 1);
updateLifeIcons();
if (lifeQuantity === 0) {
self.destroy();
LK.showGameOver();
}
}
};
self.increase = function (amount) {
self.value = Math.min(100, self.value + amount);
};
});
var Player = Container.expand(function () {
var self = Container.call(this);
var faceGraphics = self.attachAsset('faceObject', {
anchorX: 0.5,
anchorY: 0.5
});
self.update = function () {
if (!gamestart) {
return;
}
var smoothing = 0.05;
var targetX = facekit.noseTip.x;
var targetY = facekit.noseTip.y;
var leftBound = (2048 - 1000) / 2;
var rightBound = leftBound + 1000;
var topBound = (2732 - 1000) / 2;
var bottomBound = topBound + 1000;
targetX = Math.max(leftBound, Math.min(rightBound, targetX));
targetY = Math.max(topBound, Math.min(bottomBound, targetY));
self.x += (targetX - self.x) * smoothing;
self.y += (targetY - self.y) * smoothing;
for (var i = 0; i < enemyArrows.length; i++) {
if (self.intersects(enemyArrows[i])) {
lifeQuantity = Math.max(0, lifeQuantity - 1);
updateLifeIcons();
enemyArrows[i].destroy(); // Destroy the enemy arrow
enemyArrows.splice(i, 1); // Remove the enemy arrow from the array
if (lifeQuantity === 0) {
self.destroy(); // Eliminate player
LK.showGameOver(); // End the game
}
break;
}
}
for (var i = 0; i < enemySaw.length; i++) {
if (self.intersects(enemySaw[i])) {
lifeQuantity = Math.max(0, lifeQuantity - 1);
updateLifeIcons();
enemySaw[i].destroy(); // Destroy the enemy saw
enemySaw.splice(i, 1); // Remove the enemy saw from the array
if (lifeQuantity === 0) {
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 levelID = null; // Variable to store the current level ID
function showSelectLevelPage() {
// Create a new container for the select level page
var selectLevelContainer = new Container();
// Add a background to the select level page
var selectLevelBackground = LK.getAsset('BackgroundMenu', {
anchorX: 0.5,
anchorY: 0.5
});
selectLevelBackground.x = 2048 / 2;
selectLevelBackground.y = 2732 / 2;
selectLevelContainer.addChild(selectLevelBackground);
// Add a title to the select level page
var selectLevelTitle = new Text2('Select Level', {
size: 150,
fill: 0xFFFFFF,
font: "'Press Start 2P', cursive"
});
selectLevelTitle.anchor.set(0.5, 0.5);
selectLevelTitle.x = 2048 / 2;
selectLevelTitle.y = 500;
selectLevelContainer.addChild(selectLevelTitle);
// 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;
selectLevelContainer.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;
selectLevelContainer.addChild(backButton);
// Add event listener to 'Back' button
backButtonAsset.down = function (x, y, obj) {
selectLevelContainer.visible = false; // Hide the select level page
menuContainer.visible = true; // Show the main menu
};
// Add level selectors
var levelNames = ['endless', 'arrow', 'saw'];
var levelIDs = {
endless: 0,
arrow: 1,
saw: 2
}; // Assign IDs to levels
for (var i = 0; i < levelNames.length; i++) {
var levelSelector = LK.getAsset('level', {
anchorX: 0.5,
anchorY: 0.5
});
levelSelector.x = 2048 / 2 - 600 + i * 600; // Position each level selector in a row
levelSelector.y = 1500; // Align vertically
levelSelector.levelType = levelNames[i]; // Assign level type to selector
// Add interaction to start the game when a level is selected
levelSelector.down = function (x, y, obj) {
gamestart = true; // Start the game
selectLevelContainer.visible = false; // Hide the select level page
levelID = levelIDs[obj.levelType]; // Set levelID based on selected level type
console.log("Starting level:", obj.levelType, "with ID:", levelID); // Log the selected level type and ID
// Additional logic to initialize the selected level can be added here
};
selectLevelContainer.addChild(levelSelector);
// Add level text below each level selector
var levelText = new Text2(levelNames[i], {
size: 80,
fill: 0xFFFFFF,
font: "'Press Start 2P', cursive"
});
levelText.anchor.set(0.5, 0.5);
levelText.x = levelSelector.x;
levelText.y = levelSelector.y + 300; // Position text below the selector
selectLevelContainer.addChild(levelText);
}
// Add the select level page to the game
game.addChild(selectLevelContainer);
}
var nameplayer = "aaa"; // Variable to store the player's name
var playerTime = 0; // Variable to track the player's time
var records = storage.records || [{
name: "kaoshi",
time: 120
}, {
name: "Slime",
time: 110
}, {
name: "Pepe",
time: 100
}, {
name: "Arturo",
time: 90
}, {
name: "Juan",
time: 80
}, {
name: "NoSe",
time: 70
}, {
name: "JJAJA",
time: 60
}, {
name: "Alguien",
time: 50
}, {
name: "Leera",
time: 40
}]; // List to store player records
records = storage.records || records;
var lifeQuantity = 3; // Initial life quantity
var energyQuantity = 100; // Initial energy quantity
var gamestart = false;
function enemyLogic(entity) {
var edge = Math.random();
if (edge < 0.25) {
entity.x = Math.random() * 2000;
entity.y = 0;
} else if (edge < 0.5) {
entity.x = Math.random() * 2000;
entity.y = 3000;
} else if (edge < 0.75) {
entity.x = 0;
entity.y = Math.random() * 2000;
} else {
entity.x = 3000;
entity.y = Math.random() * 2000;
}
entity.spawnTime = entity.spawnTime || Math.random() * 2000 + 2000;
}
var background = game.addChild(new Background());
var timerTxt = new Text2('0', {
size: 100,
fill: 0xFFFFFF
});
timerTxt.anchor.set(0.5, 0);
LK.gui.top.addChild(timerTxt);
var elapsedTime = 0;
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 = [];
var enemyArrows = [];
var enemySaw = [];
function initializeEnemies() {
if (levelID === 0) {
// Endless mode
for (var i = 0; i < 5; i++) {
var arrow = game.addChild(new EnemyArrow());
enemyArrows.push(arrow);
var saw = game.addChild(new EnemySaw());
enemySaw.push(saw);
}
} else if (levelID === 1) {
// Arrow mode
for (var i = 0; i < 5; i++) {
var arrow = game.addChild(new EnemyArrow());
enemyArrows.push(arrow);
}
} else if (levelID === 2) {
// Saw mode
for (var i = 0; i < 5; i++) {
var saw = game.addChild(new EnemySaw());
enemySaw.push(saw);
}
}
}
initializeEnemies();
var lifeIcons = [];
for (var i = 0; i < lifeQuantity; i++) {
var lifeIcon = game.addChild(new Life());
lifeIcon.x = 2048 / 2 - 600 + i * 160; // Position each life icon to the right of the previous one
lifeIcon.y = 100; // Align vertically with the timer
lifeIcons.push(lifeIcon);
}
// Function to update life icons when life decreases
function updateLifeIcons() {
for (var i = 0; i < lifeIcons.length; i++) {
if (i < lifeQuantity) {
lifeIcons[i].visible = true;
} else {
lifeIcons[i].visible = false;
}
}
}
var energy = game.addChild(new Energy());
energy.x = 2048 / 2 + 600; // Position energy to the right of the timer
energy.y = 100; // Align vertically with the timer
var energyText = new Text2(energyQuantity + '%', {
size: 80,
fill: 0xFFFFFF
});
energyText.anchor.set(1, 0.5); // Anchor to the right center
energyText.x = energy.x - 100; // Position to the left of energy
energyText.y = energy.y;
game.addChild(energyText);
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();
/*
* Menu inicial
*/
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) {
// Create a temporary text message
var tempMessage = new Text2('Option not yet implemented due to engine errors', {
size: 40,
fill: 0xFF0000,
font: "'Press Start 2P', cursive"
});
tempMessage.anchor.set(0.5, 0.5);
tempMessage.x = 2048 / 2;
tempMessage.y = 2732 - 300; // Position at the bottom of the screen
game.addChild(tempMessage);
// Set a timeout to remove the message after a few seconds
LK.setTimeout(function () {
game.removeChild(tempMessage);
}, 3000);
};
// 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);
}
startButtonAsset.down = function (x, y, obj) {
menuContainer.visible = false; // Hide the menu
// Redirect to 'select level' page
showSelectLevelPage();
};