Página Anterior - Muriendo | Página Actual - 24 - La venganza de los monstruos | Página Siguiente - Fondo con scroll |
Índice del curso |
(c) Alexander Hristov
Hasta este punto nuestro juego parecía más un juego de tiro al pato más que un Space Invaders. En este paso añadiremos la posibilidad de que los monstruos nos paguen con la misma medicina disparándonos.
Definiremos un nuevo actor al que llamaremos "Laser", que representará las cosas que los bichos nos dispararán. Para él utilizaremos la siguiente secuencia de gráficos, llamados disparo0.gif, disparo1.gif y disparo2.gif:
La clase Laser es muy similar a la clase Missile. Las únicas diferencias son el hecho de que el Laser tiene varios fotogramas (y por tanto una velocidad de fotogramas), que se desplaza hacia abajo y que es más lento que el misil::
Laser.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 version24; 10 11 12 public class Laser extends Actor { 13 protected static final int BULLET_SPEED=3; 14 15 public Laser(Stage stage) { 16 super(stage); 17 setSpriteNames( new String[] {"disparo0.gif","disparo1.gif","disparo2.gif"}); 18 setFrameSpeed(10); 19 } 20 21 public void act() { 22 super.act(); 23 y+=BULLET_SPEED; 24 if (y > Stage.PLAY_HEIGHT) 25 remove(); 26 } 27 } 28
Ahora debemos hacer que los monstruos puedan disparar aleatoriamente. De forma un poco arbitraria decidimos que en cada turno, un monstruo tiene una probabilidad del 1% de disparar. Considerando que hay casi un centenar de turnos por segundo, esta probabilidad proporciona un ritmo de disparo bastante aceptable. De hecho, cualquier otra frecuencia de disparo hace que nos enfrentemos a una lluvia de láseres. El proceso de disparo es muy similar al del jugador - se crea un nuevo actor (Laser) y se coloca justo debajo de monstruo que lo ha disparado:
Monster.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 version24; 10 11 public class Monster extends Actor { 12 protected int vx; 14 15 public Monster(Stage stage) { 16 super(stage); 17 setSpriteNames( new String[] {"bicho0.gif","bicho1.gif"}); 18 setFrameSpeed(35); 19 } 20 21 public void act() { 22 super.act(); 23 x+=vx; 24 if (x < 0 || x > Stage.WIDTH) 25 vx = -vx; 28 } 29 30 public int getVx() { return vx; } 31 public void setVx(int i) {vx = i; } 32 33 public void collision(Actor a) { 34 if (a instanceof Bullet || a instanceof Bomb) { 35 remove(); 36 stage.getPlayer().addScore(20); 37 } 38 } 3940 public void fire() { 41 Laser m = new Laser(stage); 42 m.setX(x+getWidth()/2); 43 m.setY(y + getHeight()); 44 stage.addActor(m); 45 }46 } 47
Finalmente debemos hacer que el jugador reaccione a las colisiones con los disparos. Por cada colisión, disminuiremos el escudo en 10 unidades:
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 version24; 10 11 import java.awt.event.KeyEvent; 12 13 public class Player extends Actor { 14 public static final int MAX_SHIELDS = 200; 15 public static final int MAX_BOMBS = 5; 16 protected static final int PLAYER_SPEED = 4; 17 protected int vx; 18 protected int vy; 19 private boolean up,down,left,right; 20 private int clusterBombs; 21 private int score; 22 private int shields; 23 24 25 public Player(Stage stage) { 26 super(stage); 27 setSpriteNames( new String[] {"nave.gif"}); 28 clusterBombs = MAX_BOMBS; 29 shields = MAX_SHIELDS; 30 score = 0; 31 } 32 33 public void act() { 34 super.act(); 35 x+=vx; 36 y+=vy; 37 if (x < 0 ) 38 x = 0; 39 if (x > Stage.WIDTH - getWidth()) 40 x = Stage.WIDTH - getWidth(); 41 if (y < 0 ) 42 y = 0; 43 if ( y > Stage.PLAY_HEIGHT-getHeight()) 44 y = Stage.PLAY_HEIGHT - getHeight(); 45 } 46 47 public int getVx() { return vx; } 48 public void setVx(int i) {vx = i; } 49 public int getVy() { return vy; } 50 public void setVy(int i) {vy = i; } 51 52 53 protected void updateSpeed() { 54 vx=0;vy=0; 55 if (down) vy = PLAYER_SPEED; 56 if (up) vy = -PLAYER_SPEED; 57 if (left) vx = -PLAYER_SPEED; 58 if (right) vx = PLAYER_SPEED; 59 } 60 61 public void keyReleased(KeyEvent e) { 62 switch (e.getKeyCode()) { 63 case KeyEvent.VK_DOWN : down = false;break; 64 case KeyEvent.VK_UP : up = false; break; 65 case KeyEvent.VK_LEFT : left = false; break; 66 case KeyEvent.VK_RIGHT : right = false;break; 67 } 68 updateSpeed(); 69 } 70 71 public void keyPressed(KeyEvent e) { 72 switch (e.getKeyCode()) { 73 case KeyEvent.VK_UP : up = true; break; 74 case KeyEvent.VK_LEFT : left = true; break; 75 case KeyEvent.VK_RIGHT : right = true; break; 76 case KeyEvent.VK_DOWN : down = true;break; 77 case KeyEvent.VK_SPACE : fire(); break; 78 case KeyEvent.VK_B : fireCluster(); break; 79 } 80 updateSpeed(); 81 } 82 83 public void fire() { 84 Bullet b = new Bullet(stage); 85 b.setX(x); 86 b.setY(y - b.getHeight()); 87 stage.addActor(b); 88 } 89 90 public void fireCluster() { 91 if (clusterBombs == 0) 92 return; 93 94 clusterBombs--; 95 stage.addActor( new Bomb(stage, Bomb.UP_LEFT, x,y)); 96 stage.addActor( new Bomb(stage, Bomb.UP,x,y)); 97 stage.addActor( new Bomb(stage, Bomb.UP_RIGHT,x,y)); 98 stage.addActor( new Bomb(stage, Bomb.LEFT,x,y)); 99 stage.addActor( new Bomb(stage, Bomb.RIGHT,x,y)); 100 stage.addActor( new Bomb(stage, Bomb.DOWN_LEFT,x,y)); 101 stage.addActor( new Bomb(stage, Bomb.DOWN,x,y)); 102 stage.addActor( new Bomb(stage, Bomb.DOWN_RIGHT,x,y)); 103 } 104 105 public int getScore() { return score; } 106 public void setScore(int i) { score = i; } 107 public void addScore(int i) { score += i; } 108 109 public int getShields() { return shields; } 110 public void setShields(int i) { shields = i; } 111 public void addShields(int i) { 112 shields += i; 113 if (shields > MAX_SHIELDS) shields = MAX_SHIELDS; 114 } 115 116 public void collision(Actor a) { 117 if (a instanceof Monster ) { 118 a.remove(); 119 addScore(40); 120 addShields(-40); 121 } 125 } 126 if (getShields() < 0) 127 stage.gameOver(); 128 } 129 130 public int getClusterBombs() { return clusterBombs; } 131 public void setClusterBombs(int i) { clusterBombs = i; } 132 133 } 134
Actor.java | Bomb.java | Bullet.java | Invaders.java |
Laser.java | Monster.java | Player.java | SpriteCache.java |
Stage.java |
Página Anterior - Muriendo | Página Actual - 24 - La venganza de los monstruos | Página Siguiente - Fondo con scroll |
Índice del curso |
(c) 2004 Planetalia S.L. Todos los derechos reservados. Prohibida su reproducción