User prompt
- haz que levels no funcionen si su nivel anterior no tiene el levelendless en verdadero - Establece a arrow como el unico nivel jugable al inicio siendo el inicial y jugable - Endless mode solo se puede jugar si estan todas las variables endlessmode completas
User prompt
haz que arrow sea el primero en poder jugarse
User prompt
haz que levels no funcionen si su nivel anterior no tiene el levelendless en verdadero (Arrow es el inicial) (endless mode require todos los levelendless activos)
User prompt
cambia el texto de endless por endless (salto de linea) mode, en tipo center
User prompt
que este en center
User prompt
cambia el texto de endless por endless (salto de linea) mode
User prompt
agrega una variable boleana para los niveles llamada Level(arrow,saw,etc) en false. Exepto para endless
User prompt
aumenta el espaciado x entre level selectors
User prompt
Agrega a cada level selector su sprite con el mismo nombre
Code edit (1 edits merged)
Please save this source code
User prompt
mejora la disposición del menu select level
Code edit (1 edits merged)
Please save this source code
User prompt
corrige el bug que muestra el texto de segundos en todos los menus y no en el suyo
Code edit (1 edits merged)
Please save this source code
User prompt
ajusta la posición de los botones de menu
User prompt
haz lo siguiente cambia la posición de how to play buttom a select level menu
User prompt
haz que disminuya más rapido
User prompt
haz que la habilidad de hacerse pequeño solo funcione si energy es mayor a 0, haz que la habilidad de small disminuya energy en 1% or segundo
User prompt
Please fix the bug: 'Timeout.tick error: Graphics is not a constructor' in or related to this line: 'var pathGraphics = new Graphics();' Line Number: 172
User prompt
arregla el trazado de la linea
User prompt
Please fix the bug: 'Timeout.tick error: pathGraphics.lineStyle is not a function' in or related to this line: 'pathGraphics.lineStyle(2, 0xFF0000, 1); // Red color for the path' Line Number: 177
User prompt
Please fix the bug: 'Timeout.tick error: Graphics is not a constructor' in or related to this line: 'var pathGraphics = new Graphics();' Line Number: 172
User prompt
crea una logica para agregar un visualizador del camino que recorrera flecha
Code edit (1 edits merged)
Please save this source code
Code edit (2 edits merged)
Please save this source code
/**** * 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 Button = Container.expand(function (text, x, y, callback) { var self = Container.call(this); var buttonAsset = self.attachAsset('Buttom', { anchorX: 0.5, anchorY: 0.5, alpha: 0 }); buttonAsset.x = x; buttonAsset.y = y; var buttonText = new Text2(text, { size: 100, fill: 0xFFFFFF, font: "'Press Start 2P', cursive" }); buttonText.anchor.set(0.5, 0.5); buttonText.x = x; buttonText.y = y; self.addChild(buttonText); buttonAsset.down = callback; }); var EnemyArrow = Container.expand(function () { var self = Container.call(this); var bEnemyArrowGraphics = self.attachAsset('EnemyArrow', { anchorX: 0.5, anchorY: 0.5 }); enemyLogic(self); var angle = Math.atan2(player.y - self.y, player.x - self.x); var speed = 17; // Fixed speed for straight trajectory self.update = function () { if (!gamestart) { return; } self.x += Math.cos(angle) * speed; self.y += Math.sin(angle) * speed; self.rotation = angle; }; }); var EnemySaw = Container.expand(function () { var self = Container.call(this); var bEnemySawGraphics = self.attachAsset('EnemySaw', { anchorX: 0.5, anchorY: 0.5 }); enemyLogic(self); var angle = Math.atan2(player.y - self.y, player.x - self.x); var newAngle = null; // Variable to store new angle after pause var speed = 10; // Fixed speed for straight trajectory self.update = function () { if (!gamestart) { return; } // Check distance to player var distanceToPlayer = Math.sqrt(Math.pow(player.x - self.x, 2) + Math.pow(player.y - self.y, 2)); if (distanceToPlayer <= 450 && !self.hasPaused) { self.hasPaused = true; // Set the boolean to true to ensure it only happens once var originalSpeed = speed; // Store original speed speed = 0; LK.setTimeout(function () { speed = originalSpeed * 1.5; newAngle = Math.atan2(player.y - self.y, player.x - self.x); // Assign new angle towards player's position }, 2000); } var currentAngle = newAngle !== null ? newAngle : angle; // Use new angle if available self.x += Math.cos(currentAngle) * speed; self.y += Math.sin(currentAngle) * speed; self.rotation += 0.05; }; }); var EnemyStar = Container.expand(function () { var self = Container.call(this); var bEnemyStarGraphics = self.attachAsset('EnemyStar', { 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); var speed = 8.5 + Math.random(); // Add a random speed variation self.x += Math.cos(angle) * speed; self.y += Math.sin(angle) * speed; self.rotation += 0.03; // Add rotation logic similar to EnemySaw if (Math.abs(self.x - targetX) < 5 && Math.abs(self.y - targetY) < 5) { targetX = Math.random() * 2048; // Randomize new target position targetY = Math.random() * 2732; } }; }); 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; var allEnemies = enemyArrows.concat(enemySaw, enemyStars); for (var i = 0; i < allEnemies.length; i++) { if (self.intersects(allEnemies[i]) && !allEnemies[i].destroyed) { lifeQuantity = Math.max(0, lifeQuantity - 1); updateLifeIcons(); allEnemies[i].destroy(); if (enemyArrows.includes(allEnemies[i])) { enemyArrows.splice(enemyArrows.indexOf(allEnemies[i]), 1); } else if (enemySaw.includes(allEnemies[i])) { enemySaw.splice(enemySaw.indexOf(allEnemies[i]), 1); } else if (enemyStars.includes(allEnemies[i])) { enemyStars.splice(enemyStars.indexOf(allEnemies[i]), 1); } if (lifeQuantity === 0) { self.destroy(); gamestart = false; LK.showGameOver(); } 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 }); }); var TextElement = Container.expand(function (text, size, color, font, x, y) { var self = Container.call(this); var textElement = new Text2(text, { size: size, fill: color, font: font }); textElement.anchor.set(0.5, 0.5); textElement.x = x; textElement.y = y; self.addChild(textElement); }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000000 }); /**** * Game Code ****/ 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 TextElement('Select Level', 150, 0xFFFFFF, "'Press Start 2P', cursive", 2048 / 2, 500); selectLevelContainer.addChild(selectLevelTitle); // Add a back button to return to the main menu var backButton = new Button('Back', 2048 / 2, 2400, function (x, y, obj) { selectLevelContainer.visible = false; // Hide the select level page menuContainer.visible = true; // Show the main menu }); selectLevelContainer.addChild(backButton); // Add 'How to Play' button to the select level page var howToPlayButton = new Button('How to Play', 2048 / 2, 2100, function (x, y, obj) { // Add logic for how to play button }); selectLevelContainer.addChild(howToPlayButton); var levelNames = ['arrow', 'saw', 'star', 'endless']; // Ensure endless is last var levelSelectors = []; // Array to store level selectors for (var i = 0; i < levelNames.length; i++) { var levelSelector = LK.getAsset('Level' + levelNames[i].charAt(0).toUpperCase() + levelNames[i].slice(1), { anchorX: 0.5, anchorY: 0.5 }); levelSelector.x = 2048 / 2 - 800 + i * 800; // Increase horizontal spacing between level selectors levelSelector.y = 1300; // Align vertically levelSelector.levelType = levelNames[i]; levelSelector.down = function (index) { // Create a closure to capture the current index return function (x, y, obj) { if (index === 0 || index > 0 && levelSelectors[index - 1].levelType === 'endless' && LevelEndless) { gamestart = true; // Start the game selectLevelContainer.visible = false; // Hide the select level page levelID = index; // Update levelID based on the order of the level selector console.log("Starting level:", obj.levelType); // Log the selected level type } else { console.log("Previous level's endless mode not completed. Cannot start this level."); } }; }(i); // Pass the current index to the closure selectLevelContainer.addChild(levelSelector); // Add level text below each level selector var levelTextContent = levelNames[i] === 'endless' ? 'endless\nmode' : levelNames[i]; var levelText = new Text2(levelTextContent, { 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); levelSelector.levelText = levelText; // Store levelText in levelSelector levelSelectors.push(levelSelector); // Add to array } // Add scrolling functionality selectLevelContainer.down = function (x, y, obj) { var startX = x; var initialPositions = levelSelectors.map(function (selector) { return selector.x; }); selectLevelContainer.move = function (moveX, moveY, moveObj) { var deltaX = moveX - startX; for (var i = 0; i < levelSelectors.length; i++) { levelSelectors[i].x = initialPositions[i] + deltaX; levelSelectors[i].levelText.x = levelSelectors[i].x; // Move the text along with the selector } }; selectLevelContainer.up = function (upX, upY, upObj) { selectLevelContainer.move = null; selectLevelContainer.up = null; }; }; game.addChild(selectLevelContainer); } var levelID = 0; var LevelArrow = true; var LevelSaw = false; var LevelStar = false; var lifeQuantity = 3; var energyQuantity = 100; var gamestart = false; function enemyLogic(entity) { var spawnPositions = [{ x: Math.random() * 2000, y: 0 }, { x: Math.random() * 2000, y: 3000 }, { x: 0, y: Math.random() * 2000 }, { x: 3000, y: Math.random() * 2000 }]; var position = spawnPositions[Math.floor(Math.random() * spawnPositions.length)]; entity.x = position.x; entity.y = position.y; 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); timerTxt.visible = false; // Initially hide the timer text LK.gui.top.addChild(timerTxt); var elapsedTime = 0; var timerInterval = LK.setInterval(function () { if (!gamestart) { return; } // Ensure timer only updates when gamestart is true if (gamestart && !timerTxt.visible) { timerTxt.visible = true; // Show timer text when game starts } else if (!gamestart && timerTxt.visible) { timerTxt.visible = false; // Hide timer text when game is not started } 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; if (energyDecreaseInterval) { LK.clearInterval(energyDecreaseInterval); // Clear interval when player returns to normal size } }; game.down = function (x, y, obj) { if (energy.value > 0) { // Check if energy is greater than 0 player.scaleX = 0.5; player.scaleY = 0.5; energyDecreaseInterval = LK.setInterval(function () { energy.decrease(2); // Decrease energy by 2% energyText.setText(energy.value + '%'); // Update energy text if (energy.value <= 0) { player.scaleX = 1; // Reset player size if energy depletes player.scaleY = 1; LK.clearInterval(energyDecreaseInterval); // Clear interval } }, 1000); // Decrease energy every second } }; // Create a list to store EnemyArrow instances var enemyArrows = []; function spawnEnemy(type, interval, levelCheck, enemyArray, enemyClass) { return LK.setInterval(function () { if (!gamestart || !levelCheck()) { return; } var newEnemy = game.addChild(new enemyClass()); enemyArray.push(newEnemy); LK.setTimeout(function () { if (enemyArray.includes(newEnemy)) { newEnemy.destroy(); enemyArray.splice(enemyArray.indexOf(newEnemy), 1); } }, 20000); }, interval); } var enemySaw = []; var enemyStars = []; // New array to store EnemyStar instances var enemyArrowInterval = spawnEnemy('arrow', Math.random() * 275 + 500, function () { // Reduced interval time return levelID === 0 || levelID === 1; }, enemyArrows, EnemyArrow); var enemySawInterval = spawnEnemy('saw', 1000, function () { // Reduced interval to double spawn rate return levelID === 0 || levelID === 2; }, enemySaw, EnemySaw); var enemyStarInterval = spawnEnemy('star', 1500, function () { // New interval for EnemyStar return levelID === 0 || levelID === 3; // Check for 'star' level }, enemyStars, EnemyStar); 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 TextElement('Game Title', 150, 0xFFFFFF, "'Press Start 2P', cursive", 2048 / 2, 500); menuContainer.addChild(title); // Create buttons var startButton = new Button('Game Start', 2048 / 2, 1200, function (x, y, obj) { menuContainer.visible = false; // Hide the menu showSelectLevelPage(); // Redirect to 'select level' page }); menuContainer.addChild(startButton); var recordButton = new Button('Record', 2048 / 2, 1700, function (x, y, obj) { 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); LK.setTimeout(function () { game.removeChild(tempMessage); }, 3000); }); menuContainer.addChild(recordButton); var creditsButton = new Button('Credits', 2048 / 2, 2200, function (x, y, obj) { showCreditsPage(); }); menuContainer.addChild(creditsButton); function showCreditsPage() { // Create a new container for the credits page var creditsContainer = new Container(); // Add the credits background var creditsBackground = LK.getAsset('Credits', { anchorX: 0.5, anchorY: 0.5 }); creditsBackground.x = 2048 / 2; creditsBackground.y = 2732 / 2; creditsContainer.addChild(creditsBackground); // Add event listener to hide credits page on touch creditsBackground.down = function (x, y, obj) { creditsContainer.visible = false; // Hide the credits page menuContainer.visible = true; // Show the main menu }; // Add the credits page to the game game.addChild(creditsContainer); } game.addChild(menuContainer); ; // 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 TextElement('Records', 150, 0xFFFFFF, "'Press Start 2P', cursive", 2048 / 2, 500); recordsContainer.addChild(recordsTitle); 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); }
===================================================================
--- original.js
+++ change.js
@@ -246,9 +246,9 @@
var howToPlayButton = new Button('How to Play', 2048 / 2, 2100, function (x, y, obj) {
// Add logic for how to play button
});
selectLevelContainer.addChild(howToPlayButton);
- var levelNames = ['endless', 'arrow', 'saw', 'star']; // Removed 'ninja' level and kept 'star'
+ var levelNames = ['arrow', 'saw', 'star', 'endless']; // Ensure endless is last
var levelSelectors = []; // Array to store level selectors
for (var i = 0; i < levelNames.length; i++) {
var levelSelector = LK.getAsset('Level' + levelNames[i].charAt(0).toUpperCase() + levelNames[i].slice(1), {
anchorX: 0.5,
@@ -259,15 +259,15 @@
levelSelector.levelType = levelNames[i];
levelSelector.down = function (index) {
// Create a closure to capture the current index
return function (x, y, obj) {
- if (index === 0 || index > 0 && levelSelectors[index - 1].levelendless) {
+ if (index === 0 || index > 0 && levelSelectors[index - 1].levelType === 'endless' && LevelEndless) {
gamestart = true; // Start the game
selectLevelContainer.visible = false; // Hide the select level page
levelID = index; // Update levelID based on the order of the level selector
console.log("Starting level:", obj.levelType); // Log the selected level type
} else {
- console.log("Previous level not completed. Cannot start this level.");
+ console.log("Previous level's endless mode not completed. Cannot start this level.");
}
};
}(i); // Pass the current index to the closure
selectLevelContainer.addChild(levelSelector);
@@ -409,9 +409,9 @@
return levelID === 0 || levelID === 2;
}, enemySaw, EnemySaw);
var enemyStarInterval = spawnEnemy('star', 1500, function () {
// New interval for EnemyStar
- return levelID === 0 || levelID === 3 && LevelArrow && LevelSaw && LevelStar; // Check for 'star' level and ensure all levelendless are true for endless mode
+ return levelID === 0 || levelID === 3; // Check for 'star' level
}, enemyStars, EnemyStar);
var lifeIcons = [];
for (var i = 0; i < lifeQuantity; i++) {
var lifeIcon = game.addChild(new Life());