Foros del Web » Programación para mayores de 30 ;) » Java »

Problema con imágenes

Estas en el tema de Problema con imágenes en el foro de Java en Foros del Web. Bueno, hace días que estoy con un problema relacionado con las imágenes. Estoy haciendo un "juego" de esos que van entre comillas, fui avanzando bastante, ...
  #1 (permalink)  
Antiguo 12/01/2013, 10:28
 
Fecha de Ingreso: agosto-2011
Ubicación: Montevideo
Mensajes: 44
Antigüedad: 12 años, 8 meses
Puntos: 5
Problema con imágenes

Bueno, hace días que estoy con un problema relacionado con las imágenes.

Estoy haciendo un "juego" de esos que van entre comillas, fui avanzando bastante, de hecho les dejo un video que subi a youtube de lo que avancé para que tengan una idea de lo que estoy hablando:

http://www.youtube.com/watch?v=gXRs0Go5EYY

El problema que se me está ocasionando, y como en algún momento del video se puede ver, es que estoy actualizando constantemente la pantalla unas cuantas veces por segundo. Y esto se debe a que tengo 3 capas de imágenes:

1) El fondo (el mapa) del juego, que es donde coloco los "tiles" (cuadraditos del mapa).

2) El personaje y su movimiento.

3) Objetos (tiles) que pasan por arriba del personaje.

Código:
	public void run() {

		condicionHiloPrincipal = true;

		while (condicionHiloPrincipal) {

			render();
			esperar(framesPerSecond);

		}
		System.exit(0);
	}

	public void render() {

		Graphics g;
		g = this.getGraphics();

		if (g != null) {
			dibujarMapa(g);
			dibujarPersonaje(g);
			dibujarObjetosArriba(g);
			g.dispose();
		}
	}
Constantemente actualizo el mapa en ese orden a través de un hilo de ejecución (un Thread). Pero yo no quiero que esto suceda, y ahí viene mi problema: Dependiendo de los recursos del jugador, la pantalla puede llegar a pestañear demasiado, y eso hace que se vea muy feo. Lo que se me ocurre es buscar la forma de poder por ejemplo solo la capa de fondo, sin tener que actualizar las capas superiores, y de hecho solo mover la capa de fondo (no borrarla y volver a dibujarla). Estuve investigando y llegué a creer que era posible gracias a los JPanel, pero he preguntado en foros, he investigado horas y horas y jamás logré hacerlo.

Si hay alguien que sepa bien como se podría solucionar mi problema le agradecería mucho, ya que esto me está atormentando hace días.

Saludos,
Federico.
  #2 (permalink)  
Antiguo 12/01/2013, 10:31
 
Fecha de Ingreso: agosto-2011
Ubicación: Montevideo
Mensajes: 44
Antigüedad: 12 años, 8 meses
Puntos: 5
Respuesta: Problema con imágenes

Acabo de intentar editar mi mensaje pero sin querer lo mandé en modo respuesta.
  #3 (permalink)  
Antiguo 12/01/2013, 17:33
 
Fecha de Ingreso: diciembre-2011
Mensajes: 152
Antigüedad: 12 años, 4 meses
Puntos: 34
Respuesta: Problema con imágenes

Investiga sobre el doble buffer.
  #4 (permalink)  
Antiguo 12/01/2013, 18:49
 
Fecha de Ingreso: agosto-2011
Ubicación: Montevideo
Mensajes: 44
Antigüedad: 12 años, 8 meses
Puntos: 5
Respuesta: Problema con imágenes

No se como darte las gracias, la verdad me funcionó impecablemente.
Sabía que me faltaba algún concepto, jamás imaginé en algo como eso: armar el mapa entero, capturarlo en una imagen y mostrarlo cuando está pronto. No solo no me lo imaginé, sino que además no sabía como hacerlo. Investigué y encontré.

Muchísimas gracias, ya hace más de una semana que estaba trancado y nadie sabía responder a mi duda.

Por si alguno que entra a este tema con la misma duda, esto fue lo que me ayudó (lo encontré en otro foro):

Cita:
La tecnica doble buffer nos permite hacer una animación libre de parpadeos, cuando llamas al método repaint() en un applet, este llama a update() el cual borra toda la pantalla y redibuja llamando al método paint(), esto lo hace directamente en la pantalla, por lo que se nota un feo parpadeo :-[

Para realizar el Doble Buffer, sobrescribimos el método update(), así relizaremos todo el pintado en una pantalla virtual asi no se visualizara hasta que nosotros volquemos esta pantalla virtual a la pantalla real.

Código:
      Image buffer;
      Graphics pantallaVirtual;
     
     
      //creamos una imagen
      buffer = createImage(Ancho, Alto);
     
      // creamos la pantalla virtual para el Doble Buffer
      pantallaVirtual = buffer.getGraphics();
Ahora todo lo que hagamos en la pantallaVirtual se verá reflejado en la imagen buffer, podemos pintar un círculo, rectangulo

o una imagen previamente cargada en la pantallaVirtual.

Código:
    public void paint(Graphics g) {        
            g.drawImage(fondo,0,0,this); // dibujamos el fondo
            g.setColor(new Color(240, 240, 255));        
    g.drawOval(10,10,200,200);    
       }
     
      public void update(Graphics g) {
           // dibujamos en la pantalla virtual, esto se hace en memoria
           // no se visualizara
           paint(pantallaVirtual);        
           // se vuelca la imagen "buffer" en la pantalla real
           g.drawImage(buffer, 0, 0,640,400, this);          
       }
Tema resuelto,
Saludos.

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:24.