Planetalia - Cursos

Cursos y Másters

Inicio    Profesores    Aulas    Testimonios    Cursos    Masters    Tecnologías    Cursos Gratuitos    Galería de Proyectos    Solicitar Información   

Curso - Programación de un Space Invaders en Java

  Página Anterior - Más lento que el ojo Página Actual - 11 - Doble Búfer automático   Página Siguiente - Medición del rendimiento
  Índice de cursos Java gratuitos  

Doble Búfer automático

(c) Alexander Hristov

La técnica del doble buffer es tan extendida que en el JDK 1.4 se incluyó un mecanismo automático para realizar este tipo de operaciones, permitiendo además que la visualización del buffer se haga mediante mecanismos más acelerados dependientes de la plataforma (como por ejemplo, mover el puntero de memoria de la tarjeta gráfica que indica dónde comienza el buffer de vídeo en lugar de copiar ese buffer a otra zona de memoria).

La clase que permite implementar este tipo de operaciones se llama BufferStrategy y se encuentra en el paquete java.awt.image. La forma de utilizarla es extremadamente sencilla:

  1. En primer lugar, se decide qué ventana o componente es la que presentará este tipo de comportamiento. Se ha de escoger aquel componente sobre el que vamos a pintar (en nuestro caso es la propia clase Invaders)
  2. Se llama al método createBufferStratgy(n) de esa ventana, pasando como parámetro el número de buffers que queremos tener
  3. Utilizamos el método getBufferStrategy() de la ventana para obtener un objeto de tipo BufferStrategy, que representa básicamente una ristra de buffers de memoria - tantos como fue el parámetro que pasamos a createBufferStrategy()
  4. En todo momento hay un "buffer de dibujo" y un "buffer visible". Para poder pintar encima del buffer de dibujo, llamamos al método getDrawGraphics() del objeto BufferStrategy obtenido anteriormente.
  5. Cuando hemos terminado de pintar, llamamos al método show() del objeto BufferStrategy para indicar que el buffer está listo y que queremos mostrar el siguiente buffer

Con esta técnica, el programa quedaría de la siguiente forma:


1     package version11;
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.Graphics;
16    import java.awt.event.WindowAdapter;
17    import java.awt.event.WindowEvent;
18    import java.awt.image.BufferStrategy;
19    import java.awt.image.BufferedImage;
20    import java.net.URL;
21    import java.util.HashMap;
22    
23    import javax.imageio.ImageIO;
24    import javax.swing.JFrame;
25    import javax.swing.JPanel;
26    
27    public class Invaders extends Canvas {
28      public static final int WIDTH = 640;
29      public static final int HEIGHT = 480;
30      public static final int SPEED = 10;
31      
32 public BufferStrategy strategy;
33 public HashMap sprites; 34 public int posX,posY,vX; 35 36 public Invaders() { 37 sprites = new HashMap(); 38 posX = WIDTH/2; 39 posY = HEIGHT/2; 40 vX = 2; 41 42 JFrame ventana = new JFrame("Invaders"); 43 JPanel panel = (JPanel)ventana.getContentPane(); 44 setBounds(0,0,WIDTH,HEIGHT); 45 panel.setPreferredSize(new Dimension(WIDTH,HEIGHT)); 46 panel.setLayout(null); 47 panel.add(this); 48 ventana.setBounds(0,0,WIDTH,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 } 60 61 public BufferedImage loadImage(String nombre) { 62 URL url=null; 63 try { 64 url = getClass().getClassLoader().getResource(nombre); 65 return ImageIO.read(url); 66 } catch (Exception e) { 67 System.out.println("No se pudo cargar la imagen " + nombre +" de "+url); 68 System.out.println("El error fue : "+e.getClass().getName()+" "+e.getMessage()); 69 System.exit(0); 70 return null; 71 } 72 } 73 74 public BufferedImage getSprite(String nombre) { 75 BufferedImage img = (BufferedImage)sprites.get(nombre); 76 if (img == null) { 77 img = loadImage("res/"+nombre); 78 sprites.put(nombre,img); 79 } 80 return img; 81 } 82 83 public void paintWorld() {
84 Graphics g = strategy.getDrawGraphics();
85 g.setColor(Color.black); 86 g.fillRect(0,0,getWidth(),getHeight()); 87 g.drawImage(getSprite("bicho.gif"), posX, posY,this);
88 strategy.show();
89 } 90 91 92 93 public void updateWorld() { 94 posX += vX; 95 if (posX < 0 || posX > WIDTH) vX = -vX; 96 } 97 98 public void game() { 99 while (isVisible()) { 100 updateWorld(); 101 paintWorld(); 102 try { 103 Thread.sleep(SPEED); 104 } catch (InterruptedException e) {} 105 } 106 } 107 108 public static void main(String[] args) { 109 Invaders inv = new Invaders(); 110 inv.game(); 111 } 112 }


¿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 - Más lento que el ojo Página Actual - 11 - Doble Búfer automático   Página Siguiente - Medición del rendimiento
  Índice de cursos Java gratuitos  

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