User prompt
Calcular la distancia una vez por cada par enemigo-jugador y reutilizarla: - Almacenar la distancia calculada en una variable - Usar esta misma distancia tanto para la colisión de balas como para las comprobaciones de colisión directa.
User prompt
Calcula los límites de eliminación según el tamaño y la escala reales de cada tipo de enemigo: Para enemigos normales: usa su ancho/alto real - Para enemigos jefes: ten en cuenta su escala 2x, así que usa `-200` en lugar de `-100` - Para enemigos con escudo: usa sus dimensiones específicas - Crea límites de eliminación específicos para cada tipo de enemigo en lugar de usar un `-100` universal
User prompt
Restaurar la lógica de eliminación fuera de la pantalla para los enemigos que se mueven demasiado a la izquierda.
User prompt
los enemigos solo desaparecen al ser atacados por el jugador.
User prompt
las balas deberan impactar en el centro del jugador para causar daño.
User prompt
el jugador iniciara el juego con 3 vidas. siempre que reciba un impacto perdera una vida.
User prompt
el enemigo rapido tendra la imagen de nombre enemigorapido. el enemigo escudo tendra la imagen de nombre enemigoescudo. el enemigo jefe tendra la imagen de nombre jefe.
User prompt
los enemigos no van a tener colores como verde y azul
User prompt
agrega tres tipos de enemigos mas
User prompt
la imagen de las balas depende de su direccion
User prompt
la imagen de bala girala hacia la derecha
User prompt
las balas de los enemigos seran iguales a las del jugador las balas del jugador miraran hacia donde dispares igual con las balas de los enemigos pero veran hacia atras
User prompt
el juego solo termina cuando los enemigos dañen al jugador y los enemigos pueden disparar
User prompt
los enemigos solo podran reaparecer en la parte de la derecha de la pantalla para arreglar el bug
User prompt
el jugador se podra mover hacia arriba y hacia abajo
User prompt
el jugador dispara a donde apuntes
User prompt
la aparición de enemigos se reducira a la mitad de la pantalla
User prompt
cuando pasa un enemigo por afuera de la pantalla perderas
User prompt
la condición de victoria sera de un puntaje de 10,000
User prompt
el jugador dispara tambien hacia arriba
User prompt
el jugador siempre dispara de forma automatica
User prompt
empieza el juego en el centro de la pantalla
User prompt
lateral mente se mantendra igual
User prompt
el area de juego sera mas pequeña y cerca del jugador para poder disparar a todos los enemigos
User prompt
reduce el campo de juego
/**** * Plugins ****/ var tween = LK.import("@upit/tween.v1"); /**** * Classes ****/ var Bullet = Container.expand(function () { var self = Container.call(this); var bulletGraphics = self.attachAsset('bullet', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 8; self.lastX = undefined; self.lastY = undefined; self.directionX = 1; // Default horizontal direction self.directionY = 0; // Default no vertical movement self.update = function () { if (self.lastX === undefined) self.lastX = self.x; if (self.lastY === undefined) self.lastY = self.y; self.x += self.speed * self.directionX; self.y += self.speed * self.directionY; self.lastX = self.x; self.lastY = self.y; }; return self; }); var Enemy = Container.expand(function () { var self = Container.call(this); var enemyGraphics = self.attachAsset('enemy', { anchorX: 0.5, anchorY: 0.5 }); self.speed = -3; self.lastX = undefined; self.shootCooldown = 0; self.update = function () { // Initialize lastX on first frame if not set if (self.lastX === undefined) { self.lastX = self.x; return; // Skip first frame to avoid premature trigger } // Move enemy left self.x += self.speed; // Update shooting cooldown if (self.shootCooldown > 0) { self.shootCooldown--; } // Update lastX for next frame self.lastX = self.x; }; self.canShoot = function () { return self.shootCooldown <= 0; }; self.shoot = function () { if (self.canShoot()) { self.shootCooldown = 60; // 1 second cooldown return true; } return false; }; return self; }); var EnemyBullet = Container.expand(function () { var self = Container.call(this); var bulletGraphics = self.attachAsset('bullet', { anchorX: 0.5, anchorY: 0.5 }); bulletGraphics.tint = 0xFF0000; // Red tint for enemy bullets self.speed = 6; self.lastX = undefined; self.lastY = undefined; self.directionX = -1; // Default moving left self.directionY = 0; // Default no vertical movement self.update = function () { if (self.lastX === undefined) self.lastX = self.x; if (self.lastY === undefined) self.lastY = self.y; self.x += self.speed * self.directionX; self.y += self.speed * self.directionY; self.lastX = self.x; self.lastY = self.y; }; return self; }); var Player = Container.expand(function () { var self = Container.call(this); var playerGraphics = self.attachAsset('player', { anchorX: 0.5, anchorY: 0.5 }); self.shootCooldown = 0; self.update = function () { if (self.shootCooldown > 0) { self.shootCooldown--; } }; self.canShoot = function () { return self.shootCooldown <= 0; }; self.shoot = function () { if (self.canShoot()) { self.shootCooldown = 10; // 10 frames cooldown return true; } return false; }; return self; }); /**** * Initialize Game ****/ var game = new LK.Game({ backgroundColor: 0x1a1a2e }); /**** * Game Code ****/ var player = new Player(); var enemies = []; var bullets = []; var enemyBullets = []; var enemySpawnTimer = 0; var enemySpawnRate = 120; // Start spawning every 2 seconds (120 frames) var difficultyTimer = 0; // Position player in bottom-left corner of screen player.x = 150; player.y = 2732 - 150; // Near bottom with some margin game.addChild(player); // Create score display var scoreTxt = new Text2('0', { size: 100, fill: 0xFFFFFF }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); scoreTxt.setText(LK.getScore()); var isDragging = false; // Touch/mouse down - start dragging and shoot game.down = function (x, y, obj) { isDragging = true; // Move player to touch position (constrain to vertical movement) player.y = Math.max(100, Math.min(2732 - 100, y)); if (player.shoot()) { var bullet = new Bullet(); bullet.x = player.x + 40; // Spawn slightly ahead of player bullet.y = player.y - 40; // Spawn slightly above player bullet.lastX = bullet.x; bullet.lastY = bullet.y; // Calculate direction vector from player to tap position var deltaX = x - player.x; var deltaY = y - player.y; var distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY); // Normalize the direction vector if (distance > 0) { bullet.directionX = deltaX / distance; bullet.directionY = deltaY / distance; } else { // Fallback if tap is exactly on player bullet.directionX = 1; bullet.directionY = 0; } bullets.push(bullet); game.addChild(bullet); LK.getSound('shoot').play(); } }; // Touch/mouse move - move player vertically while dragging game.move = function (x, y, obj) { if (isDragging) { // Move player to touch position (constrain to vertical movement) player.y = Math.max(100, Math.min(2732 - 100, y)); } }; // Touch/mouse up - stop dragging game.up = function (x, y, obj) { isDragging = false; }; game.update = function () { // Update enemy spawn timer and difficulty enemySpawnTimer++; difficultyTimer++; // Increase difficulty every 10 seconds (600 frames) if (difficultyTimer % 600 === 0 && enemySpawnRate > 30) { enemySpawnRate -= 10; // Spawn enemies more frequently } // Spawn enemies if (enemySpawnTimer >= enemySpawnRate) { var enemy = new Enemy(); enemy.x = 2048 + 30; // Spawn just off right edge enemy.y = Math.random() * (2732 - 200) + 100; // Random Y position with margins enemy.lastX = enemy.x; enemies.push(enemy); game.addChild(enemy); enemySpawnTimer = 0; } // Update and check bullets for (var i = bullets.length - 1; i >= 0; i--) { var bullet = bullets[i]; // Remove bullets that go off screen if (bullet.x > 2048 + 50 || bullet.y < -50) { bullet.destroy(); bullets.splice(i, 1); continue; } // Check bullet vs enemy collisions var bulletHit = false; for (var j = enemies.length - 1; j >= 0; j--) { var enemy = enemies[j]; if (bullet.intersects(enemy)) { // Bullet hit enemy LK.setScore(LK.getScore() + 10); scoreTxt.setText(LK.getScore()); // Check for victory condition if (LK.getScore() >= 10000) { LK.showYouWin(); return; } // Visual feedback tween(enemy, { scaleX: 1.5, scaleY: 1.5, alpha: 0 }, { duration: 200, onFinish: function onFinish() { if (enemy.parent) { enemy.destroy(); } } }); enemies.splice(j, 1); bullet.destroy(); bullets.splice(i, 1); bulletHit = true; LK.getSound('hit').play(); break; } } if (bulletHit) continue; } // Update and check enemy bullets for (var m = enemyBullets.length - 1; m >= 0; m--) { var enemyBullet = enemyBullets[m]; // Remove enemy bullets that go off screen if (enemyBullet.x < -50 || enemyBullet.y < -50 || enemyBullet.y > 2732 + 50) { enemyBullet.destroy(); enemyBullets.splice(m, 1); continue; } // Check if enemy bullet hits player if (enemyBullet.intersects(player)) { LK.effects.flashScreen(0xFF0000, 1000); LK.showGameOver(); return; } } // Update and check enemies for (var k = enemies.length - 1; k >= 0; k--) { var enemy = enemies[k]; // Remove enemies that go off screen if (enemy.x < -100) { enemy.destroy(); enemies.splice(k, 1); continue; } // Enemy shooting logic if (enemy.shoot()) { var enemyBullet = new EnemyBullet(); enemyBullet.x = enemy.x - 30; // Spawn slightly ahead of enemy enemyBullet.y = enemy.y; enemyBullet.lastX = enemyBullet.x; enemyBullet.lastY = enemyBullet.y; // Calculate direction vector from enemy to player var deltaX = player.x - enemy.x; var deltaY = player.y - enemy.y; var distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY); // Normalize the direction vector if (distance > 0) { enemyBullet.directionX = deltaX / distance; enemyBullet.directionY = deltaY / distance; } else { // Fallback direction enemyBullet.directionX = -1; enemyBullet.directionY = 0; } enemyBullets.push(enemyBullet); game.addChild(enemyBullet); } // Check if enemy collides with player if (enemy.intersects(player)) { LK.effects.flashScreen(0xFF0000, 1000); LK.showGameOver(); return; } } }; // Play background music LK.playMusic('bgmusic');
===================================================================
--- original.js
+++ change.js
@@ -34,27 +34,58 @@
anchorY: 0.5
});
self.speed = -3;
self.lastX = undefined;
+ self.shootCooldown = 0;
self.update = function () {
// Initialize lastX on first frame if not set
if (self.lastX === undefined) {
self.lastX = self.x;
return; // Skip first frame to avoid premature trigger
}
// Move enemy left
self.x += self.speed;
- // Check if enemy passed completely outside the left edge (transition detection)
- if (self.lastX > -50 && self.x <= -50) {
- // Enemy passed outside screen - game over
- LK.effects.flashScreen(0xFF0000, 1000);
- LK.showGameOver();
+ // Update shooting cooldown
+ if (self.shootCooldown > 0) {
+ self.shootCooldown--;
}
// Update lastX for next frame
self.lastX = self.x;
};
+ self.canShoot = function () {
+ return self.shootCooldown <= 0;
+ };
+ self.shoot = function () {
+ if (self.canShoot()) {
+ self.shootCooldown = 60; // 1 second cooldown
+ return true;
+ }
+ return false;
+ };
return self;
});
+var EnemyBullet = Container.expand(function () {
+ var self = Container.call(this);
+ var bulletGraphics = self.attachAsset('bullet', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ bulletGraphics.tint = 0xFF0000; // Red tint for enemy bullets
+ self.speed = 6;
+ self.lastX = undefined;
+ self.lastY = undefined;
+ self.directionX = -1; // Default moving left
+ self.directionY = 0; // Default no vertical movement
+ self.update = function () {
+ if (self.lastX === undefined) self.lastX = self.x;
+ if (self.lastY === undefined) self.lastY = self.y;
+ self.x += self.speed * self.directionX;
+ self.y += self.speed * self.directionY;
+ self.lastX = self.x;
+ self.lastY = self.y;
+ };
+ return self;
+});
var Player = Container.expand(function () {
var self = Container.call(this);
var playerGraphics = self.attachAsset('player', {
anchorX: 0.5,
@@ -91,8 +122,9 @@
****/
var player = new Player();
var enemies = [];
var bullets = [];
+var enemyBullets = [];
var enemySpawnTimer = 0;
var enemySpawnRate = 120; // Start spawning every 2 seconds (120 frames)
var difficultyTimer = 0;
// Position player in bottom-left corner of screen
@@ -210,11 +242,56 @@
}
}
if (bulletHit) continue;
}
+ // Update and check enemy bullets
+ for (var m = enemyBullets.length - 1; m >= 0; m--) {
+ var enemyBullet = enemyBullets[m];
+ // Remove enemy bullets that go off screen
+ if (enemyBullet.x < -50 || enemyBullet.y < -50 || enemyBullet.y > 2732 + 50) {
+ enemyBullet.destroy();
+ enemyBullets.splice(m, 1);
+ continue;
+ }
+ // Check if enemy bullet hits player
+ if (enemyBullet.intersects(player)) {
+ LK.effects.flashScreen(0xFF0000, 1000);
+ LK.showGameOver();
+ return;
+ }
+ }
// Update and check enemies
for (var k = enemies.length - 1; k >= 0; k--) {
var enemy = enemies[k];
+ // Remove enemies that go off screen
+ if (enemy.x < -100) {
+ enemy.destroy();
+ enemies.splice(k, 1);
+ continue;
+ }
+ // Enemy shooting logic
+ if (enemy.shoot()) {
+ var enemyBullet = new EnemyBullet();
+ enemyBullet.x = enemy.x - 30; // Spawn slightly ahead of enemy
+ enemyBullet.y = enemy.y;
+ enemyBullet.lastX = enemyBullet.x;
+ enemyBullet.lastY = enemyBullet.y;
+ // Calculate direction vector from enemy to player
+ var deltaX = player.x - enemy.x;
+ var deltaY = player.y - enemy.y;
+ var distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY);
+ // Normalize the direction vector
+ if (distance > 0) {
+ enemyBullet.directionX = deltaX / distance;
+ enemyBullet.directionY = deltaY / distance;
+ } else {
+ // Fallback direction
+ enemyBullet.directionX = -1;
+ enemyBullet.directionY = 0;
+ }
+ enemyBullets.push(enemyBullet);
+ game.addChild(enemyBullet);
+ }
// Check if enemy collides with player
if (enemy.intersects(player)) {
LK.effects.flashScreen(0xFF0000, 1000);
LK.showGameOver();
tommy vercetti de gta vice city hecho con pixeles apuntando con un rifle de asalto m4 con la perspcetiva lateral. In-Game asset. 2d. High contrast. No shadows
un mafioso italiano usando un m4 con la perspectiva lateral de cuerpo completo In-Game asset. 2d. High contrast. No shadows
un pandillero mexicano apuntando con un SMG con la perspectiva lateral. In-Game asset. 2d. High contrast. No shadows de cuerpo completo
un pandillero negro con camisa azul oscuro y pantalon blanco usando una escopeta con la perspectiva lateral de cuerpo completo. In-Game asset. 2d. High contrast. No shadows
chaleco antibalas. In-Game asset. 2d. High contrast. No shadows
corazon verde dibujado. In-Game asset. 2d. High contrast. No shadows
escopeta dibujada. In-Game asset. 2d. High contrast. No shadows
claude speed de gta 3 apuntando con una ak47 desde una perspectiva lateral de cuerpo completo In-Game asset. 2d. High contrast. No shadows
las letras play con un color celeste y rosa combinados con una cursiva In-Game asset. 2d. High contrast. No shadows con contorno negro
letras que dicen seleccion de personaje con un color rosa y un color celeste y con contorno azul y rosa cursiva. In-Game asset. 2d. High contrast. No shadows
las letras vidas con un color rosa y azul con contorno rosa y azul combinados hechos con pixeles. In-Game asset. 2d. High contrast. No shadows
una mansion con piso rojo vista completa y totalmente desde arriba y desde dentro con una escalera grande igual que la de scarface la pelicula y pasillos a los lados. In-Game asset. 2d. High contrast. No shadows
no va a tener ese brazo especificamente
un motociclista vestido de negro apuntando con una smg de cuerpo completo con perspectiva lateral In-Game asset. 2d. High contrast. No shadows sin casco y sin moto
letras de color rosa y azul y con cursiva que digan vice city wars. In-Game asset. 2d. High contrast. No shadows
un hombre usando una chaqueta negra pantalones azules disparando un ak47. In-Game asset. 2d. High contrast. No shadows con la perspectiva lateral de cuerpo completo
letras de color rosa que dicen seleccion de personaje en cursiva y con contorno blanco