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;
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
¿Quieres ser notificado cuando salan nuevos tutoriales y cursos?.
Pulsa aquí