Code edit (2 edits merged)
Please save this source code
User prompt
haz que saw cuando este cerca de player pare
User prompt
haz que saw despues de unos segundos se frene
Code edit (1 edits merged)
Please save this source code
User prompt
elimina la mecanica de saw
Code edit (1 edits merged)
Please save this source code
User prompt
copia la logica de movimiento de arrow para saw pero manteniendo su mecanica de cambio
Code edit (1 edits merged)
Please save this source code
User prompt
aumenta el numero de flecha que se crea
User prompt
flecha no cintinua su camino
User prompt
flecha no continua su camino infinitamente
User prompt
recuerda que una flecha tiene una trayectoria recta, no cambia
User prompt
mejora la logica de movimiento de los enemigos
User prompt
elimina los codigos "if (self.x < 0 || self.x > 3000 || self.y < 0 || self.y > 3000) { self.destroy(); }"
User prompt
soluciona el bug que hace que arrow se detenga
User prompt
cualquier enemigo cuando es muy rapido entra en un bucle donde no avanza, soluciona el bug
User prompt
corrige el bug: - arrow tiene se detetiene algunas veces y dar vuelta cuando llega a la ultima posición del jugador - busca una manera optima ara mejorar la logica de arrow sin alterar su mecanica acual
User prompt
dije especificamente que no alteres su mecanica, arrow tiene que seguir su camino y no perseguir al jugador
User prompt
corrige el bug: - arrow tiene se detetiene algunas veces y dar vuelta cuando llega a la ultima posición del jugador - busca una manera optima ara mejorar la logica de arrow sin alterar su mecanica acual
User prompt
corrige lo siguiente: - arrow tiene una posibilidad de detenerse a mitad de camino y dar vuelta - busca una manera optima ara mejorar la logica de arrow sin alterar su mecanica acual
User prompt
arrow parece bugearse y quedar en un bucle donde no se mueve
User prompt
arrow parece bugearse y quedar en un bucle donde no se mueve
User prompt
arrow parece bugearse y quedar en un bucle donde no se mueve
Code edit (1 edits merged)
Please save this source code
User prompt
aumenta la creación y velocidad de movimiento de arrow
/**** 
* 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 speed = 10; // 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 += 0.03;
	};
});
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, 2300, function (x, y, obj) {
		selectLevelContainer.visible = false; // Hide the select level page
		menuContainer.visible = true; // Show the main menu
	});
	selectLevelContainer.addChild(backButton);
	// Add level selectors
	var levelNames = ['endless', 'arrow', 'saw', 'star']; // Removed 'ninja' level and kept 'star'
	var levelSelectors = []; // Array to store level selectors
	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];
		levelSelector.down = function (index) {
			// Create a closure to capture the current index
			return function (x, y, obj) {
				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
				// Additional logic to initialize the selected level can be added here
			};
		}(i); // Pass the current index to the closure
		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);
		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 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);
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 = [];
// Create a timer that creates a new EnemyArrow every random interval between 1 and 2 seconds
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() * 250 + 500, function () {
	// Reduced interval time
	return levelID === 0 || levelID === 1;
}, enemyArrows, EnemyArrow);
var enemySawInterval = spawnEnemy('saw', 2000, function () {
	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, 1000, 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, 1300, 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 howToPlayButton = new Button('How to Play', 2048 / 2, 1600, function (x, y, obj) {
	// Add logic for how to play button
});
menuContainer.addChild(howToPlayButton);
var creditsButton = new Button('Credits', 2048 / 2, 1900, 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
@@ -66,21 +66,11 @@
 	self.update = function () {
 		if (!gamestart) {
 			return;
 		}
-		if (!self.stopSaw && !self.hasStopped && Math.sqrt(Math.pow(player.x - self.x, 2) + Math.pow(player.y - self.y, 2)) < 100) {
-			self.stopSaw = true;
-			self.hasStopped = true;
-			LK.setTimeout(function () {
-				self.stopSaw = false;
-			}, 2000);
-		}
-		if (!self.stopSaw) {
-			self.x += Math.cos(angle) * speed;
-			self.y += Math.sin(angle) * speed;
-		}
+		self.x += Math.cos(angle) * speed;
+		self.y += Math.sin(angle) * speed;
 		self.rotation += 0.03;
-		// Check if the EnemySaw has moved to the opposite side of its spawn point
 	};
 });
 var EnemyStar = Container.expand(function () {
 	var self = Container.call(this);