User prompt
Borre el asset del Kiwi, lo necesito de vuelta
User prompt
Limpia el codigo de partes que no sean necesarias.
User prompt
Cuando se reinicia el juego por un momento aparecen muchas frutas generadas en la parte inferior.
User prompt
Si reinicia cuando fallo las frutas pero no cuando las corto todas.
User prompt
Please fix the bug: 'TypeError: setTimeout is not a function' in or related to this line: 'frutasFalladasTimeout = setTimeout(function () {' Line Number: 644
Code edit (1 edits merged)
Please save this source code
User prompt
No reinicio la ronda después de los dos segundos.
User prompt
Cuando el contador llegue a 5 espera dos segundos e inicia nuevamente la ronda.
User prompt
Cuando el contador llegue a 5 inicia nuevamente la ronda.
User prompt
Cuando una fruta no sea cortada y se elimine el circulo blanco o la fruta salga de la pantalla tambien hay que contarla.
User prompt
Cambia el contador, que solo sume 1 cuando se corta o se pierde una fruta.
User prompt
Imprime en pantalla un contador de las frutas generadas.
User prompt
Limpia el codigo de partes que no sean necesarias
User prompt
"Implementa una variable llamada frutasFalladas que aumente en 1 cada vez que una fruta sea cortada incorrectamente o se pierda. Cuando frutasFalladas alcance 5, reinicia el juego, reseteando todas las variables y estados relevantes para empezar desde cero."
User prompt
Diagnóstico principal El sistema usa 3 estados para manejar las "rondas" de frutas: waiting: espera para iniciar nueva ronda spawning: lanza frutas, hasta 5 (roundBullets) waitingFruits: espera 2 segundos antes de reiniciar la ronda El problema puede estar en la transición entre estados y en la limpieza de las frutas para permitir que se inicie una nueva ronda. Posibles causas por las que no salen frutas tras la primera ronda Las frutas no se marcan correctamente como "destruidas" (destroyed) y quedan en las listas roundFruitsQueue o roundFruitsActive. Esto hace que la condición allGone sea siempre false y no pase a 'waitingFruits'. Las frutas que vuelven a aparecer (las que suben para ser cortadas) no se eliminan bien o no se gestionan correctamente en los arrays y el estado no avanza. La limpieza entre rondas no elimina todos los objetos ni limpia los arrays correctamente.
User prompt
El código solo lanza una ronda (5 frutas) y después no vuelve a lanzar más frutas. Quiero que el juego funcione de forma cíclica, es decir, que tras acabar una ronda y un pequeño delay, se inicie automáticamente la siguiente ronda, y así sucesivamente. Te paso el fragmento clave del código de la función de actualización (game.update) y manejo de rondas. El problema parece estar en la lógica que controla el estado de las rondas (roundState) y la forma en que verifico cuándo iniciar una nueva ronda. La lógica es esta: El estado roundState puede ser 'waiting', 'spawning', 'waitingFruits', 'reset'. En 'waiting' se prepara una nueva ronda y se pasa a 'spawning'. En 'spawning' se lanzan frutas cada 1s hasta 5. Cuando se terminan de lanzar las frutas y todas han sido destruidas o han salido de pantalla, paso a 'waitingFruits'. En 'waitingFruits' espero 2 segundos para reiniciar la ronda. Sin embargo, después de la primera ronda, el juego no vuelve a lanzar frutas. ¿Puedes revisar esta lógica y corregir el problema para que las rondas se reinicien correctamente? También, si ves alguna mejora o limpieza en el manejo de los arrays de frutas (fruits, fallingFruits, etc.), indícamela.
User prompt
El tiempo total que tarda en aparecer cada fruta en la pantalla superior debe ser proporcional al número de frutas lanzadas. Específicamente: la transición desde la pantalla inferior hasta su aparición en la pantalla superior debe tomar 1 segundo por cada fruta lanzada en esa ronda. Por ejemplo, si se lanzan 5 frutas, la transición deberá durar exactamente 5 segundos antes de que empiecen a salir hacia arriba. Además, cuando todas las frutas hayan sido destruidas o salgan de la pantalla, el juego debe reiniciar automáticamente una nueva ronda con las mismas condiciones.
User prompt
Prompt para corregir y completar el comportamiento de las balas Lanza solo 5 balas, con una separación de 1 segundo entre cada una. Cada bala, al transicionar de la pantalla inferior a la pantalla superior, no debe aparecer de inmediato. Espera exactamente 7 segundos desde que cruza a la pantalla superior antes de mostrarla. El temporizador de 7 segundos debe comenzar justo al cruzar, no antes. Si la bala es destruida o sale de pantalla antes de que pasen los 7 segundos, no debe mostrarse. Una vez que todas las 5 balas hayan sido destruidas o salieron de pantalla, el sistema debe reiniciar automáticamente el disparo de otras 5 balas bajo las mismas condiciones.
User prompt
Disparar solo 5 balas por ronda: Limita el disparo a exactamente 5 balas por ciclo/ronda. Esto puede ser mediante un contador o una lista con tiempo de disparo planificado. Separación de 1 segundo entre balas: Usa un temporizador para que cada bala se dispare con 1 segundo de diferencia. Ejemplo: si la primera bala se dispara en el segundo t0, la siguiente será en t0 + 1s, la siguiente en t0 + 2s, etc., hasta llegar a la quinta bala. Aumentar el tiempo de espera antes de salir (desaparecer): Una vez que la bala entra a la parte superior de la pantalla, espera más tiempo antes de salir. Ajusta este tiempo a 7 segundos en total desde que la bala entra (es decir, puede quedarse 7 segundos antes de ser eliminada, desvanecida, o salir por completo de pantalla). ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Prompt para corrección y mejora del código de frutas cortables: Habilitar corte desde la transición a la pantalla superior: Modifica la lógica para que las frutas sean cortables desde el momento en que comienzan a subir hacia la parte superior de la pantalla (es decir, desde que aparecen y suben en la parte superior, no solo cuando ya están en una zona fija). Esto implica que la fruta debe tener el estado que permita el corte ('cuttable' o similar) desde que empieza esa subida. Mostrar círculo blanco dentro de la fruta, con efecto difuminado y crecimiento progresivo: El círculo de corte debe aparecer centrado en la fruta, no alrededor ni separado de ella, y debe tener un efecto visual suave, como un difuminado o transparencia gradual (usando alpha bajo y borde suave). Además, el círculo debe empezar pequeño y crecer lentamente a un tamaño máximo mientras la fruta sube, dando una sensación de “preparación para corte”. Movimiento continuo de la fruta con círculo: Asegúrate de que mientras el círculo está visible, la fruta continúa moviéndose hacia arriba, sin detenerse, para que no se congele en pantalla. Condiciones para activar/desactivar el círculo: El círculo debe comenzar a aparecer justo cuando la fruta inicia su subida y crecer hasta un tamaño máximo al llegar cerca de la parte superior, luego debe desaparecer cuando la fruta sale de la pantalla o es cortada. Ajustar escala y posición del círculo para que siempre siga a la fruta: En cada frame, el círculo debe actualizar su posición para estar siempre centrado en la fruta y escalar de acuerdo al efecto de crecimiento. ↪💡 Consider importing and using the following plugins: @upit/tween.v1
User prompt
Cuando la fruta entra en el estado 'cuttable' para mostrar el círculo blanco, actualmente la fruta no se mueve y queda congelada en pantalla. Para que siga subiendo, la lógica de movimiento vertical debe incluir también el estado 'cuttable', moviendo la fruta hacia arriba en ese estado y actualizando la posición del círculo blanco junto con la fruta. Esto hará que las frutas sigan su camino y no se detengan al mostrar el círculo.
User prompt
Las frutas suben y se pueden cortar en una zona específica. Pero cuando una fruta llega a la parte superior y no es cortada, se queda congelada ahí sin seguir moviéndose ni salir de la pantalla. Necesito que esas frutas que no se cortan sigan subiendo hasta salir por completo de la pantalla y que se eliminen correctamente cuando ya no se vean. También que cualquier efecto visual relacionado (como el círculo blanco de corte) desaparezca cuando la fruta se vaya.
User prompt
Please fix the bug: 'game.start is not a function' in or related to this line: 'game.start();' Line Number: 324
Code edit (1 edits merged)
Please save this source code
User prompt
Por favor, ajusta el juego con estas correcciones: Actualmente, las frutas que no se cortan se quedan congeladas en el punto de corte. Cambia la lógica para que si una fruta no es cortada, continúe su camino hacia arriba y eventualmente salga de la pantalla. El círculo blanco traslúcido que indica la zona de corte no debe aparecer de repente cuando la fruta llega a ese punto. En vez de eso, debe aparecer un poco antes, y mientras la fruta se acerca al punto de corte, el círculo debe ir apareciendo y agrandándose suavemente, creando una animación progresiva. Asegúrate que el círculo desaparezca correctamente si la fruta es cortada o si pasa sin cortarse. Modifica principalmente la parte del game.update donde se maneja la aparición y animación del círculo de corte, y el estado de la fruta cuando no es cortada.
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ // Clase para la fruta entera var Fruit = Container.expand(function () { var self = Container.call(this); // Selección aleatoria de tipo de fruta var fruitTypes = ['fruit_apple', 'fruit_lemon', 'fruit_orange', 'fruit_kiwi', 'fruit_plum']; self.fruitType = fruitTypes[Math.floor(Math.random() * fruitTypes.length)]; // Asset de la fruta self.fruitAsset = self.attachAsset(self.fruitType, { anchorX: 0.5, anchorY: 0.5 }); self.radius = self.fruitAsset.width / 2; // Estado self.isCut = false; self.isActive = true; // Si está en juego // Para saber si ya fue cortada self.cut = function () { if (self.isCut) { return; } self.isCut = true; self.isActive = false; self.visible = false; }; return self; }); // Clase para la fruta cortada (dos mitades) var FruitCut = Container.expand(function () { var self = Container.call(this); // Recibe tipo de fruta y posición base self.init = function (fruitType, x, y) { // Mitad izquierda self.left = self.attachAsset(fruitType, { anchorX: 1, anchorY: 0.5, scaleX: 0.5, x: 0, y: 0 }); // Mitad derecha self.right = self.attachAsset(fruitType, { anchorX: 0, anchorY: 0.5, scaleX: 0.5, x: 0, y: 0 }); self.x = x; self.y = y; self.left.rotation = 0; self.right.rotation = 0; }; // Animación de separación self.animate = function (_onFinish) { tween(self.left, { x: -80, rotation: -0.7 }, { duration: 500, easing: tween.cubicOut }); tween(self.right, { x: 80, rotation: 0.7 }, { duration: 500, easing: tween.cubicOut, onFinish: function onFinish() { if (_onFinish) { _onFinish(); } } }); }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x222222 }); /**** * Game Code ****/ // Sonido de corte // Efecto de corte (línea) // Frutas: Usamos formas básicas para representar diferentes frutas // Eliminado: zona de corte y línea de corte. Ahora el círculo de corte es dinámico y aparece solo cuando la fruta puede ser cortada. // Score var scoreTxt = new Text2('0', { size: 120, fill: "#222" }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); // Contador de frutas generadas var frutasGeneradas = 0; var frutasGeneradasTxt = new Text2('Frutas: 0', { size: 80, fill: "#fff" }); frutasGeneradasTxt.anchor.set(0.5, 0); frutasGeneradasTxt.y = 130; // Debajo del score LK.gui.top.addChild(frutasGeneradasTxt); // Variables globales var frutasFalladas = 0; // Contador de frutas falladas var fruits = []; // Frutas lanzadas desde abajo var fallingFruits = []; // Frutas que caen desde arriba var cutFruits = []; // Frutas cortadas (animación) var frutasFalladasTimeout = null; // Timeout para reinicio tras 5 fallos // --- BLOQUE DE BALAS POR RONDA --- var roundBullets = 5; // Balas por ronda var bulletsFired = 0; // Contador de balas disparadas en la ronda var bulletInterval = 60; // 1 segundo entre balas (60 ticks) var bulletTimer = 0; // Temporizador para disparo de balas var roundActive = true; // Si la ronda está activa var roundDelay = 120; // Tiempo de espera entre rondas (2 segundos) var roundDelayTimer = 0; // Temporizador para delay entre rondas var fruitSpeed = 22; // velocidad de subida/bajada var fruitTimer = 0; // Obtener el radio del asset de zona de corte (cut_zone) usando LK.getAsset var cutZoneAsset = LK.getAsset('cut_zone', { anchorX: 0.5, anchorY: 0.5 }); var cutZoneRadius = cutZoneAsset.width / 2; cutZoneAsset.destroy(); // No lo necesitamos en pantalla, solo para el tamaño var canCut = true; // Para evitar múltiples cortes por fruta var lastTouchTick = -100; // Actualiza score function updateScore(val) { LK.setScore(val); scoreTxt.setText(val); } // Nueva lógica de corte: el corte se detecta solo cuando la fruta está en la zona de corte visual (círculo blanco animado). function tryCutFruit(x, y) { // Solo permite un corte por tick if (!canCut) { return; } canCut = false; lastTouchTick = LK.ticks; // Buscar fruta que esté en estado 'cuttable', activa, y que el toque esté sobre la fruta for (var i = 0; i < fallingFruits.length; i++) { var fruit = fallingFruits[i]; if (!fruit.isActive) { continue; } // Solo permite cortar si la fruta está en la zona de corte (cuttable) y el toque está sobre la fruta if (fruit.state === 'cuttable') { // Verifica si el toque está sobre la fruta (dentro del radio de la fruta) var dx = x - fruit.x; var dy = y - fruit.y; var dist = Math.sqrt(dx * dx + dy * dy); if (dist <= fruit.radius * fruit.scaleX) { // Cortar fruta fruit.cut(); // Destruir inmediatamente el círculo de corte si existe if (fruit.cutZoneCircle) { fruit.cutZoneCircle.destroy(); fruit.cutZoneCircle = null; } LK.getSound('cut').play(); // Animación de mitades var fruitCut = new FruitCut(); fruitCut.init(fruit.fruitType, fruit.x, fruit.y); game.addChild(fruitCut); fruitCut.animate(function () { fruitCut.destroy(); }); cutFruits.push(fruitCut); frutasGeneradas++; frutasGeneradasTxt.setText('Frutas: ' + frutasGeneradas); updateScore(LK.getScore() + 1); return; } } } } // Input: solo touch/click game.down = function (x, y, obj) { // Solo intenta cortar si hay fruta cortable y el toque es sobre la fruta tryCutFruit(x, y); }; game.up = function (x, y, obj) {}; game.move = function (x, y, obj) {}; // Main update game.update = function () { // Permitir corte nuevamente tras 6 ticks (~100ms) if (!canCut && LK.ticks - lastTouchTick > 6) { canCut = true; } // --- SISTEMA DE BALAS POR RONDA (5 balas, 1s entre cada una, 7s delay antes de mostrar en pantalla superior) --- if (typeof roundState === "undefined") { // Estados posibles: 'waiting', 'spawning', 'waitingFruits' roundState = 'waiting'; roundBullets = 5; roundFruitsQueue = []; roundFruitsActive = []; roundNextBulletTick = LK.ticks + 30; // primer disparo tras 0.5s roundBulletsFired = 0; roundDelayBetweenRounds = 120; // 2s entre rondas roundDelayTicks = 0; } if (roundState === 'waiting') { // Limpiar arrays de frutas y mitades cortadas de la ronda anterior for (var i = fruits.length - 1; i >= 0; i--) { if (fruits[i]) { fruits[i].destroy(); } } fruits = []; for (var i = fallingFruits.length - 1; i >= 0; i--) { if (fallingFruits[i]) { fallingFruits[i].destroy(); } } fallingFruits = []; for (var i = cutFruits.length - 1; i >= 0; i--) { if (cutFruits[i]) { cutFruits[i].destroy(); } } cutFruits = []; // Limpiar arrays de control de ronda if (typeof roundFruitsQueue !== "undefined") { for (var i = roundFruitsQueue.length - 1; i >= 0; i--) { if (roundFruitsQueue[i] && roundFruitsQueue[i].destroy) { roundFruitsQueue[i].destroy(); } } } roundFruitsQueue = []; if (typeof roundFruitsActive !== "undefined") { for (var i = roundFruitsActive.length - 1; i >= 0; i--) { if (roundFruitsActive[i] && roundFruitsActive[i].destroy) { roundFruitsActive[i].destroy(); } } } roundFruitsActive = []; // Reset meta de ronda roundBulletsFired = 0; roundNextBulletTick = LK.ticks; roundDelayTicks = 0; roundState = 'spawning'; } if (roundState === 'spawning') { // Disparar una fruta cada 1s hasta 5 if (roundBulletsFired < roundBullets && LK.ticks >= roundNextBulletTick) { // Crear fruta y ponerla en la cola de espera var fruit = new Fruit(); var margin = 180; fruit.x = margin + Math.random() * (2048 - 2 * margin); fruit.y = 2732 + fruit.radius + 10; fruit.startY = fruit.y; fruit.targetY = 2732 / 2 + 420; fruit.state = 'rising'; fruit.ticks = 0; fruit.roundMeta = { // Para tracking de ciclo hasCrossed: false, crossedTick: null, showScheduled: false, showTimeout: null, destroyed: false }; fruits.push(fruit); roundFruitsQueue.push(fruit); game.addChild(fruit); roundBulletsFired++; // El contador de frutas generadas solo se incrementa cuando se corta o se pierde una fruta, no aquí. roundNextBulletTick = LK.ticks + 60; // 1s entre balas } // Cuando todas las balas han sido disparadas y ya no quedan frutas activas, pasar a siguiente estado // (pero solo cuando todas las frutas hayan sido destruidas o salidas de pantalla) var allGone = true; for (var i = 0; i < roundFruitsQueue.length; i++) { if (!roundFruitsQueue[i].roundMeta.destroyed) { allGone = false; break; } } for (var i = 0; i < roundFruitsActive.length; i++) { if (!roundFruitsActive[i].roundMeta.destroyed) { allGone = false; break; } } if (roundBulletsFired >= roundBullets && allGone) { roundState = 'waitingFruits'; roundDelayTicks = 0; } } if (roundState === 'waitingFruits') { // Espera 2s antes de reiniciar la ronda roundDelayTicks++; if (roundDelayTicks >= roundDelayBetweenRounds) { // Limpiar arrays de frutas activas y en cola antes de reiniciar la ronda for (var i = fruits.length - 1; i >= 0; i--) { if (fruits[i]) { fruits[i].destroy(); } } fruits = []; for (var i = fallingFruits.length - 1; i >= 0; i--) { if (fallingFruits[i]) { fallingFruits[i].destroy(); } } fallingFruits = []; for (var i = cutFruits.length - 1; i >= 0; i--) { if (cutFruits[i]) { cutFruits[i].destroy(); } } cutFruits = []; roundFruitsQueue = []; roundFruitsActive = []; roundState = 'waiting'; } } // Mover frutas que suben desde abajo hasta el centro for (var i = fruits.length - 1; i >= 0; i--) { var fruit = fruits[i]; if (fruit.state === 'rising') { fruit.y -= fruitSpeed; fruit.ticks++; // Cuando cruza la altura objetivo (centro), programar aparición en pantalla superior tras un tiempo proporcional al número de frutas lanzadas if (!fruit.roundMeta.hasCrossed && fruit.y <= fruit.targetY) { fruit.roundMeta.hasCrossed = true; fruit.roundMeta.crossedTick = LK.ticks; fruit.visible = false; // El tiempo de espera es igual a 1s * cantidad de frutas lanzadas en la ronda var fruitsInRound = roundBullets; var appearDelayMs = fruitsInRound * 1000; // 1s por fruta lanzada fruit.roundMeta.showScheduled = true; fruit.roundMeta.showTimeout = LK.setTimeout(function (fruitRef, fruitsArr, iIdx) { return function () { // Si la fruta ya fue destruida antes del tiempo, no hacer nada if (fruitRef.roundMeta.destroyed) { return; } // Eliminar de fruits[] y crear en pantalla superior var fruitType = fruitRef.fruitType; var x = fruitRef.x; // Eliminar fruta oculta fruitRef.destroy(); for (var j = 0; j < fruitsArr.length; j++) { if (fruitsArr[j] === fruitRef) { fruitsArr.splice(j, 1); break; } } // Crear fruta en pantalla superior var fallingFruit = new Fruit(); fallingFruit.fruitType = fruitType; fallingFruit.fruitAsset.destroy(); fallingFruit.fruitAsset = fallingFruit.attachAsset(fruitType, { anchorX: 0.5, anchorY: 0.5 }); fallingFruit.x = x; fallingFruit.y = 2732 / 2 + 420; fallingFruit.startY = fallingFruit.y; fallingFruit.state = 'cuttable'; fallingFruit.ticks = 0; fallingFruit.rotation = Math.random() * Math.PI * 2; fallingFruit.rotationSpeed = (Math.random() - 0.5) * 0.04; fallingFruit.roundMeta = { destroyed: false }; fallingFruits.push(fallingFruit); roundFruitsActive.push(fallingFruit); game.addChild(fallingFruit); }; }(fruit, fruits, i), appearDelayMs); } // Si la fruta está oculta y esperando, no hacer nada más if (fruit.roundMeta.hasCrossed && fruit.roundMeta.showScheduled) { // Si la fruta fue destruida antes de los 7s, cancelar timeout y limpiar if (fruit.roundMeta.destroyed) { if (fruit.roundMeta.showTimeout) { LK.clearTimeout(fruit.roundMeta.showTimeout); fruit.roundMeta.showTimeout = null; } // Eliminar de roundFruitsQueue si está presente if (typeof roundFruitsQueue !== "undefined") { for (var j = roundFruitsQueue.length - 1; j >= 0; j--) { if (roundFruitsQueue[j] === fruit) { roundFruitsQueue.splice(j, 1); break; } } } fruits.splice(i, 1); } continue; } // Si la fruta sale de pantalla antes de cruzar, eliminar y marcar como destruida if (fruit.y < -fruit.radius - 20) { fruit.roundMeta.destroyed = true; if (fruit.roundMeta.showTimeout) { LK.clearTimeout(fruit.roundMeta.showTimeout); fruit.roundMeta.showTimeout = null; } // Eliminar de roundFruitsQueue si está presente if (typeof roundFruitsQueue !== "undefined") { for (var j = roundFruitsQueue.length - 1; j >= 0; j--) { if (roundFruitsQueue[j] === fruit) { roundFruitsQueue.splice(j, 1); break; } } } // Aumentar frutasFalladas si la fruta se perdió antes de aparecer frutasFalladas++; frutasGeneradas++; frutasGeneradasTxt.setText('Frutas: ' + frutasGeneradas); fruit.destroy(); fruits.splice(i, 1); } } } // Mover frutas que suben de nuevo y gestionar zona de corte visual for (var i = fallingFruits.length - 1; i >= 0; i--) { var fruit = fallingFruits[i]; if (!fruit.isActive) { continue; } // Escalado según altura (más arriba, más grande) var minScale = 1.0; var maxScale = 1.25; var y0 = 2732 / 2 + 420; var y1 = 420; var t = (y0 - fruit.y) / (y0 - y1); if (t < 0) { t = 0; } if (t > 1) { t = 1; } var scale = minScale + (maxScale - minScale) * t; fruit.scaleX = fruit.scaleY = scale; // Rotación suave if (typeof fruit.rotationSpeed !== "undefined") { fruit.rotation += fruit.rotationSpeed; if (fruit.fruitAsset) { fruit.fruitAsset.rotation = fruit.rotation; } } // Movimiento hacia arriba mientras sea cortable o volando hacia arriba if (fruit.state === 'cuttable' || fruit.state === 'flyingup') { fruit.y -= fruitSpeed; } // --- Animación progresiva del círculo de corte --- // El círculo aparece desde el inicio de la subida (cuttable), crece y se difumina progresivamente if (fruit.state === 'cuttable') { // Si no existe el círculo, crearlo if (!fruit.cutZoneCircle) { fruit.cutZoneCircle = LK.getAsset('cut_zone', { anchorX: 0.5, anchorY: 0.5, x: fruit.x, y: fruit.y, alpha: 0.0, scaleX: 0.1, scaleY: 0.1 }); game.addChild(fruit.cutZoneCircle); } // Progresión del círculo: desde que inicia la subida hasta que llega cerca de la parte superior var appearT = (y0 - fruit.y) / (y0 - y1); if (appearT < 0) { appearT = 0; } if (appearT > 1) { appearT = 1; } var maxScaleZone = 0.85; // Más pequeño, para que quede dentro de la fruta var minScaleZone = 0.15; var maxAlpha = 0.38; // Más difuminado var minAlpha = 0.08; var scaleZone = minScaleZone + (maxScaleZone - minScaleZone) * appearT; var alphaZone = minAlpha + (maxAlpha - minAlpha) * appearT; fruit.cutZoneCircle.scaleX = fruit.cutZoneCircle.scaleY = scaleZone; fruit.cutZoneCircle.alpha = alphaZone; fruit.cutZoneCircle.x = fruit.x; fruit.cutZoneCircle.y = fruit.y; // Si la fruta sale por arriba, eliminar círculo y pasar a flyingup if (fruit.y < y1) { // Si el círculo de corte existe y la fruta no fue cortada, contar como fallada if (fruit.cutZoneCircle) { fruit.cutZoneCircle.destroy(); fruit.cutZoneCircle = null; if (fruit.isActive && !fruit.isCut) { frutasFalladas++; frutasGeneradas++; frutasGeneradasTxt.setText('Frutas: ' + frutasGeneradas); } } fruit.state = 'flyingup'; } } else { // Si no está en estado cortable y existe el círculo, destruirlo if (fruit.cutZoneCircle) { fruit.cutZoneCircle.destroy(); fruit.cutZoneCircle = null; } } // Si fue cortada, eliminar círculo visual inmediatamente pero mantener la fruta visible if (!fruit.isActive && fruit.cutZoneCircle) { fruit.cutZoneCircle.destroy(); fruit.cutZoneCircle = null; } // Si está cayendo, animar caída if (fruit.state === 'dropping') { fruit.dropSpeed += 2.5; // gravedad fruit.y += fruit.dropSpeed; // Escalado decreciente al caer fruit.scaleX = fruit.scaleY = Math.max(0.7, fruit.scaleX - 0.01); if (fruit.cutZoneCircle) { fruit.cutZoneCircle.x = fruit.x; fruit.cutZoneCircle.y = fruit.y; } // Si sale de pantalla, marcar como inactivo pero mantener visible if (fruit.y > 2732 + fruit.radius + 20) { if (fruit.cutZoneCircle) { fruit.cutZoneCircle.destroy(); fruit.cutZoneCircle = null; } fruit.isActive = false; } } // Si la fruta sigue subiendo después de la zona de corte y no fue cortada if (fruit.state === 'flyingup') { // Al entrar por primera vez en flyingup, inicia temporizador de espera if (typeof fruit.waitTicks === "undefined") { fruit.waitTicks = 0; } fruit.waitTicks++; // Mantener la fruta visible y estática durante 7 segundos (420 ticks) if (fruit.waitTicks < 420) { // Mantener posición (opcional: podrías hacer que siga subiendo lentamente) // fruit.y -= fruitSpeed * 0.1; } else { // Después de 7 segundos, hacer que suba y desaparezca fruit.y -= fruitSpeed; // Escalado sigue creciendo un poco fruit.scaleX = fruit.scaleY = Math.min(maxScale, fruit.scaleX + 0.01); // Si sale de pantalla por arriba, marcar como inactiva y eliminar círculo de corte si existe if (fruit.y < -fruit.radius - 20) { if (fruit.cutZoneCircle) { fruit.cutZoneCircle.destroy(); fruit.cutZoneCircle = null; } fruit.isActive = false; // Marcar como destruida para el sistema de ronda if (fruit.roundMeta) { fruit.roundMeta.destroyed = true; } // Eliminar de roundFruitsActive si está presente if (typeof roundFruitsActive !== "undefined") { for (var j = roundFruitsActive.length - 1; j >= 0; j--) { if (roundFruitsActive[j] === fruit) { roundFruitsActive.splice(j, 1); break; } } } // Aumentar frutasFalladas y frutasGeneradas solo si la fruta no fue cortada if (!fruit.isCut) { frutasFalladas++; frutasGeneradas++; frutasGeneradasTxt.setText('Frutas: ' + frutasGeneradas); } } } } // Si la fruta ya fue cortada o salió de pantalla, eliminar if (!fruit.isActive || fruit.y > 2732 + fruit.radius + 20 || fruit.y < -fruit.radius - 20) { if (fruit.cutZoneCircle) { fruit.cutZoneCircle.destroy(); fruit.cutZoneCircle = null; } // Marcar como destruida para el sistema de ronda if (fruit.roundMeta) { fruit.roundMeta.destroyed = true; } // Eliminar de roundFruitsActive si está presente if (typeof roundFruitsActive !== "undefined") { for (var j = roundFruitsActive.length - 1; j >= 0; j--) { if (roundFruitsActive[j] === fruit) { roundFruitsActive.splice(j, 1); break; } } } fruit.destroy(); fallingFruits.splice(i, 1); } } // Limpiar mitades cortadas que ya terminaron animación for (var i = cutFruits.length - 1; i >= 0; i--) { var fc = cutFruits[i]; if (!fc.left || !fc.right) { if (fc.destroy) { fc.destroy(); } cutFruits.splice(i, 1); } } // Variable para controlar el timeout (debe estar fuera de la función que chequea frutasFalladas) var frutasFalladasTimeout = null; // En el lugar donde chequeas las frutas falladas: if (frutasFalladas >= 5) { if (!frutasFalladasTimeout) { console.log('Timeout iniciado para reiniciar juego en 2 segundos'); frutasFalladasTimeout = setTimeout(function () { console.log('Reiniciando juego ahora'); // Limpiar arrays y destruir objetos for (var i = fruits.length - 1; i >= 0; i--) { if (fruits[i]) { fruits[i].destroy(); } } fruits = []; for (var i = fallingFruits.length - 1; i >= 0; i--) { if (fallingFruits[i]) { fallingFruits[i].destroy(); } } fallingFruits = []; for (var i = cutFruits.length - 1; i >= 0; i--) { if (cutFruits[i]) { cutFruits[i].destroy(); } } cutFruits = []; if (typeof roundFruitsQueue !== "undefined") { for (var i = roundFruitsQueue.length - 1; i >= 0; i--) { if (roundFruitsQueue[i] && roundFruitsQueue[i].destroy) { roundFruitsQueue[i].destroy(); } } } roundFruitsQueue = []; if (typeof roundFruitsActive !== "undefined") { for (var i = roundFruitsActive.length - 1; i >= 0; i--) { if (roundFruitsActive[i] && roundFruitsActive[i].destroy) { roundFruitsActive[i].destroy(); } } } roundFruitsActive = []; // Reset variables de ronda y score roundState = 'waiting'; roundBulletsFired = 0; roundNextBulletTick = LK.ticks; // O la variable correcta de ticks roundDelayTicks = 0; frutasFalladas = 0; frutasGeneradas = 0; frutasGeneradasTxt.setText('Frutas: 0'); updateScore(0); frutasFalladasTimeout = null; // Resetear el timeout para poder reiniciar de nuevo }, 2000); } // Detener lógica siguiente mientras esperamos reinicio return; } }; // Inicializar score updateScore(0);
===================================================================
--- original.js
+++ change.js
@@ -22,9 +22,11 @@
self.isCut = false;
self.isActive = true; // Si está en juego
// Para saber si ya fue cortada
self.cut = function () {
- if (self.isCut) return;
+ if (self.isCut) {
+ return;
+ }
self.isCut = true;
self.isActive = false;
self.visible = false;
};
@@ -71,9 +73,11 @@
}, {
duration: 500,
easing: tween.cubicOut,
onFinish: function onFinish() {
- if (_onFinish) _onFinish();
+ if (_onFinish) {
+ _onFinish();
+ }
}
});
};
return self;
@@ -141,15 +145,19 @@
}
// Nueva lógica de corte: el corte se detecta solo cuando la fruta está en la zona de corte visual (círculo blanco animado).
function tryCutFruit(x, y) {
// Solo permite un corte por tick
- if (!canCut) return;
+ if (!canCut) {
+ return;
+ }
canCut = false;
lastTouchTick = LK.ticks;
// Buscar fruta que esté en estado 'cuttable', activa, y que el toque esté sobre la fruta
for (var i = 0; i < fallingFruits.length; i++) {
var fruit = fallingFruits[i];
- if (!fruit.isActive) continue;
+ if (!fruit.isActive) {
+ continue;
+ }
// Solo permite cortar si la fruta está en la zona de corte (cuttable) y el toque está sobre la fruta
if (fruit.state === 'cuttable') {
// Verifica si el toque está sobre la fruta (dentro del radio de la fruta)
var dx = x - fruit.x;
@@ -189,9 +197,11 @@
game.move = function (x, y, obj) {};
// Main update
game.update = function () {
// Permitir corte nuevamente tras 6 ticks (~100ms)
- if (!canCut && LK.ticks - lastTouchTick > 6) canCut = true;
+ if (!canCut && LK.ticks - lastTouchTick > 6) {
+ canCut = true;
+ }
// --- SISTEMA DE BALAS POR RONDA (5 balas, 1s entre cada una, 7s delay antes de mostrar en pantalla superior) ---
if (typeof roundState === "undefined") {
// Estados posibles: 'waiting', 'spawning', 'waitingFruits'
roundState = 'waiting';
@@ -205,29 +215,39 @@
}
if (roundState === 'waiting') {
// Limpiar arrays de frutas y mitades cortadas de la ronda anterior
for (var i = fruits.length - 1; i >= 0; i--) {
- if (fruits[i]) fruits[i].destroy();
+ if (fruits[i]) {
+ fruits[i].destroy();
+ }
}
fruits = [];
for (var i = fallingFruits.length - 1; i >= 0; i--) {
- if (fallingFruits[i]) fallingFruits[i].destroy();
+ if (fallingFruits[i]) {
+ fallingFruits[i].destroy();
+ }
}
fallingFruits = [];
for (var i = cutFruits.length - 1; i >= 0; i--) {
- if (cutFruits[i]) cutFruits[i].destroy();
+ if (cutFruits[i]) {
+ cutFruits[i].destroy();
+ }
}
cutFruits = [];
// Limpiar arrays de control de ronda
if (typeof roundFruitsQueue !== "undefined") {
for (var i = roundFruitsQueue.length - 1; i >= 0; i--) {
- if (roundFruitsQueue[i] && roundFruitsQueue[i].destroy) roundFruitsQueue[i].destroy();
+ if (roundFruitsQueue[i] && roundFruitsQueue[i].destroy) {
+ roundFruitsQueue[i].destroy();
+ }
}
}
roundFruitsQueue = [];
if (typeof roundFruitsActive !== "undefined") {
for (var i = roundFruitsActive.length - 1; i >= 0; i--) {
- if (roundFruitsActive[i] && roundFruitsActive[i].destroy) roundFruitsActive[i].destroy();
+ if (roundFruitsActive[i] && roundFruitsActive[i].destroy) {
+ roundFruitsActive[i].destroy();
+ }
}
}
roundFruitsActive = [];
// Reset meta de ronda
@@ -328,9 +348,11 @@
fruit.roundMeta.showScheduled = true;
fruit.roundMeta.showTimeout = LK.setTimeout(function (fruitRef, fruitsArr, iIdx) {
return function () {
// Si la fruta ya fue destruida antes del tiempo, no hacer nada
- if (fruitRef.roundMeta.destroyed) return;
+ if (fruitRef.roundMeta.destroyed) {
+ return;
+ }
// Eliminar de fruits[] y crear en pantalla superior
var fruitType = fruitRef.fruitType;
var x = fruitRef.x;
// Eliminar fruta oculta
@@ -413,23 +435,31 @@
}
// Mover frutas que suben de nuevo y gestionar zona de corte visual
for (var i = fallingFruits.length - 1; i >= 0; i--) {
var fruit = fallingFruits[i];
- if (!fruit.isActive) continue;
+ if (!fruit.isActive) {
+ continue;
+ }
// Escalado según altura (más arriba, más grande)
var minScale = 1.0;
var maxScale = 1.25;
var y0 = 2732 / 2 + 420;
var y1 = 420;
var t = (y0 - fruit.y) / (y0 - y1);
- if (t < 0) t = 0;
- if (t > 1) t = 1;
+ if (t < 0) {
+ t = 0;
+ }
+ if (t > 1) {
+ t = 1;
+ }
var scale = minScale + (maxScale - minScale) * t;
fruit.scaleX = fruit.scaleY = scale;
// Rotación suave
if (typeof fruit.rotationSpeed !== "undefined") {
fruit.rotation += fruit.rotationSpeed;
- if (fruit.fruitAsset) fruit.fruitAsset.rotation = fruit.rotation;
+ if (fruit.fruitAsset) {
+ fruit.fruitAsset.rotation = fruit.rotation;
+ }
}
// Movimiento hacia arriba mientras sea cortable o volando hacia arriba
if (fruit.state === 'cuttable' || fruit.state === 'flyingup') {
fruit.y -= fruitSpeed;
@@ -451,10 +481,14 @@
game.addChild(fruit.cutZoneCircle);
}
// Progresión del círculo: desde que inicia la subida hasta que llega cerca de la parte superior
var appearT = (y0 - fruit.y) / (y0 - y1);
- if (appearT < 0) appearT = 0;
- if (appearT > 1) appearT = 1;
+ if (appearT < 0) {
+ appearT = 0;
+ }
+ if (appearT > 1) {
+ appearT = 1;
+ }
var maxScaleZone = 0.85; // Más pequeño, para que quede dentro de la fruta
var minScaleZone = 0.15;
var maxAlpha = 0.38; // Más difuminado
var minAlpha = 0.08;
@@ -580,57 +614,70 @@
// Limpiar mitades cortadas que ya terminaron animación
for (var i = cutFruits.length - 1; i >= 0; i--) {
var fc = cutFruits[i];
if (!fc.left || !fc.right) {
- if (fc.destroy) fc.destroy();
+ if (fc.destroy) {
+ fc.destroy();
+ }
cutFruits.splice(i, 1);
}
}
- // Si frutasFalladas llega a 5, espera 2 segundos y reinicia el juego y todas las variables relevantes
+ // Variable para controlar el timeout (debe estar fuera de la función que chequea frutasFalladas)
+ var frutasFalladasTimeout = null;
+ // En el lugar donde chequeas las frutas falladas:
if (frutasFalladas >= 5) {
- if (typeof frutasFalladasTimeout === "undefined" || !frutasFalladasTimeout) {
- // Solo programar el timeout una vez
- frutasFalladasTimeout = LK.setTimeout(function () {
+ if (!frutasFalladasTimeout) {
+ console.log('Timeout iniciado para reiniciar juego en 2 segundos');
+ frutasFalladasTimeout = setTimeout(function () {
+ console.log('Reiniciando juego ahora');
// Limpiar arrays y destruir objetos
for (var i = fruits.length - 1; i >= 0; i--) {
- if (fruits[i]) fruits[i].destroy();
+ if (fruits[i]) {
+ fruits[i].destroy();
+ }
}
fruits = [];
for (var i = fallingFruits.length - 1; i >= 0; i--) {
- if (fallingFruits[i]) fallingFruits[i].destroy();
+ if (fallingFruits[i]) {
+ fallingFruits[i].destroy();
+ }
}
fallingFruits = [];
for (var i = cutFruits.length - 1; i >= 0; i--) {
- if (cutFruits[i]) cutFruits[i].destroy();
+ if (cutFruits[i]) {
+ cutFruits[i].destroy();
+ }
}
cutFruits = [];
if (typeof roundFruitsQueue !== "undefined") {
for (var i = roundFruitsQueue.length - 1; i >= 0; i--) {
- if (roundFruitsQueue[i] && roundFruitsQueue[i].destroy) roundFruitsQueue[i].destroy();
+ if (roundFruitsQueue[i] && roundFruitsQueue[i].destroy) {
+ roundFruitsQueue[i].destroy();
+ }
}
}
roundFruitsQueue = [];
if (typeof roundFruitsActive !== "undefined") {
for (var i = roundFruitsActive.length - 1; i >= 0; i--) {
- if (roundFruitsActive[i] && roundFruitsActive[i].destroy) roundFruitsActive[i].destroy();
+ if (roundFruitsActive[i] && roundFruitsActive[i].destroy) {
+ roundFruitsActive[i].destroy();
+ }
}
}
roundFruitsActive = [];
// Reset variables de ronda y score
roundState = 'waiting';
roundBulletsFired = 0;
- roundNextBulletTick = LK.ticks;
+ roundNextBulletTick = LK.ticks; // O la variable correcta de ticks
roundDelayTicks = 0;
frutasFalladas = 0;
frutasGeneradas = 0;
frutasGeneradasTxt.setText('Frutas: 0');
updateScore(0);
- frutasFalladasTimeout = null;
- // Forzar el reinicio de la ronda inmediatamente
- // (el siguiente update pasará a 'spawning' por roundState = 'waiting')
+ frutasFalladasTimeout = null; // Resetear el timeout para poder reiniciar de nuevo
}, 2000);
}
- // Detener el avance de la lógica de ronda mientras esperamos el reinicio
+ // Detener lógica siguiente mientras esperamos reinicio
return;
}
};
// Inicializar score
Kiwi Fruta con ojos lindos. In-Game asset. 2d. High contrast. No shadows. Cartoon.
Limon Circular Fruta con ojos lindos. In-Game asset. 2d. High contrast. No shadows. Cartoon.
Naranja Circular Fruta con ojos lindos. In-Game asset. 2d. High contrast. No shadows. Cartoon.
Manzana Fruta con ojos lindos. In-Game asset. 2d. High contrast. No shadows. Cartoon.
Ciruela Fruta con ojos lindos. In-Game asset. 2d. High contrast. No shadows. Cartoon.
Manzana Fruta cortada a la mitad. In-Game asset. 2d. High contrast. No shadows. Cartoon.
Kiwi Fruta cortado por la mitad. In-Game asset. 2d. High contrast. No shadows. Cartoon.
Limon Circular Cortado por la mitad. In-Game asset. 2d. High contrast. No shadows. Cartoon.
Naranja Circular Cortada por la mitad. In-Game asset. 2d. High contrast. No shadows. Cartoon.
Ciruela Fruta cortada por la mitad. In-Game asset. 2d. High contrast. No shadows. Cartoon.
Agrega una rueda en la parte trasera del cañon.
En lugar del numero 2 un numero 1
Letars GO! dentro del circulo.
Red cicle thiner but maintan the image size
En lugar del numero 1 un numero 2
Puedes hacer varias imagenes reemplazando el numero 2 por los numeros 3, 4, 5, 6, 7 y 8? Solo debe haber un numero en cada imagen.
En lugar del numero 3 un numero 4
En lugar del numero 4 un numero 5
En lugar del numero 5 un numero 6
En lugar del numero 6 un numero 7
En lugar del numero 1 un numero 8
En lugar del numero 1 un numero 9
En lugar del numero 9 un numero 10
En lugar del numero 1 un numero 11
Boton de juego que diga "START". In-Game asset. 2d. High contrast. No shadows
Boton de juego que diga "RESTART". In-Game asset. 2d. High contrast. No shadows
Boton de juego Azul que diga "MENU". In-Game asset. 2d. High contrast. No shadows
Un fondo colorido y brillante estilo caricatura. La escena es un bosque abierto alegre con colores pastel vibrantes, formas suaves y redondeadas, y un cielo azul claro con nubes esponjosas. El estilo es kawaii, juguetón y fantástico, con líneas suaves y una atmósfera feliz y amigable, perfecto para una introducción divertida y cute de un juego. In-Game asset. 2d. High contrast. No shadows
"Beat the Fruit" titulo para el juego, muestra las letras en grande blancas con un borde negro y sin fondo, con algunas frutitas felices junto a las letras. In-Game asset. 2d. High contrast. No shadows
Barra verde horizontal estilo caricatura.. In-Game asset. 2d. High contrast. No shadows