User prompt
aunque los niveles esten completados estos no entran en el modo endless
Code edit (1 edits merged)
Please save this source code
User prompt
agrega 3 ejemplos de records para cada apartado
User prompt
haz en el menu record una interfaz para los records de cada nivel haz que se pueda aternar con los record de cana nivel haz que salga una tabla con intentos y records ordena la tabla del mayor a menor haz que tengan un limite de 10 records cada una guarda los records de cada una en una lista ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
haz en el menu record una interfaz para los records de cada nivel y crea listas para ello para crear las tablas
Code edit (1 edits merged)
Please save this source code
User prompt
corrige el error que hace que el nivel endless mode diga endless arrow
User prompt
haz que se pueda acceder al menu records
Code edit (4 edits merged)
Please save this source code
User prompt
copia la logica de arrow level a saw y star
User prompt
haz que range tenga un efecto de pulsación de transparencia con el plugins tweet en bucle ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
si levelcompletedarrow es true, el nivel es infinito y no termina en 30s si levelcompletedarrow es true, el texto arrow pasa a decir Endless (salto de linea) arrow
Code edit (1 edits merged)
Please save this source code
User prompt
Haz que arrow level si su variable completed es verdadera que se muestre con el asset levelArrowEndless
User prompt
carga la variable levelcompletedarrow ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
haz que al completar arrowlevel, levelcompleted arrow sea verdadero y guarda esta variable en la nube ↪💡 Consider importing and using the following plugins: @upit/storage.v1
User prompt
crea variables levelCompleted
User prompt
haz que los niveles arrow, saw y ninja al llegar a los 30s se comleten y ganes
User prompt
Elimina las variables endless level
User prompt
corrige el bug que hace que arrow level sea jugable aunque tutorial completed es falso
User prompt
arrow level siendo sigue jugable aunque tutorialcomleted es falso
User prompt
haz que arrowlevel se pueda jugar si completed tutorial es verdadero, si no se puede jugar que se muestre con el asset levelbloq, si no, con su asset correspondido
Code edit (1 edits merged)
Please save this source code
User prompt
crea una variable completedTutorial en false
User prompt
haz un tutorial para enseñar el movimiento y las mecanicas del juego
/**** * 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 = ['tutorial', 'arrow', 'saw', 'star', 'endless']; // Ensure endless is last function showTutorial() { var tutorialContainer = new Container(); var tutorialBackground = LK.getAsset('Background', { anchorX: 0.5, anchorY: 0.5 }); tutorialBackground.x = 2048 / 2; tutorialBackground.y = 2732 / 2; tutorialContainer.addChild(tutorialBackground); var tutorialText = new TextElement('Use your nose to move the player!', 100, 0xFFFFFF, "'Press Start 2P', cursive", 2048 / 2, 500); tutorialContainer.addChild(tutorialText); var continueButton = new Button('Continue', 2048 / 2, 2400, function (x, y, obj) { tutorialContainer.visible = false; gamestart = true; }); tutorialContainer.addChild(continueButton); game.addChild(tutorialContainer); } var levelSelectors = []; // Array to store level selectors for (var i = 0; i < levelNames.length; i++) { var levelSelector; if (true) { levelSelector = LK.getAsset('Level' + levelNames[i].charAt(0).toUpperCase() + levelNames[i].slice(1), { anchorX: 0.5, anchorY: 0.5 }); } else { levelSelector = LK.getAsset('LevelBloq', { anchorX: 0.5, anchorY: 0.5 }); } levelSelector.x = 2048 / 2 + 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 (true) { 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 if (obj.levelType === 'tutorial') { showTutorial(); } else { gamestart = true; // Start the game } } 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 LevelArrowEndless = true; var LevelSawEndless = false; var LevelStarEndless = 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) { player.scaleX = 0.5; player.scaleY = 0.5; energyDecreaseInterval = LK.setInterval(function () { energy.decrease(1); // Decrease energy by 1 per tick energyText.setText(energy.value + '%'); // Update energy text if (energy.value <= 0) { player.scaleX = 1; player.scaleY = 1; LK.clearInterval(energyDecreaseInterval); // Clear interval } }, 300); // Adjust interval to 200ms to achieve 5 per second } }; function spawnEnemy(type, interval, levelCheck, enemyArray, enemyClass) { return LK.setInterval(function () { if (!gamestart || !levelCheck()) { return; } var newEnemy = game.addChild(new enemyClass()); enemyArray.push(newEnemy); newEnemy.spawnTime = Date.now(); // Track spawn time LK.setTimeout(function () { if (enemyArray.includes(newEnemy) && Date.now() - newEnemy.spawnTime >= 20000) { newEnemy.destroy(); enemyArray.splice(enemyArray.indexOf(newEnemy), 1); } }, 20000); }, interval); } var enemyArrows = []; var enemySaw = []; var enemyStars = []; // New array to store EnemyStar instances var enemyArrowInterval = spawnEnemy('arrow', Math.random() * 276 + 500, function () { return levelID === 1; }, enemyArrows, EnemyArrow); var enemySawInterval = spawnEnemy('saw', 1001, function () { return levelID === 2; }, enemySaw, EnemySaw); var enemyStarInterval = spawnEnemy('star', 1501, function () { return 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 - 700 + i * 160; // Position each life icon to the right of the previous one lifeIcon.y = 100; lifeIcons.push(lifeIcon); } 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 + 700; // 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 /* * Menu inicial */ var menuContainer = new Container(); 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); creditsBackground.down = function (x, y, obj) { creditsContainer.visible = false; menuContainer.visible = true; }; 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); }
/****
* 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 = ['tutorial', 'arrow', 'saw', 'star', 'endless']; // Ensure endless is last
function showTutorial() {
var tutorialContainer = new Container();
var tutorialBackground = LK.getAsset('Background', {
anchorX: 0.5,
anchorY: 0.5
});
tutorialBackground.x = 2048 / 2;
tutorialBackground.y = 2732 / 2;
tutorialContainer.addChild(tutorialBackground);
var tutorialText = new TextElement('Use your nose to move the player!', 100, 0xFFFFFF, "'Press Start 2P', cursive", 2048 / 2, 500);
tutorialContainer.addChild(tutorialText);
var continueButton = new Button('Continue', 2048 / 2, 2400, function (x, y, obj) {
tutorialContainer.visible = false;
gamestart = true;
});
tutorialContainer.addChild(continueButton);
game.addChild(tutorialContainer);
}
var levelSelectors = []; // Array to store level selectors
for (var i = 0; i < levelNames.length; i++) {
var levelSelector;
if (true) {
levelSelector = LK.getAsset('Level' + levelNames[i].charAt(0).toUpperCase() + levelNames[i].slice(1), {
anchorX: 0.5,
anchorY: 0.5
});
} else {
levelSelector = LK.getAsset('LevelBloq', {
anchorX: 0.5,
anchorY: 0.5
});
}
levelSelector.x = 2048 / 2 + 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 (true) {
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
if (obj.levelType === 'tutorial') {
showTutorial();
} else {
gamestart = true; // Start the game
}
} 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 LevelArrowEndless = true;
var LevelSawEndless = false;
var LevelStarEndless = 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) {
player.scaleX = 0.5;
player.scaleY = 0.5;
energyDecreaseInterval = LK.setInterval(function () {
energy.decrease(1); // Decrease energy by 1 per tick
energyText.setText(energy.value + '%'); // Update energy text
if (energy.value <= 0) {
player.scaleX = 1;
player.scaleY = 1;
LK.clearInterval(energyDecreaseInterval); // Clear interval
}
}, 300); // Adjust interval to 200ms to achieve 5 per second
}
};
function spawnEnemy(type, interval, levelCheck, enemyArray, enemyClass) {
return LK.setInterval(function () {
if (!gamestart || !levelCheck()) {
return;
}
var newEnemy = game.addChild(new enemyClass());
enemyArray.push(newEnemy);
newEnemy.spawnTime = Date.now(); // Track spawn time
LK.setTimeout(function () {
if (enemyArray.includes(newEnemy) && Date.now() - newEnemy.spawnTime >= 20000) {
newEnemy.destroy();
enemyArray.splice(enemyArray.indexOf(newEnemy), 1);
}
}, 20000);
}, interval);
}
var enemyArrows = [];
var enemySaw = [];
var enemyStars = []; // New array to store EnemyStar instances
var enemyArrowInterval = spawnEnemy('arrow', Math.random() * 276 + 500, function () {
return levelID === 1;
}, enemyArrows, EnemyArrow);
var enemySawInterval = spawnEnemy('saw', 1001, function () {
return levelID === 2;
}, enemySaw, EnemySaw);
var enemyStarInterval = spawnEnemy('star', 1501, function () {
return 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 - 700 + i * 160; // Position each life icon to the right of the previous one
lifeIcon.y = 100;
lifeIcons.push(lifeIcon);
}
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 + 700; // 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
/*
* Menu inicial
*/
var menuContainer = new Container();
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);
creditsBackground.down = function (x, y, obj) {
creditsContainer.visible = false;
menuContainer.visible = true;
};
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);
}