elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a la Factorización De Semiprimos (RSA)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  Problema con Mediatracker
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problema con Mediatracker  (Leído 1,845 veces)
~~
Ex-Staff
*
Desconectado Desconectado

Mensajes: 2.981


Ver Perfil WWW
Problema con Mediatracker
« en: 22 Diciembre 2008, 19:54 pm »

Hola

Estoy realizando una aplicación que me tiene que pintar sobre un JFrame una imagen de fondo (cargada en un BufferedImage) e ir pintando dentro de ese mismo BufferedImage distintas figuras geométricas.
El problema es que la imagen de fondo es de tamaño 800x600 que se pinta en la constructora de la clase "Fondo" y no le da tiempo. Pongo el código y luego explico con más detalle:

Main.java:
Código
  1. public class Main extends JFrame
  2. {    
  3.    // Ancho y alto de la ventana
  4.    private final int ANCHO = 800;
  5.    private final int ALTO  = 600;    
  6.  
  7.    // El media tracker
  8.    MediaTracker tracker;
  9.  
  10.    // El fondo
  11.    Fondo fondo;
  12.  
  13.    /***************************************************************************
  14.      **************************       INCIALIZAR      **************************
  15.      ***************************************************************************/
  16.  
  17.    public static void main(String[] args) { new Main(); }
  18.  
  19.    Main()
  20.    {
  21.        // Inicializamos los objetos
  22.        tracker = new MediaTracker(this); // El media tracker que usaré comúnmente a todas las clases
  23.        fondo   = new Fondo(tracker);
  24.  
  25.        // Inicializamos las propiedades de la ventana
  26.        this.setTitle("Roimpiendo texturas");
  27.        this.setSize (ANCHO, ALTO);
  28.        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
  29.        this.setLocation(150, 150);
  30.        this.setVisible(true);      
  31.    }
  32.  
  33.  
  34.    /***************************************************************************
  35.      **************************        DIBUJAR        **************************
  36.      ***************************************************************************/
  37.  
  38.    private void dobleBuffer(Graphics2D g2)
  39.    {      
  40.        fondo.dibujar(g2, tracker);
  41.  
  42.        repaint();      
  43.    }
  44.  
  45.    public void paint (Graphics g)
  46.    {
  47.        Graphics2D g2 = (Graphics2D) g;
  48.  
  49.        Image mImagen = createImage(ANCHO, ALTO);
  50.        dobleBuffer((Graphics2D)mImagen.getGraphics());
  51.  
  52.        g2.drawImage(mImagen, 0, 20, this);
  53.  
  54.        try { Thread.sleep(100); } catch(Exception e) {}
  55.    }    
  56. }
  57.  

Fondo.java:
Código
  1. public class Fondo
  2. {
  3.    // Propiedades de las imágenes
  4.    private final String  rutaImagen = "imagenes/fondo.gif";
  5.    private BufferedImage imagen;
  6.  
  7.    public final int anchoImagen = 800;
  8.    public final int altoImagen  = 600;
  9.  
  10.  
  11.    /***************************************************************************
  12.      ***************************    CONSTRUCTORAS    ***************************
  13.      ***************************************************************************/
  14.  
  15.    public Fondo(MediaTracker tracker)
  16.    {
  17.        // Inicializamos el buffer sobre el que pintaremos
  18.        imagen = new BufferedImage (anchoImagen, altoImagen, BufferedImage.TYPE_INT_ARGB);
  19.  
  20.        // Dibujamos dentro del buffer el fondo
  21.        Graphics2D g = imagen.createGraphics();
  22.        Image aux = Toolkit.getDefaultToolkit().getImage(Main.class.getResource(rutaImagen));
  23.  
  24.  
  25.        // Añadimos las imagenes al MediaTracker
  26.        tracker.addImage(aux, 0);
  27.  
  28.        g.drawImage(aux, 0, 0, null);
  29.  
  30.        // Aquí intento que espere hasta que esté pintado pero sin éxito...        
  31.        try{tracker.waitForAll();}catch(Exception e){}
  32.    }
  33.  
  34.  
  35.    /***************************************************************************
  36.      ***************************       DIBUJAR       ***************************
  37.      ***************************************************************************/
  38.  
  39.    public void dibujar(Graphics2D g2, MediaTracker tracker)
  40.    {            
  41.        g2.drawImage(imagen, 0, 0, null);
  42.        //try{tracker.waitForAll();}catch(Exception e){} // ¿Es necesario?
  43.    }
  44.  
  45. }
  46.  


Como podéis ver el mecanismo de la clase fondo es simple, en la constructora dibuja el fondo (se supone que el objeto MediaTracker debería esperar a que lo hiciese...) y en el método dibujar simplemente dibuja el BufferedImage ya que hay otros métodos encargados de dibujar sobre el mismo figuras geométricas como decía al principio.

Ahora mis dos dudas:
1 - ¿Cómo puedo hacer que realmente el programa espere a que el fondo esté pintado?
2 - ¿Está bien inicializado el objeto MediaTracker? Ya que no entiendo muy bien la explicación de la constructora en la documentación:
http://java.sun.com/j2se/1.4.2/docs/api/java/awt/MediaTracker.html

1S4ludo y gracias ;)


En línea

~[uNd3rc0d3]~

Desconectado Desconectado

Mensajes: 188


programando...


Ver Perfil
Re: Problema con Mediatracker
« Respuesta #1 en: 26 Diciembre 2008, 02:52 am »

probaste en la constructora de la clase fondo esperar un tiempo exagerado con Thread.sleep

haber si el problema es el tiempo o es que se queda esperando algun suseso....


En línea


leete las reglas asi todos estamos mejor ;)
~~
Ex-Staff
*
Desconectado Desconectado

Mensajes: 2.981


Ver Perfil WWW
Re: Problema con Mediatracker
« Respuesta #2 en: 26 Diciembre 2008, 14:52 pm »

Si, pero ni aún poniendo un Thread.sleep(90000) se dibuja el fondo... Al final e conseguido resolver el problema de una forma que no me convence mucho pero bueno..

La idea era hacer un juego estilo worms, de tal manera que el suelo se fuese rompiendo a medida que se le disparase. Esto lo logro dibujando sobre un bufferedImage que contiene la imagen del suelo figuras geométricas, así que este es el método dibujar de la clase fondo:

Código
  1.    public void dibujar(Graphics2D g2)
  2.    {
  3.        // Dibujamos el escenario sin agujeros
  4.        Graphics2D gEscenario = buffEscenario.createGraphics();
  5.        Image aux = Toolkit.getDefaultToolkit().getImage(Main.class.getResource(rutaImagen));
  6.        gEscenario.drawImage(aux, 0, 0, null);
  7.  
  8.        // Dibujamos sobre el escenario los agujeros
  9.        gEscenario.drawImage(buffGeom, 0, 0, null);
  10.  
  11.        // Hacemos los agujeros transparentes
  12.        hacerColorTransparente(buffEscenario, Color.magenta);
  13.  
  14.        // Dibujamos el fondo y el escenario con los agujeros
  15.        g2.drawImage(buffFondo  , 0, 0, null);
  16.        g2.drawImage(buffEscenario, 0, 0, null);
  17.    }
  18.  

Está bastante menos optimizado que la otra idea, pero por lo menos funciona... a ver si alguien consigue saber por que lo otro no funciona...

Salu2
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines