User prompt
coloca la imagen boton de inicio en el boton de play
User prompt
elimina el boton de inicio
User prompt
agrega un boton de inicio en medio de la pantalla
User prompt
agrega un boton de inicio invisible debajo de la seleccion de personaje
User prompt
borrar las letras start game
User prompt
la imagen boton de inicio hara la funcion del boton de inicio.
User prompt
agrega una imagen para el boton de inicio
User prompt
agrega un boton de start
User prompt
el sonido disparo enemigo sonara siempre que los enemigos disparen
User prompt
la imagen de fondo cubre toda la pantalla
User prompt
poner un fondo
User prompt
las imagenes de seleccionar tu personaje giralas a la derecha
User prompt
eliminar la bala en la seleccion de personajes
User prompt
elimina los textos de los personajes
User prompt
si mas de 5 enemigos pasan la parte de abajo pierdes el juego
User prompt
agrega otro tipo de enemigo
User prompt
actualiza la interfaz al seleccionar el personaje
User prompt
que las balas de los enemigos sean las mismas que dispara el jugador
User prompt
agrega una customizacion de personaje y crea un
User prompt
agrega un nuevo personaje
User prompt
agrega un menu de inicio
User prompt
quita el color rojo del enemigo rapido. los enemigos tambien disparan al jugador.
User prompt
otro tipo de enemigo
User prompt
has al jugador
User prompt
Space Defender
/**** * Classes ****/ var BomberEnemy = Container.expand(function () { var self = Container.call(this); var enemyGraphics = self.attachAsset('bomberEnemy', { anchorX: 0.5, anchorY: 0.5 }); // Bomber enemy properties self.speed = 2; // Medium speed self.hitPoints = 2; // Takes 2 hits to destroy self.maxHitPoints = 2; self.shootCooldown = 0; self.shootRate = 120; // Shoots every 2 seconds // Visual feedback for damage self.updateTint = function () { var damageRatio = self.hitPoints / self.maxHitPoints; if (damageRatio > 0.5) { enemyGraphics.tint = 0xFFFFFF; // White (no damage) } else { enemyGraphics.tint = 0xFFAAAA; // Light red (damaged) } }; self.updateTint(); // Initialize tint self.update = function () { if (self.lastY === undefined) self.lastY = self.y; self.y += self.speed; // Update shooting cooldown self.shootCooldown--; // Check if enemy went off screen (transition from on-screen to off-screen) if (self.lastY <= 2732 + 50 && self.y > 2732 + 50) { self.shouldDestroy = true; } self.lastY = self.y; }; return self; }); var Bullet = Container.expand(function () { var self = Container.call(this); var bulletGraphics = self.attachAsset('bullet', { anchorX: 0.5, anchorY: 0.5 }); self.speed = -15; self.update = function () { if (self.lastY === undefined) self.lastY = self.y; self.y += self.speed; // Check if bullet went off screen (transition from on-screen to off-screen) if (self.lastY >= -50 && self.y < -50) { self.shouldDestroy = true; } self.lastY = self.y; }; return self; }); var CustomizationMenu = Container.expand(function () { var self = Container.call(this); self.selectedShipType = 'playerShip'; // Default ship self.shipPreviews = []; // Create ship selection buttons var shipTypes = ['playerShip', 'playerShip2', 'playerShip3']; var shipNames = ['Warrior', 'Archer', 'Mage']; for (var i = 0; i < shipTypes.length; i++) { var shipContainer = new Container(); // Ship preview var shipPreview = LK.getAsset(shipTypes[i], { anchorX: 0.5, anchorY: 0.5, scaleX: 2, scaleY: 2 }); shipPreview.x = 0; shipPreview.y = -40; shipContainer.addChild(shipPreview); // Ship name var nameText = new Text2(shipNames[i], { size: 40, fill: 0xFFFFFF }); nameText.anchor.set(0.5, 0.5); nameText.x = 0; nameText.y = 60; shipContainer.addChild(nameText); // Selection border var border = LK.getAsset('bullet', { anchorX: 0.5, anchorY: 0.5, scaleX: 8, scaleY: 4, alpha: 0 }); border.tint = 0x00FF00; border.x = 0; border.y = -40; shipContainer.addChild(border); // Position ships horizontally shipContainer.x = 2048 / 2 + (i - 1) * 400; shipContainer.y = 2732 / 2; // Store references shipContainer.shipType = shipTypes[i]; shipContainer.border = border; shipContainer.preview = shipPreview; self.shipPreviews.push(shipContainer); self.addChild(shipContainer); } // Highlight default selection self.shipPreviews[0].border.alpha = 1; self.selectShip = function (shipType) { self.selectedShipType = shipType; // Update visual selection for (var i = 0; i < self.shipPreviews.length; i++) { if (self.shipPreviews[i].shipType === shipType) { self.shipPreviews[i].border.alpha = 1; } else { self.shipPreviews[i].border.alpha = 0; } } }; 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.update = function () { if (self.lastY === undefined) self.lastY = self.y; self.y += self.speed; // Check if enemy went off screen (transition from on-screen to off-screen) if (self.lastY <= 2732 + 50 && self.y > 2732 + 50) { self.shouldDestroy = true; } self.lastY = self.y; }; return self; }); var EnemyBullet = Container.expand(function () { var self = Container.call(this); var bulletGraphics = self.attachAsset('bullet', { anchorX: 0.5, anchorY: 0.5 }); self.speed = 8; self.update = function () { if (self.lastY === undefined) self.lastY = self.y; self.y += self.speed; // Check if bullet went off screen (transition from on-screen to off-screen) if (self.lastY <= 2732 + 50 && self.y > 2732 + 50) { self.shouldDestroy = true; } self.lastY = self.y; }; return self; }); var FastEnemy = Container.expand(function () { var self = Container.call(this); var enemyGraphics = self.attachAsset('fastEnemy', { anchorX: 0.5, anchorY: 0.5 }); // FastEnemy without red tint for differentiation self.speed = 6; // Faster than regular enemy self.update = function () { if (self.lastY === undefined) self.lastY = self.y; self.y += self.speed; // Check if enemy went off screen (transition from on-screen to off-screen) if (self.lastY <= 2732 + 50 && self.y > 2732 + 50) { self.shouldDestroy = true; } self.lastY = self.y; }; return self; }); var Player = Container.expand(function () { var self = Container.call(this); var playerGraphics = self.attachAsset('playerShip', { anchorX: 0.5, anchorY: 0.5 }); return self; }); var TankEnemy = Container.expand(function () { var self = Container.call(this); var enemyGraphics = self.attachAsset('tankEnemy', { anchorX: 0.5, anchorY: 0.5 }); // Tank enemy properties self.speed = 1.5; // Slower than other enemies self.hitPoints = 3; // Takes 3 hits to destroy self.maxHitPoints = 3; // Visual feedback for damage self.updateTint = function () { var damageRatio = self.hitPoints / self.maxHitPoints; if (damageRatio > 0.66) { enemyGraphics.tint = 0xFFFFFF; // White (no damage) } else if (damageRatio > 0.33) { enemyGraphics.tint = 0xFFAAAA; // Light red (medium damage) } else { enemyGraphics.tint = 0xFF6666; // Red (heavy damage) } }; self.updateTint(); // Initialize tint self.update = function () { if (self.lastY === undefined) self.lastY = self.y; self.y += self.speed; // Check if enemy went off screen (transition from on-screen to off-screen) if (self.lastY <= 2732 + 50 && self.y > 2732 + 50) { self.shouldDestroy = true; } self.lastY = self.y; }; return self; }); /**** * Initialize Game ****/ // Game variables var game = new LK.Game({ backgroundColor: 0x001122 }); /**** * Game Code ****/ // Game variables var gameStarted = false; var showingCustomization = false; var startMenu; var customizationMenu; var selectedShipType = 'playerShip'; var player; var bullets = []; var enemyBullets = []; var enemies = []; var enemySpawnTimer = 0; var enemySpawnRate = 60; // Frames between enemy spawns var enemyShootTimer = 0; var dragNode = null; // Score display var scoreTxt = new Text2('Score: 0', { size: 60, fill: 0xFFFFFF }); scoreTxt.anchor.set(0.5, 0); LK.gui.top.addChild(scoreTxt); // Create start menu startMenu = new Container(); game.addChild(startMenu); // Menu background var menuBg = LK.getAsset('playerShip', { anchorX: 0.5, anchorY: 0.5, scaleX: 8, scaleY: 8, alpha: 0.3 }); menuBg.x = 2048 / 2; menuBg.y = 2732 / 2 - 200; startMenu.addChild(menuBg); // Game title var titleTxt = new Text2('SPACE DEFENDER', { size: 120, fill: 0xFFFFFF }); titleTxt.anchor.set(0.5, 0.5); titleTxt.x = 2048 / 2; titleTxt.y = 2732 / 2 - 400; startMenu.addChild(titleTxt); // Instructions var instructionsTxt = new Text2('Drag to move\nTap to shoot\nDestroy enemies to score!', { size: 60, fill: 0xCCCCCC }); instructionsTxt.anchor.set(0.5, 0.5); instructionsTxt.x = 2048 / 2; instructionsTxt.y = 2732 / 2 - 100; startMenu.addChild(instructionsTxt); // Customize button var customizeBtnTxt = new Text2('CUSTOMIZE CHARACTER', { size: 60, fill: 0xFFAA00 }); customizeBtnTxt.anchor.set(0.5, 0.5); customizeBtnTxt.x = 2048 / 2; customizeBtnTxt.y = 2732 / 2 + 100; startMenu.addChild(customizeBtnTxt); // Start button var startBtnTxt = new Text2('TAP TO START', { size: 80, fill: 0x00FF00 }); startBtnTxt.anchor.set(0.5, 0.5); startBtnTxt.x = 2048 / 2; startBtnTxt.y = 2732 / 2 + 200; startMenu.addChild(startBtnTxt); // Create customization menu customizationMenu = new CustomizationMenu(); game.addChild(customizationMenu); customizationMenu.visible = false; // Add title to customization menu var customTitle = new Text2('SELECT YOUR CHARACTER', { size: 80, fill: 0xFFFFFF }); customTitle.anchor.set(0.5, 0.5); customTitle.x = 2048 / 2; customTitle.y = 2732 / 2 - 300; customizationMenu.addChild(customTitle); // Add back button to customization menu var backBtnTxt = new Text2('BACK', { size: 60, fill: 0xFF4444 }); backBtnTxt.anchor.set(0.5, 0.5); backBtnTxt.x = 2048 / 2; backBtnTxt.y = 2732 / 2 + 300; customizationMenu.addChild(backBtnTxt); // Add play button to customization menu var playBtnTxt = new Text2('PLAY', { size: 80, fill: 0x00FF00 }); playBtnTxt.anchor.set(0.5, 0.5); playBtnTxt.x = 2048 / 2; playBtnTxt.y = 2732 / 2 + 200; customizationMenu.addChild(playBtnTxt); // Hide game elements initially scoreTxt.visible = false; // Create player with selected ship type function function createPlayer() { if (player) { player.destroy(); } player = game.addChild(new Player()); // Replace player graphics with selected character player.removeChildren(); var newCharacterGraphics = player.attachAsset(selectedShipType, { anchorX: 0.5, anchorY: 0.5 }); player.x = 2048 / 2; player.y = 2732 - 150; // Position near bottom of screen } createPlayer(); // Touch/mouse controls game.down = function (x, y, obj) { if (!gameStarted && !showingCustomization) { // Check if customize button was tapped if (y >= 2732 / 2 + 70 && y <= 2732 / 2 + 130) { // Show customization menu showingCustomization = true; startMenu.visible = false; customizationMenu.visible = true; return; } // Check if start button was tapped if (y >= 2732 / 2 + 170 && y <= 2732 / 2 + 230) { // Start the game gameStarted = true; startMenu.visible = false; scoreTxt.visible = true; createPlayer(); // Recreate player with selected character return; } return; } if (showingCustomization) { // Handle customization menu clicks // Check ship selection for (var i = 0; i < customizationMenu.shipPreviews.length; i++) { var shipContainer = customizationMenu.shipPreviews[i]; var shipX = shipContainer.x; var shipY = shipContainer.y; if (x >= shipX - 100 && x <= shipX + 100 && y >= shipY - 100 && y <= shipY + 100) { selectedShipType = shipContainer.shipType; customizationMenu.selectShip(selectedShipType); return; } } // Check back button if (y >= 2732 / 2 + 270 && y <= 2732 / 2 + 330) { showingCustomization = false; customizationMenu.visible = false; startMenu.visible = true; return; } // Check play button if (y >= 2732 / 2 + 170 && y <= 2732 / 2 + 230) { gameStarted = true; showingCustomization = false; customizationMenu.visible = false; scoreTxt.visible = true; createPlayer(); // Recreate player with selected character return; } return; } dragNode = player; player.x = x; // Shoot bullet var bullet = new Bullet(); bullet.x = player.x; bullet.y = player.y - 30; bullets.push(bullet); game.addChild(bullet); LK.getSound('shoot').play(); }; game.move = function (x, y, obj) { if (gameStarted && dragNode) { // Keep player within screen bounds dragNode.x = Math.max(40, Math.min(2048 - 40, x)); } }; game.up = function (x, y, obj) { dragNode = null; }; // Main game update loop game.update = function () { if (!gameStarted) { return; } // Update bullets for (var i = bullets.length - 1; i >= 0; i--) { var bullet = bullets[i]; if (bullet.shouldDestroy) { bullet.destroy(); bullets.splice(i, 1); continue; } // Check bullet vs enemy collisions for (var j = enemies.length - 1; j >= 0; j--) { var enemy = enemies[j]; if (bullet.intersects(enemy)) { // Destroy bullet bullet.destroy(); bullets.splice(i, 1); // Handle different enemy types if (enemy instanceof TankEnemy) { // Tank enemy takes multiple hits enemy.hitPoints--; enemy.updateTint(); // Update visual damage if (enemy.hitPoints <= 0) { enemy.destroy(); enemies.splice(j, 1); LK.setScore(LK.getScore() + 50); // High score for tank scoreTxt.setText('Score: ' + LK.getScore()); } LK.getSound('enemyHit').play(); } else if (enemy instanceof BomberEnemy) { // Bomber enemy takes 2 hits enemy.hitPoints--; enemy.updateTint(); // Update visual damage if (enemy.hitPoints <= 0) { enemy.destroy(); enemies.splice(j, 1); LK.setScore(LK.getScore() + 30); // Medium score for bomber scoreTxt.setText('Score: ' + LK.getScore()); } LK.getSound('enemyHit').play(); } else { // Regular and fast enemies destroyed in one hit enemy.destroy(); enemies.splice(j, 1); // Increase score - more points for fast enemies var points = enemy instanceof FastEnemy ? 20 : 10; LK.setScore(LK.getScore() + points); scoreTxt.setText('Score: ' + LK.getScore()); LK.getSound('enemyHit').play(); } break; } } } // Update enemy bullets for (var m = enemyBullets.length - 1; m >= 0; m--) { var enemyBullet = enemyBullets[m]; if (enemyBullet.shouldDestroy) { enemyBullet.destroy(); enemyBullets.splice(m, 1); continue; } // Check enemy bullet vs player collision if (enemyBullet.intersects(player)) { // Game Over LK.effects.flashScreen(0xff0000, 1000); LK.showGameOver(); return; } } // Update enemies for (var k = enemies.length - 1; k >= 0; k--) { var enemy = enemies[k]; if (enemy.shouldDestroy) { enemy.destroy(); enemies.splice(k, 1); continue; } // Bomber enemy shooting behavior if (enemy instanceof BomberEnemy && enemy.shootCooldown <= 0 && enemy.y > 0 && enemy.y < 2400) { enemy.shootCooldown = enemy.shootRate; var bomberBullet = new EnemyBullet(); bomberBullet.x = enemy.x; bomberBullet.y = enemy.y + 50; enemyBullets.push(bomberBullet); game.addChild(bomberBullet); LK.getSound('shoot').play(); } // Check enemy vs player collision if (enemy.intersects(player)) { // Game Over LK.effects.flashScreen(0xff0000, 1000); LK.showGameOver(); return; } } // Enemy shooting enemyShootTimer++; if (enemyShootTimer >= 90) { // Enemies shoot every 1.5 seconds enemyShootTimer = 0; // Random enemy shoots if (enemies.length > 0) { var shootingEnemy = enemies[Math.floor(Math.random() * enemies.length)]; var enemyBullet = new EnemyBullet(); enemyBullet.x = shootingEnemy.x; enemyBullet.y = shootingEnemy.y + 30; enemyBullets.push(enemyBullet); game.addChild(enemyBullet); LK.getSound('shoot').play(); } } // Spawn enemies enemySpawnTimer++; if (enemySpawnTimer >= enemySpawnRate) { enemySpawnTimer = 0; var enemy; var randomValue = Math.random(); // 8% tank, 15% bomber, 25% fast, 52% regular enemy if (randomValue < 0.08) { enemy = new TankEnemy(); } else if (randomValue < 0.23) { enemy = new BomberEnemy(); } else if (randomValue < 0.48) { enemy = new FastEnemy(); } else { enemy = new Enemy(); } enemy.x = Math.random() * (2048 - 120) + 60; // Random X position within bounds enemy.y = -30; // Start above screen enemies.push(enemy); game.addChild(enemy); // Gradually increase difficulty if (enemySpawnRate > 20) { enemySpawnRate -= 0.5; } } };
===================================================================
--- original.js
+++ change.js
@@ -1,7 +1,42 @@
/****
* Classes
****/
+var BomberEnemy = Container.expand(function () {
+ var self = Container.call(this);
+ var enemyGraphics = self.attachAsset('bomberEnemy', {
+ anchorX: 0.5,
+ anchorY: 0.5
+ });
+ // Bomber enemy properties
+ self.speed = 2; // Medium speed
+ self.hitPoints = 2; // Takes 2 hits to destroy
+ self.maxHitPoints = 2;
+ self.shootCooldown = 0;
+ self.shootRate = 120; // Shoots every 2 seconds
+ // Visual feedback for damage
+ self.updateTint = function () {
+ var damageRatio = self.hitPoints / self.maxHitPoints;
+ if (damageRatio > 0.5) {
+ enemyGraphics.tint = 0xFFFFFF; // White (no damage)
+ } else {
+ enemyGraphics.tint = 0xFFAAAA; // Light red (damaged)
+ }
+ };
+ self.updateTint(); // Initialize tint
+ self.update = function () {
+ if (self.lastY === undefined) self.lastY = self.y;
+ self.y += self.speed;
+ // Update shooting cooldown
+ self.shootCooldown--;
+ // Check if enemy went off screen (transition from on-screen to off-screen)
+ if (self.lastY <= 2732 + 50 && self.y > 2732 + 50) {
+ self.shouldDestroy = true;
+ }
+ self.lastY = self.y;
+ };
+ return self;
+});
var Bullet = Container.expand(function () {
var self = Container.call(this);
var bulletGraphics = self.attachAsset('bullet', {
anchorX: 0.5,
@@ -415,8 +450,19 @@
LK.setScore(LK.getScore() + 50); // High score for tank
scoreTxt.setText('Score: ' + LK.getScore());
}
LK.getSound('enemyHit').play();
+ } else if (enemy instanceof BomberEnemy) {
+ // Bomber enemy takes 2 hits
+ enemy.hitPoints--;
+ enemy.updateTint(); // Update visual damage
+ if (enemy.hitPoints <= 0) {
+ enemy.destroy();
+ enemies.splice(j, 1);
+ LK.setScore(LK.getScore() + 30); // Medium score for bomber
+ scoreTxt.setText('Score: ' + LK.getScore());
+ }
+ LK.getSound('enemyHit').play();
} else {
// Regular and fast enemies destroyed in one hit
enemy.destroy();
enemies.splice(j, 1);
@@ -453,8 +499,18 @@
enemy.destroy();
enemies.splice(k, 1);
continue;
}
+ // Bomber enemy shooting behavior
+ if (enemy instanceof BomberEnemy && enemy.shootCooldown <= 0 && enemy.y > 0 && enemy.y < 2400) {
+ enemy.shootCooldown = enemy.shootRate;
+ var bomberBullet = new EnemyBullet();
+ bomberBullet.x = enemy.x;
+ bomberBullet.y = enemy.y + 50;
+ enemyBullets.push(bomberBullet);
+ game.addChild(bomberBullet);
+ LK.getSound('shoot').play();
+ }
// Check enemy vs player collision
if (enemy.intersects(player)) {
// Game Over
LK.effects.flashScreen(0xff0000, 1000);
@@ -483,12 +539,14 @@
if (enemySpawnTimer >= enemySpawnRate) {
enemySpawnTimer = 0;
var enemy;
var randomValue = Math.random();
- // 10% chance to spawn tank enemy, 25% fast enemy, 65% regular enemy
- if (randomValue < 0.1) {
+ // 8% tank, 15% bomber, 25% fast, 52% regular enemy
+ if (randomValue < 0.08) {
enemy = new TankEnemy();
- } else if (randomValue < 0.35) {
+ } else if (randomValue < 0.23) {
+ enemy = new BomberEnemy();
+ } else if (randomValue < 0.48) {
enemy = new FastEnemy();
} else {
enemy = new Enemy();
}
bala de rifle de asalto hecha con pixeles. In-Game asset. 2d. High contrast. No shadows
una calle muy ancha de un vecindario peligroso hecho con pixeles y la perspectiva desde el cielo In-Game asset. 2d. High contrast. No shadows
una pistola negra hecha con pixeles que diga start en medio In-Game asset. 2d. High contrast. No shadows
chaleco antibalas negro hecho con pixeles.. In-Game asset. 2d. High contrast. No shadows
corazon rojo hecho con pixeles. In-Game asset. 2d. High contrast. No shadows
minigun negra hecha con pixeles.. In-Game asset. 2d. High contrast. No shadows
un rifle de asalto m4 negro que en medio diga seleccion de personaje hecho con pixeles. In-Game asset. 2d. High contrast. No shadows
un cuchillo hecho con pixeles que tenga escrito back. In-Game asset. 2d. High contrast. No shadows
letras negras con contorno blanco que dicen select your character con letra cursiva. In-Game asset. 2d. High contrast. No shadows
texto hecho con pixeles que diga lives. In-Game asset. 2d. High contrast. No shadows
texto hecho con pixeles que diga score. In-Game asset. 2d. High contrast. No shadows
cj de gta san andreas con perspectiva trasera desde arriba usando un arma, hecho con pixeles.
sweet de gta san andreas usando un arma con perspectiva trasera desde arriba hecho con pixeles. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
un pandillero peligroso vestido de verde usando un arma con perspectiva trasera desde arriba hecho con pixeles. No background. Transparent background. Blank background. No shadows. 2d. In-Game asset. flat
pandillero de morado hecho con pixeles. con perspectiva desde arriba visto de frente apuntando con un m4 In-Game asset. 2d. High contrast. No shadows
pandillero de amarillo hecho con pixeles con perspectiva desde arriba visto de frente apuntando hacia enfrente con un arma In-Game asset. 2d. High contrast. No shadows
pandillero de morado hecho con pixeles con perspectiva desde arriba visto de frente apuntando hacia enfrente con un arma In-Game asset. 2d. High contrast. No shadows
sicario vestido de negro hecho con pixeles y con armas con perspectiva desde arriba visto de frente apuntando con un arma
letras blancas con un contorno negro con cursiva. que dicen san andreas stories In-Game asset. 2d. High contrast. No shadows con el tipo de letra del el juego gta san andreas
letras que dicen san andreas stories blancas hechas con pixeles. In-Game asset. 2d. High contrast. No shadows