Cursos y Másters | ||
| Inicio Profesores Aulas Testimonios Cursos Masters Tecnologías Cursos Gratuitos Solicitar Información Ofertas de Empleo |
| Página Anterior - Detección de colisiones | Página Actual - 21 - Barra de estado | Página Siguiente - Puntuación |
| Índice de cursos Java gratuitos |
Barra de estadoAhora que somos capaces de matar a los bichos, sería útil disponer de alguna clase de puntuación para motivarnos en nuestro xenocidio. En este paso añadiremos una barra de estado en la parte inferior de la pantalla. Esta barra contendrá lo siguiente:
Vamos a comenzar primero por la puntuación y los escudos. Estos atributos pertenecen a la clase del jugador, así que los añadiremos allí, junto con sus correspondientes métodos de acceso. Por otra parte, en este punto me he dado cuenta que es bastante molesto que la nave del jugador "rebote" cuando llega a los límites de la pantalla, así que hemos aprovechado para modificar este comportamiento y hacer que en su lugar si el jugador trata de salirse de la pantalla, simplemente se queda en el borde.
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 version21; 10 11 import java.awt.event.KeyEvent; 12 13 public class Player extends Actor { 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; 23 24 25 public Player(Stage stage) { 26 super(stage); 27 setSpriteNames( new String[] {"nave.gif"}); 28 clusterBombs = MAX_BOMBS; 30 score = 0; 31 } 32 Lo siguiente que debemos hacer es cambiar el tamaño del area de juego, ya que ahora debemos reservar una parte para el redibujo del estado actual. Así que añadimos una nueva constante llamada PLAY_HEIGHT a la clase Stage. Esta constante contendrá el tamaño del área de juego:
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 version21; 10 11 import java.awt.image.ImageObserver; 12 13 public interface Stage extends ImageObserver { 14 public static final int WIDTH=640; 15 public static final int HEIGHT=480; 17 public static final int SPEED=10; 18 public SpriteCache getSpriteCache(); 19 public void addActor(Actor a); 20 } 21 El mayor cambio ocurrirá en la clase Invaders, donde ahora tendremos cuatro métodos para dibujar las diferentes partes de la barra de estado:
1 package version21; 2 /** 3 * Curso B?sico de desarrollo de Juegos en Java - Invaders 4 * 5 * (c) 2004 Planetalia S.L. - Todos los derechos reservados. Prohibida su reproducci?n 6 * 7 * http://www.planetalia.com 8 * 9 */ 10 11 12 import java.awt.Canvas; 13 import java.awt.Color; 14 import java.awt.Dimension; 15 import java.awt.Font; 16 import java.awt.Graphics2D; 17 import java.awt.Rectangle; 18 import java.awt.event.KeyEvent; 19 import java.awt.event.KeyListener; 20 import java.awt.event.WindowAdapter; 21 import java.awt.event.WindowEvent; 22 import java.awt.image.BufferStrategy; 23 import java.awt.image.BufferedImage; 24 import java.util.ArrayList; 25 26 import javax.swing.JFrame; 27 import javax.swing.JPanel; 28 29 public class Invaders extends Canvas implements Stage, KeyListener { 30 31 private BufferStrategy strategy; 32 private long usedTime; 33 34 private SpriteCache spriteCache; 35 private ArrayList actors; 36 private Player player; 37 38 public Invaders() { 39 spriteCache = new SpriteCache(); 40 41 42 JFrame ventana = new JFrame("Invaders"); 43 JPanel panel = (JPanel)ventana.getContentPane(); 44 setBounds(0,0,Stage.WIDTH,Stage.HEIGHT); 45 panel.setPreferredSize(new Dimension(Stage.WIDTH,Stage.HEIGHT)); 46 panel.setLayout(null); 47 panel.add(this); 48 ventana.setBounds(0,0,Stage.WIDTH,Stage.HEIGHT); 49 ventana.setVisible(true); 50 ventana.addWindowListener( new WindowAdapter() { 51 public void windowClosing(WindowEvent e) { 52 System.exit(0); 53 } 54 }); 55 ventana.setResizable(false); 56 createBufferStrategy(2); 57 strategy = getBufferStrategy(); 58 requestFocus(); 59 addKeyListener(this); 60 } 61 62 public void initWorld() { 63 actors = new ArrayList(); 64 for (int i = 0; i < 10; i++){ 65 Monster m = new Monster(this); 66 m.setX( (int)(Math.random()*Stage.WIDTH) ); 67 m.setY( i*20 ); 68 m.setVx( (int)(Math.random()*20-10) ); 69 70 actors.add(m); 71 } 72 73 player = new Player(this); 74 player.setX(Stage.WIDTH/2); 75 player.setY(Stage.PLAY_HEIGHT - 2*player.getHeight()); 76 } 77 78 public void addActor(Actor a) { 79 actors.add(a); 80 } 81 82 public void updateWorld() { 83 int i = 0; 84 while (i < actors.size()) { 85 Actor m = (Actor)actors.get(i); 86 if (m.isMarkedForRemoval()) { 87 actors.remove(i); 88 } else { 89 m.act(); 90 i++; 91 } 92 } 93 player.act(); 94 } 95 96 public void checkCollisions() { 97 Rectangle playerBounds = player.getBounds(); 98 for (int i = 0; i < actors.size(); i++) { 99 Actor a1 = (Actor)actors.get(i); 100 Rectangle r1 = a1.getBounds(); 101 if (r1.intersects(playerBounds)) { 102 player.collision(a1); 103 a1.collision(player); 104 } 105 for (int j = i+1; j < actors.size(); j++) { 106 Actor a2 = (Actor)actors.get(j); 107 Rectangle r2 = a2.getBounds(); 108 if (r1.intersects(r2)) { 109 a1.collision(a2); 110 a2.collision(a1); 111 } 112 } 113 } 114 } 115 El resultado ahora es:
|
||||||||||||||||||||
¿Quieres ser notificado cuando salan nuevos tutoriales y cursos?. Pulsa aquí
| Bomb.java | Bullet.java | Stage.java | Monster.java |
| SpriteCache.java | Invaders.java | Actor.java | Player.java |
| Página Anterior - Detección de colisiones | Página Actual - 21 - Barra de estado | Página Siguiente - Puntuación |
| Índice de cursos Java gratuitos |
(c) 2004 Planetalia S.L. Todos los derechos reservados. Prohibida su reproducción