Curso - Programación de un Space Invaders en Java

  Página Anterior - Disparos Página Actual - 19 - Más disparos - Bombas de fragmentación   Página Siguiente - Detección de colisiones
  Índice del curso  

Más disparos - Bombas de fragmentación

(c) Alexander Hristov

Vamos a comprobar las delicias de la programación orientada a objetos añadiendo un nuevo tipo de disparo - la "bomba de fragmentación". El usuario tendrá un número limitado de estas bombas (supongamos inicialmente 5) y cada vez que dispare una, aparecerán ocho bolas de fuego que saldrán despedidas en las ocho direcciones posibles. Para este propósito utilizaremos los siguientes gráficos:

Java
bombUL.gif
Java
bombU.gif
Java
bombUR.gif
Java
bombL.gif
  Java
bombR.gif
Java
bombDL.gif
Java
bombD.gif
Java
bombDR.gif

La bola de fuego tendrá su propia clase, llamada Bomb, con el siguiente aspecto:


1     /**
2      * Curso Básico de desarrollo de Juegos en Java - Invaders
3      * 
4      * (c) 2004 Planetalia S.L. - Todos los derechos reservados. Prohibida su reproducción
5      * 
6      * http://www.planetalia.com
7      * 
8      */
9     package version19;
10    
11    
12    public class Bomb extends Actor {
13      public static final int UP_LEFT = 0;
14      public static final int UP = 1;
15      public static final int UP_RIGHT = 2;
16      public static final int LEFT = 3;
17      public static final int RIGHT = 4;
18      public static final int DOWN_LEFT = 5;
19      public static final int DOWN = 6;
20      public static final int DOWN_RIGHT = 7;
21      
22      protected static final int BOMB_SPEED = 5; 
23      protected int vx;
24      protected int vy;
25      
26      public Bomb(Stage stage, int heading, int x, int y) {
27        super(stage);
28        this.x = x;
29        this.y = y;
30        String sprite ="";
31        switch (heading) {
32          case UP_LEFT : vx = -BOMB_SPEED; vy = -BOMB_SPEED; sprite="bombUL.gif";break;
33          case UP : vx = 0; vy = -BOMB_SPEED; sprite="bombU.gif";break;
34          case UP_RIGHT: vx = BOMB_SPEED; vy = -BOMB_SPEED; sprite="bombUR.gif";break;
35          case LEFT : vx = -BOMB_SPEED; vy = 0; sprite = "bombL.gif";break;
36          case RIGHT : vx = BOMB_SPEED; vy = 0; sprite = "bombR.gif";break;
37          case DOWN_LEFT : vx = -BOMB_SPEED; vy = BOMB_SPEED; sprite="bombDL.gif";break;
38          case DOWN : vx = 0; vy = BOMB_SPEED; sprite = "bombD.gif";break;
39          case DOWN_RIGHT : vx = BOMB_SPEED; vy = BOMB_SPEED; sprite = "bombDR.gif";break;
40        }   
41        setSpriteNames( new String[] {sprite});
42      }
43      
44      public void act() {
45        super.act();
46        y+=vy;
47        x+=vx;
48        if (y < 0 || y > Stage.HEIGHT || x < 0 || x > Stage.WIDTH)
49          remove();
50      }
51    }

Respecto a los otros actores, la novedad de este es que el aspecto visual cambia según la dirección en la que se mueve. Además podemos ver que el método act() se limita a mover la bomba y borrarla si se sale de la pantalla en algún momento

La clase Player debe ser modificada para llevar el contador de las bombas de las que disponemos y para hacer que al pulsar una tecla especial (en nuestro ejemplo será "B") se disparen las ocho bolas de fuego :


