User prompt
Cuando se seleccione un slime el apartado UI pasa de creacion de torre a información de torre donde los botones se van y aparece información de la torre
User prompt
Cuando se seleccione un slime el apartado UI pasa de creacion de torre a información de torre donde los botones se van y aparece información de la torre
User prompt
Cuando se seleccione un slime el apartado UI pasa de creacion de torre a información de torre
User prompt
Cuando se seleccione un slime el apartado UI pasa de creacion de torre a información de torre donde los botones se van y aparece información de la torre
User prompt
Arregla el error que hace que desaparezca el asset de gameplay al ver la info de la torre
User prompt
Cuando se seleccione un slime el apartado UI pasa de creacion de torre a información de torre donde los botones se van y aparece información de la torre
User prompt
Haz que al estar seleccionado un slime salga un menú donde UI donde se muestra el rango, ataque y carencia de la torre
User prompt
Agrega una animación donde la torre se aplaste en el eje Y ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Haz que se aplaste en el eje Y ↪💡 Consider importing and using the following plugins: @upit/tween.v1
Code edit (1 edits merged)
Please save this source code
User prompt
Agrega una animación donde la torre se aplasta al disparar ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Haz que el proyectil se cree un poco más adelante
User prompt
Agrega un sonido al lnza un proyectil
User prompt
Haz que el enemy teste suba y baja en un rango en bucle ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Haz que si el objetivo está de lado izquierdo a la torre el asset se voltea en el eje Y
User prompt
Haz que si el objetivo está del lado izquierdo eo eje Y rota ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Haz que la torre rote para mirar la posición del objetivo ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Aumenta la velocidad de la bala
Code edit (1 edits merged)
Please save this source code
User prompt
Haz que el área muestre el rango verdadero de la torre ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Haz que el área aumente para mostrar con precisión el área de la torre ↪💡 Consider importing and using the following plugins: @upit/tween.v1
Code edit (1 edits merged)
Please save this source code
User prompt
Haz que el área se muestre roja cuando no se puede colocar la torre ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Haz que las torres ocupen un espacio y no puedan colocarse muy cerca. Sí no se pueden colocar se eliminan
User prompt
Haz que el área sea gris. Remplaza el tinte que que vuelve rojo a la torre y muévelo al área ↪💡 Consider importing and using the following plugins: @upit/tween.v1
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var Bullet = Container.expand(function () { var self = Container.call(this); var bulletGraphics = self.attachAsset('Bala', { anchorX: 0.5, anchorY: 0.5 }); self.target = null; self.speed = 600; // pixels per second self.damage = 0; self.update = function () { if (self.target && self.target.parent) { // Calculate direction to target var dx = self.target.x - self.x; var dy = self.target.y - self.y; var distanceSquared = dx * dx + dy * dy; // If close enough to target, hit it (using squared distance to avoid sqrt) if (distanceSquared < 400) { // 20 * 20 = 400 // Remove bullet self.destroy(); return; } // Move towards target var distance = Math.sqrt(distanceSquared); var moveX = dx / distance * self.speed * frameTime; // 60 FPS var moveY = dy / distance * self.speed * frameTime; self.x += moveX; self.y += moveY; // Rotate bullet to face target self.rotation = Math.atan2(dy, dx); } else { // Target is gone, remove bullet self.destroy(); } }; return self; }); var Gameplay = Container.expand(function () { var self = Container.call(this); var gameplayGraphics = self.attachAsset('gameplayBackground', { anchorX: 0.5, anchorY: 0.5 }); return self; }); var Tower = Container.expand(function () { var self = Container.call(this); // Tower parameters self.damage = 25; // Damage dealt per shot self.cadence = 1000; // Time between shots in milliseconds (1 second) self.range = 400; // Range in pixels self.rangeSquared = self.range * self.range; // Cache squared range for optimization var areaGraphics = self.attachAsset('Area', { anchorX: 0.5, anchorY: 0.5 }); // Scale the area to match the tower's actual range var areaScale = self.range * 2 / 100; // Area asset is 100x100, so scale to range diameter areaGraphics.scaleX = areaScale; areaGraphics.scaleY = areaScale; areaGraphics.alpha = 0.3; areaGraphics.visible = false; // Hide range area by default var towerGraphics = self.attachAsset('torreInicial', { anchorX: 0.5, anchorY: 0.5 }); // Method to show range area self.showRange = function () { areaGraphics.visible = true; }; // Method to hide range area self.hideRange = function () { areaGraphics.visible = false; }; // Tower selection state self.isSelected = false; // Tower placement state self.isPlaced = false; // Shooting properties self.lastShotTime = 0; self.bullets = []; // Method to find enemies in range self.findEnemiesInRange = function () { var enemies = []; // Check if enemyTest is in range if (enemyTest && enemyTest.parent) { var dx = enemyTest.x - self.x; var dy = enemyTest.y - self.y; var distanceSquared = dx * dx + dy * dy; if (distanceSquared <= self.rangeSquared) { enemies.push(enemyTest); } } return enemies; }; // Method to shoot at target self.shoot = function (target) { var currentTime = Date.now(); if (currentTime - self.lastShotTime >= self.cadence) { var bullet = new Bullet(); // Calculate direction to target for bullet offset var dx = target.x - self.x; var dy = target.y - self.y; var distance = Math.sqrt(dx * dx + dy * dy); var offsetDistance = 50; // Distance to spawn bullet ahead of tower // Spawn bullet slightly ahead in the direction of the target bullet.x = self.x + dx / distance * offsetDistance; bullet.y = self.y + dy / distance * offsetDistance; bullet.target = target; bullet.damage = self.damage; self.bullets.push(bullet); game.addChild(bullet); self.lastShotTime = currentTime; // Play bullet shooting sound LK.getSound('Balababa').play(); // Add squash animation to tower tween.stop(towerGraphics, { scaleX: true }); // Stop any existing scale tweens tween(towerGraphics, { scaleX: 0.7 }, { duration: 100, easing: tween.easeOut, onFinish: function onFinish() { tween(towerGraphics, { scaleX: 1.0 }, { duration: 150, easing: tween.easeOut }); } }); } }; // Update method for tower self.update = function () { // Clean up destroyed bullets for (var i = self.bullets.length - 1; i >= 0; i--) { if (!self.bullets[i].parent) { self.bullets.splice(i, 1); } } // Only shoot if tower is placed (check cached status) if (self.isPlaced) { // Find and shoot at enemies var enemies = self.findEnemiesInRange(); if (enemies.length > 0) { var target = enemies[0]; // Calculate angle to target var dx = target.x - self.x; var dy = target.y - self.y; var targetAngle = Math.atan2(dy, dx); // Rotate tower to face target towerGraphics.rotation = targetAngle; // Flip tower horizontally if target is on the left side if (dx < 0) { towerGraphics.scaleY = -1; // Flip on Y axis when target is to the left } else { towerGraphics.scaleY = 1; // Normal orientation when target is to the right } // Shoot at the first enemy found self.shoot(target); } } }; // Handle tower selection self.down = function (x, y, obj) { // Deselect all other towers first for (var i = 0; i < placedTowers.length; i++) { if (placedTowers[i] !== self) { placedTowers[i].isSelected = false; placedTowers[i].hideRange(); } } // Toggle selection for this tower self.isSelected = !self.isSelected; if (self.isSelected) { self.showRange(); // Switch UI to tower info mode if (typeof ui !== "undefined" && ui) { if (!ui.towerInfoText) { // Remove creation buttons if present if (typeof towerButtons !== "undefined" && towerButtons.length) { for (var b = 0; b < towerButtons.length; b++) { if (towerButtons[b] && towerButtons[b].parent) { towerButtons[b].destroy(); } } towerButtons.length = 0; } // Remove any previous info text if (ui.towerInfoText && ui.towerInfoText.parent) { ui.towerInfoText.destroy(); } // Show tower info var info = "Torre\nDaño: " + self.damage + "\nCadencia: " + self.cadence + "ms\nRango: " + self.range; ui.towerInfoText = ui.addChild(new Text2(info, { size: 90, fill: 0xFFFFFF, align: "center" })); ui.towerInfoText.anchor.set(0.5, 0.5); ui.towerInfoText.x = ui.width / 2; ui.towerInfoText.y = ui.height / 2; } } } else { self.hideRange(); // Restore UI to creation mode if (typeof ui !== "undefined" && ui) { if (ui.towerInfoText && ui.towerInfoText.parent) { ui.towerInfoText.destroy(); ui.towerInfoText = null; } // Recreate tower creation buttons if not present if (typeof towerButtons !== "undefined" && towerButtons.length === 0) { var buttonSpacing = 300; var startX = 300; towerButtons.push(createTowerButton(0xffffff, startX, 2459)); towerButtons.push(createTowerButton(0xff0000, startX + buttonSpacing, 2459)); towerButtons.push(createTowerButton(0x00ff00, startX + buttonSpacing * 2, 2459)); towerButtons.push(createTowerButton(0x0000ff, startX + buttonSpacing * 3, 2459)); } } } }; return self; }); var UI = Container.expand(function () { var self = Container.call(this); var uiGraphics = self.attachAsset('uiBackground', { anchorX: 0.5, anchorY: 0.5 }); return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x000000 }); /**** * Game Code ****/ var draggedTower = null; var isDragging = false; var placedTowers = []; // Track all placed towers // Cache frequently used values var gameplayBounds = null; var uiBounds = null; var frameTime = 1 / 60; // Cache frame time calculation // Reusable tower creation function function createTowerButton(color, x, y) { var buttonBG = game.addChild(LK.getAsset('BGbuttonTower', { anchorX: 0.5, anchorY: 0.5, scaleX: 1.5, scaleY: 1.5 })); buttonBG.x = x; buttonBG.y = y; var button = game.addChild(new Tower()); button.x = x; button.y = y; button.tint = color; button.down = function (x, y, obj) { isDragging = true; draggedTower = game.addChild(new Tower()); draggedTower.x = button.x; draggedTower.y = button.y; draggedTower.alpha = 0.7; draggedTower.tint = color; draggedTower.showRange(); // Show range area when dragging }; return button; } // Game down handler to deselect towers when clicking on gameplay area game.down = function (x, y, obj) { // Check if click is in gameplay area (not on UI or towers) var gameplayBounds = getGameplayBounds(); var clickInGameplay = x >= gameplayBounds.left && x <= gameplayBounds.right && y >= gameplayBounds.top && y <= gameplayBounds.bottom; if (clickInGameplay) { // Deselect all towers for (var i = 0; i < placedTowers.length; i++) { placedTowers[i].isSelected = false; placedTowers[i].hideRange(); } } }; // Helper functions for bounds calculations function getGameplayBounds() { return { left: gameplay.x - gameplay.width / 2, right: gameplay.x + gameplay.width / 2, top: gameplay.y - gameplay.height / 2, bottom: gameplay.y + gameplay.height / 2, centerX: gameplay.x, centerY: gameplay.y }; } function getUIBounds() { return { left: ui.x - ui.width / 2, right: ui.x + ui.width / 2, top: ui.y - ui.height / 2, bottom: ui.y + ui.height / 2 }; } function isPointInUI(x, y) { var bounds = getUIBounds(); return x >= bounds.left && x <= bounds.right && y >= bounds.top && y <= bounds.bottom; } function calculateDragOffset(x, y) { var bounds = getGameplayBounds(); var distanceFromCenterX = Math.abs(x - bounds.centerX); var distanceFromCenterY = Math.abs(y - bounds.centerY); var maxDistanceX = gameplay.width / 2; var maxDistanceY = gameplay.height / 2; var normalizedDistanceX = distanceFromCenterX / maxDistanceX; var normalizedDistanceY = distanceFromCenterY / maxDistanceY; var maxOffset = 200; var offsetMagnitudeX = maxOffset * normalizedDistanceX; var offsetMagnitudeY = maxOffset * normalizedDistanceY; var offsetX = 0; var offsetY = 0; if (x >= bounds.centerX && y <= bounds.centerY) { offsetX = offsetMagnitudeX; offsetY = -offsetMagnitudeY; } else if (x <= bounds.centerX && y <= bounds.centerY) { offsetX = -offsetMagnitudeX; offsetY = -offsetMagnitudeY; } else if (x <= bounds.centerX && y >= bounds.centerY) { offsetX = -offsetMagnitudeX; offsetY = offsetMagnitudeY; } else if (x >= bounds.centerX && y >= bounds.centerY) { offsetX = offsetMagnitudeX; offsetY = offsetMagnitudeY; } return { offsetX: offsetX, offsetY: offsetY }; } // Layer management - objects are added in z-index order (bottom to top) // Background layer var gameplay = game.addChild(new Gameplay()); gameplay.x = 1024; gameplay.y = 1093; // Game objects layer (towers will be added here) // UI layer var ui = game.addChild(new UI()); ui.x = 1024; ui.y = 2459; // Create multiple tower creation buttons with different colors var towerButtons = []; var buttonSpacing = 300; // Increased spacing between buttons var startX = 300; // Starting X position towerButtons.push(createTowerButton(0xffffff, startX, 2459)); // White tower towerButtons.push(createTowerButton(0xff0000, startX + buttonSpacing, 2459)); // Red tower towerButtons.push(createTowerButton(0x00ff00, startX + buttonSpacing * 2, 2459)); // Green tower towerButtons.push(createTowerButton(0x0000ff, startX + buttonSpacing * 3, 2459)); // Blue tower // Enemy test object in the center var enemyTest = game.addChild(LK.getAsset('Puntero', { anchorX: 0.5, anchorY: 0.5, scaleX: 5, scaleY: 5, color: 0xff0000 })); enemyTest.x = 1024; enemyTest.y = 1093; // Set up vertical oscillation parameters enemyTest.originalY = 1093; enemyTest.oscillationRange = 200; // Range of up/down movement enemyTest.isMovingUp = true; // Start the oscillation loop function startEnemyOscillation() { var targetY = enemyTest.isMovingUp ? enemyTest.originalY - enemyTest.oscillationRange : enemyTest.originalY + enemyTest.oscillationRange; tween(enemyTest, { y: targetY }, { duration: 2000, // 2 seconds for each direction easing: tween.easeInOut, onFinish: function onFinish() { enemyTest.isMovingUp = !enemyTest.isMovingUp; // Toggle direction startEnemyOscillation(); // Start next oscillation } }); } // Start the oscillation startEnemyOscillation(); // Top overlay layer (pointer on top of everything) var puntero = game.addChild(LK.getAsset('Puntero', { anchorX: 0.5, anchorY: 0.5 })); puntero.x = 1024; puntero.y = 1366; puntero.alpha = 0; // Game move handler for dragging game.move = function (x, y, obj) { puntero.x = x; puntero.y = y; if (isDragging && draggedTower) { var gameplayBounds = getGameplayBounds(); var uiBounds = getUIBounds(); var offset = calculateDragOffset(x, y); var targetX = x + offset.offsetX; var targetY = y + offset.offsetY; // Apply boundary constraints if (targetY > uiBounds.top) { targetY = uiBounds.top - 70; } if (targetY < gameplayBounds.top) { targetY = gameplayBounds.top + 70; } if (targetX < uiBounds.left) { targetX = uiBounds.left + 70; } if (targetX > uiBounds.right) { targetX = uiBounds.right - 70; } // Check if tower is too close to existing towers var minDistance = 200; // Minimum distance between towers var minDistanceSquared = minDistance * minDistance; var tooCloseToOtherTowers = false; for (var i = 0; i < placedTowers.length; i++) { var existingTower = placedTowers[i]; var dx = targetX - existingTower.x; var dy = targetY - existingTower.y; var distanceSquared = dx * dx + dy * dy; if (distanceSquared < minDistanceSquared) { tooCloseToOtherTowers = true; break; } } // Update area tint based on pointer position and tower proximity var pointerInUI = isPointInUI(puntero.x, puntero.y); var cannotPlace = pointerInUI || tooCloseToOtherTowers; if (cannotPlace) { // Apply red tint to area when cannot place tower if (draggedTower.children[0]) { draggedTower.children[0].tint = 0xff0000; } } else { // Remove tint from area when tower can be placed if (draggedTower.children[0]) { draggedTower.children[0].tint = 0xFFFFFF; } } // Smooth movement var smoothness = 0.15; draggedTower.x += (targetX - draggedTower.x) * smoothness; draggedTower.y += (targetY - draggedTower.y) * smoothness; } }; // Game release handler game.up = function (x, y, obj) { if (isDragging && draggedTower) { var gameplayBounds = getGameplayBounds(); var uiBounds = getUIBounds(); var pointerInUI = isPointInUI(puntero.x, puntero.y); var towerInUI = draggedTower.x >= uiBounds.left && draggedTower.x <= uiBounds.right && draggedTower.y >= uiBounds.top && draggedTower.y <= uiBounds.bottom; if (pointerInUI || towerInUI) { draggedTower.destroy(); } else if (draggedTower.x >= gameplayBounds.left && draggedTower.x <= gameplayBounds.right && draggedTower.y >= gameplayBounds.top && draggedTower.y <= gameplayBounds.bottom) { // Check if tower is too close to existing towers var minDistance = 200; // Minimum distance between towers var minDistanceSquared = minDistance * minDistance; var canPlace = true; for (var i = 0; i < placedTowers.length; i++) { var existingTower = placedTowers[i]; var dx = draggedTower.x - existingTower.x; var dy = draggedTower.y - existingTower.y; var distanceSquared = dx * dx + dy * dy; if (distanceSquared < minDistanceSquared) { canPlace = false; break; } } if (canPlace) { draggedTower.alpha = 1.0; draggedTower.tint = 0xffffff; draggedTower.hideRange(); // Hide range area when placed draggedTower.isPlaced = true; // Set placement status placedTowers.push(draggedTower); // Add to placed towers array LK.getSound('TorreColocada').play(); // Play tower placement sound } else { // Tower is too close to existing towers, destroy it draggedTower.destroy(); } } else { draggedTower.destroy(); } isDragging = false; draggedTower = null; } };
===================================================================
--- original.js
+++ change.js
@@ -173,10 +173,8 @@
}
};
// Handle tower selection
self.down = function (x, y, obj) {
- // Only allow selection if tower is placed
- if (!self.isPlaced) return;
// Deselect all other towers first
for (var i = 0; i < placedTowers.length; i++) {
if (placedTowers[i] !== self) {
placedTowers[i].isSelected = false;
@@ -186,49 +184,53 @@
// Toggle selection for this tower
self.isSelected = !self.isSelected;
if (self.isSelected) {
self.showRange();
- // Switch to information mode
- uiMode = 'information';
- selectedTower = self;
- // Hide tower creation buttons
- for (var j = 0; j < towerButtons.length; j++) {
- towerButtons[j].visible = false;
- towerButtons[j].parent.children[0].visible = false; // Hide button background
+ // Switch UI to tower info mode
+ if (typeof ui !== "undefined" && ui) {
+ if (!ui.towerInfoText) {
+ // Remove creation buttons if present
+ if (typeof towerButtons !== "undefined" && towerButtons.length) {
+ for (var b = 0; b < towerButtons.length; b++) {
+ if (towerButtons[b] && towerButtons[b].parent) {
+ towerButtons[b].destroy();
+ }
+ }
+ towerButtons.length = 0;
+ }
+ // Remove any previous info text
+ if (ui.towerInfoText && ui.towerInfoText.parent) {
+ ui.towerInfoText.destroy();
+ }
+ // Show tower info
+ var info = "Torre\nDaño: " + self.damage + "\nCadencia: " + self.cadence + "ms\nRango: " + self.range;
+ ui.towerInfoText = ui.addChild(new Text2(info, {
+ size: 90,
+ fill: 0xFFFFFF,
+ align: "center"
+ }));
+ ui.towerInfoText.anchor.set(0.5, 0.5);
+ ui.towerInfoText.x = ui.width / 2;
+ ui.towerInfoText.y = ui.height / 2;
+ }
}
- // Show tower information
- if (!towerInfoText) {
- towerInfoText = new Text2('', {
- size: 80,
- fill: 0xFFFFFF
- });
- towerInfoText.anchor.set(0.5, 0.5);
- ui.addChild(towerInfoText);
- }
- towerInfoText.setText('Damage: ' + self.damage + '\nCadence: ' + self.cadence / 1000 + 's\nRange: ' + self.range);
- towerInfoText.visible = true;
} else {
self.hideRange();
- // Return to creation mode if no towers are selected
- var anySelected = false;
- for (var k = 0; k < placedTowers.length; k++) {
- if (placedTowers[k].isSelected) {
- anySelected = true;
- break;
+ // Restore UI to creation mode
+ if (typeof ui !== "undefined" && ui) {
+ if (ui.towerInfoText && ui.towerInfoText.parent) {
+ ui.towerInfoText.destroy();
+ ui.towerInfoText = null;
}
- }
- if (!anySelected) {
- uiMode = 'creation';
- selectedTower = null;
- // Show tower creation buttons
- for (var l = 0; l < towerButtons.length; l++) {
- towerButtons[l].visible = true;
- towerButtons[l].parent.children[0].visible = true; // Show button background
+ // Recreate tower creation buttons if not present
+ if (typeof towerButtons !== "undefined" && towerButtons.length === 0) {
+ var buttonSpacing = 300;
+ var startX = 300;
+ towerButtons.push(createTowerButton(0xffffff, startX, 2459));
+ towerButtons.push(createTowerButton(0xff0000, startX + buttonSpacing, 2459));
+ towerButtons.push(createTowerButton(0x00ff00, startX + buttonSpacing * 2, 2459));
+ towerButtons.push(createTowerButton(0x0000ff, startX + buttonSpacing * 3, 2459));
}
- // Hide tower information
- if (towerInfoText) {
- towerInfoText.visible = false;
- }
}
}
};
return self;
@@ -258,12 +260,8 @@
// Cache frequently used values
var gameplayBounds = null;
var uiBounds = null;
var frameTime = 1 / 60; // Cache frame time calculation
-// UI state tracking
-var uiMode = 'creation'; // 'creation' or 'information'
-var selectedTower = null;
-var towerInfoText = null;
// Reusable tower creation function
function createTowerButton(color, x, y) {
var buttonBG = game.addChild(LK.getAsset('BGbuttonTower', {
anchorX: 0.5,
@@ -298,20 +296,8 @@
for (var i = 0; i < placedTowers.length; i++) {
placedTowers[i].isSelected = false;
placedTowers[i].hideRange();
}
- // Return to creation mode
- uiMode = 'creation';
- selectedTower = null;
- // Show tower creation buttons
- for (var j = 0; j < towerButtons.length; j++) {
- towerButtons[j].visible = true;
- towerButtons[j].parent.children[0].visible = true; // Show button background
- }
- // Hide tower information
- if (towerInfoText) {
- towerInfoText.visible = false;
- }
}
};
// Helper functions for bounds calculations
function getGameplayBounds() {