Planetalia - Cursos

Cursos y Másters

Inicio    Profesores    Aulas    Testimonios    Cursos    Masters    Tecnologías    Cursos Gratuitos    Solicitar Información    Ofertas de Empleo   

Curso - Programación de un Space Invaders en Java

  Página Anterior - Optimizando todavía más la carga de imágenes Página Actual - 07 - Bucle principal   Página Siguiente - Limpiando la basura
  Índice de cursos Java gratuitos  

Bucle principal

(c) Alexander Hristov

Ahora que ya tenemos un sistema que nos permite cargar imágenes de forma cómoda, es hora de ver cómo hacer que las cosas en nuestro juego de Java cambien. De la misma forma en que todas las aplicaciones de Windows tienen un núcleo llamado "bucle de proceso de mensajes" o Message Loop, algo muy similar sucede con los juegos. Un juego básicamente de forma continua está haciendo lo siguiente:

  1. Actualizar el "estado del mundo" o el "escenario">
  2. Si es preciso, refrescar la pantalla
  3. Volver al punto 1

En el primer paso es donde ocurren todos los movimientos de monstruos, las acciones del jugador, la aparición o desaparición de elementos, los cambios de nivel, la comprobación de si se ha terminado el juego, etc. Por supuesto todo esto no se hace en la misma rutina, pero sí se puede pensar que constituye una etapa claramente diferenciada de la siguiente, en la que - si ha habido cambios en lo que el jugador está viendo, entonces se dibuja de nuevo

Vamos a implementar este sistema en nuestro juego Java. El bucle principal estará en una rutina a la que llamaremos game(). La rutina que actualiza el estado del mundo será updateWorld() y finalmente la que dibuja la pantalla de momento seguirá siendo paint().

En este paso, la "actualización del mundo" consistirá en que el bicho cambiará de posición aleatoriamente. Por eso necesitaremos dos variables gloales llamadas posX y posY que guardarán su posición, de forma que el método updateWorld() pueda modificarlas y el método paint() pueda utilizarlas para pintar al bicho en su posición:

Con esta idea, el código queda como sigue:


1     package version07;
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.Dimension;
14    import java.awt.Graphics;
15    import java.awt.event.WindowAdapter;
16    import java.awt.event.WindowEvent;
17    import java.awt.image.BufferedImage;
18    import java.net.URL;
19    import java.util.HashMap;
20    
21    import javax.imageio.ImageIO;
22    import javax.swing.JFrame;
23    import javax.swing.JPanel;
24    
25    public class Invaders extends Canvas {
26      public static final int WIDTH = 640;
27      public static final int HEIGHT = 480;
28      
29      public HashMap sprites;
30      public int posX,posY;
31      
32      public Invaders() {
33        sprites = new HashMap();
34        posX = WIDTH/2;
35        posY = HEIGHT/2;
36        
37        JFrame ventana = new JFrame("Invaders");
38        JPanel panel = (JPanel)ventana.getContentPane();
39        setBounds(0,0,WIDTH,HEIGHT);
40        panel.setPreferredSize(new Dimension(WIDTH,HEIGHT));
41        panel.setLayout(null);
42        panel.add(this);
43        ventana.setBounds(0,0,WIDTH,HEIGHT);
44        ventana.setVisible(true);
45        ventana.addWindowListener( new WindowAdapter() {
46          public void windowClosing(WindowEvent e) {
47            System.exit(0);
48          }
49        });
50        ventana.setResizable(false);
51      }
52      
53      public BufferedImage loadImage(String nombre) {
54        URL url=null;
55        try {
56          url = getClass().getClassLoader().getResource(nombre);
57          return ImageIO.read(url);
58        } catch (Exception e) {
59          System.out.println("No se pudo cargar la imagen " + nombre +" de "+url);
60          System.out.println("El error fue : "+e.getClass().getName()+" "+e.getMessage());
61          System.exit(0);
62          return null;
63        }
64      }
65      
66      public BufferedImage getSprite(String nombre) {
67        BufferedImage img = (BufferedImage)sprites.get(nombre);
68        if (img == null) {
69          img = loadImage("res/"+nombre);
70          sprites.put(nombre,img);
71        }
72        return img;
73      }
74      
75      
76      public void paint(Graphics g) {
77        g.drawImage(getSprite("bicho.gif"), posX, posY,this);
78      }
79      
80 public void updateWorld() { 81 posX = (int)(Math.random()*WIDTH); 82 posY = (int)(Math.random()*HEIGHT); 83 }
84
85 public void game() { 86 while (isVisible()) { 87 updateWorld(); 88 paint(getGraphics()); 89 } 90 }
91 92 public static void main(String[] args) { 93 Invaders inv = new Invaders(); 94 inv.game(); 95 } 96 } 97

Hemos aprovechado también a incluir el método setResizable(false) en el constructor para que el usuario no pueda redimensionar el tamaño de la ventana.

Si ejecutamos este programa, nos encontraremos con una sorpresa y es que la ventana se llena inmediatamente de bichos:

Curso Space Invaders en Java
¿Dónde está Wally?

Claramente tenemos un problema : como somos nosotros los que manualmente estamos llamando al método paint(), no estamos borrando lo que había antes en la pantalla, con lo que el bicho se pinta en la nueva posición pero sin que sea eliminado de la antigua.



¿Quieres ser notificado cuando salan nuevos tutoriales y cursos?. Pulsa aquí


Lista de archivos Java del programa en este paso

Invaders.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 test.gif
Thumbs.db      

  Página Anterior - Optimizando todavía más la carga de imágenes Página Actual - 07 - Bucle principal   Página Siguiente - Limpiando la basura
  Índice de cursos Java gratuitos  

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