1     /**
2      * Curso Básico de desarrollo de Juegos en Java - Invaders
3      * 
4      * (c) 2004 Planetalia S.L. - Todos los derechos reservados. Prohibida su reproducción
5      * 
6      * http://www.planetalia.com
7      * 
8      */
9     package version19;
10    
11    import java.awt.event.KeyEvent;
12    
13    public class Player extends Actor {
14      protected static final int PLAYER_SPEED = 4;
15      protected int vx;
16      protected int vy;
17      private boolean up,down,left,right;
18 private int clusterBombs;
19 20 21 public Player(Stage stage) { 22 super(stage); 23 setSpriteNames( new String[] {"nave.gif"});
24 clusterBombs = 5;
25 } 26 27 public void act() { 28 super.act(); 29 x+=vx; 30 y+=vy; 31 if (x < 0 || x > Stage.WIDTH) 32 vx = -vx; 33 if (y < 0 || y > Stage.HEIGHT) 34 vy = -vy; 35 } 36 37 public int getVx() { return vx; } 38 public void setVx(int i) {vx = i; } 39 public int getVy() { return vy; } 40 public void setVy(int i) {vy = i; } 41 42 43 protected void updateSpeed() { 44 vx=0;vy=0; 45 if (down) vy = PLAYER_SPEED; 46 if (up) vy = -PLAYER_SPEED; 47 if (left) vx = -PLAYER_SPEED; 48 if (right) vx = PLAYER_SPEED; 49 } 50 51 public void keyReleased(KeyEvent e) { 52 switch (e.getKeyCode()) { 53 case KeyEvent.VK_DOWN : down = false;break; 54 case KeyEvent.VK_UP : up = false; break; 55 case KeyEvent.VK_LEFT : left = false; break; 56 case KeyEvent.VK_RIGHT : right = false;break; 57 } 58 updateSpeed(); 59 } 60 61 public void keyPressed(KeyEvent e) { 62 switch (e.getKeyCode()) { 63 case KeyEvent.VK_UP : up = true; break; 64 case KeyEvent.VK_LEFT : left = true; break; 65 case KeyEvent.VK_RIGHT : right = true; break; 66 case KeyEvent.VK_DOWN : down = true;break; 67 case KeyEvent.VK_SPACE : fire(); break;
68 case KeyEvent.VK_B : fireCluster(); break;
69 } 70 updateSpeed(); 71 } 72 73 public void fire() { 74 Bullet b = new Bullet(stage); 75 b.setX(x); 76 b.setY(y - b.getHeight()); 77 stage.addActor(b); 78 } 79
80 public void fireCluster() { 81 if (clusterBombs == 0) 82 return; 83 84 clusterBombs--; 85 stage.addActor( new Bomb(stage, Bomb.UP_LEFT, x,y)); 86 stage.addActor( new Bomb(stage, Bomb.UP,x,y)); 87 stage.addActor( new Bomb(stage, Bomb.UP_RIGHT,x,y)); 88 stage.addActor( new Bomb(stage, Bomb.LEFT,x,y)); 89 stage.addActor( new Bomb(stage, Bomb.RIGHT,x,y)); 90 stage.addActor( new Bomb(stage, Bomb.DOWN_LEFT,x,y)); 91 stage.addActor( new Bomb(stage, Bomb.DOWN,x,y)); 92 stage.addActor( new Bomb(stage, Bomb.DOWN_RIGHT,x,y)); 93 }
94 95 } 96

Curso de Space Invaders en Java



Lista de archivos Java del programa en este paso

Actor.java Bomb.java Bullet.java Invaders.java
Monster.java Player.java SpriteCache.java Stage.java

Lista de recursos

bicho.gif bicho0.gif bicho1.gif bicho2.gif
bombD.gif bombDL.gif bombDR.gif bombL.gif
bombR.gif bombU.gif bombUL.gif bombUR.gif
disparo.gif disparo0.gif disparo1.gif disparo2.gif
explosion.wav misil.gif missile.wav musica.wav
nave.gif oceano.gif photon.wav Thumbs.db

  Página Anterior - Disparos Página Actual - 19 - Más disparos - Bombas de fragmentación   Página Siguiente - Detección de colisiones
  Índice del curso  

(c) 2004 Planetalia S.L. Todos los derechos reservados. Prohibida su reproducción