Cursos y Másters | ||
| Inicio Profesores Aulas Testimonios Cursos Masters Tecnologías Cursos Gratuitos Galería de Proyectos Solicitar Información |
| 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 principalAhora 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:
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 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:
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í
| Invaders.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 |
(c) 2004 Planetalia S.L. Todos los derechos reservados. Prohibida su reproducción