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) 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:
![]() bombUL.gif |
![]() bombU.gif |
![]() bombUR.gif |
![]() bombL.gif |
![]() bombR.gif |
![]() bombDL.gif |
![]() bombD.gif |
![]() bombDR.gif |
La bola de fuego tendrá su propia clase, llamada Bomb, con el siguiente aspecto:
Bomb.java |
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 :
Player.java |
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; 19 20 21 public Player(Stage stage) { 22 super(stage); 23 setSpriteNames( new String[] {"nave.gif"}); 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; 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 } 7980 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
Actor.java | Bomb.java | Bullet.java | Invaders.java |
Monster.java | Player.java | SpriteCache.java | Stage.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 |
(c) 2004 Planetalia S.L. Todos los derechos reservados. Prohibida su reproducción