Enviar respuesta 
 
Calificación:
  • 0 votos - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Zoom in, Zoom out
joseangelmr Sin conexión
programador aficionado
**

Mensajes: 24
Registro en: Apr 2012
Reputación: 0
Mensaje: #1
Brick Zoom in, Zoom out
Profe algun post, tuto o algo que me puedad ayudar con la implementacion del zoom en nuestro juego... o por donde se puede ir empezando Huh .... Gracias de antemano

"No te preocupes si no funciona bien. Si todo lo hiciera, no tendrías trabajo"Cool
26-06-2012 04:16 PM
Encuentra todos sus mensajes Cita este mensaje en tu respuesta
demian Sin conexión
Administrator
*******

Mensajes: 1.808
Registro en: Jun 2010
Reputación: 0
Mensaje: #2
RE: Zoom in, Zoom out
La implementación del zoom en general no es difícil (como todo, si se sabe como hacerlo Wink ). Te sugiero que leas un poco sobre transformaciones afines en Java (en 2D). Allí hay dos clases importantes:

AffineTransform y Graphics / Graphics2D

Generalmente el zoom se define con un número. Si el número es menor que 1 entonces vas a ver los dibujos más pequeños que el tamaño normal. Si es mayor que 1 los vas a ver más grandes. Si el zoom es 1 entonces los vas a ver del tamaño normal. Para hacer zoom in uno multiplica el zoom actual por un factor. Para hacer zoom out uno divide por un factor.

El zoom tiene dos aspectos: (1) El dibujo de los gráficos con la escala correspondiente al zoom y (2) El manejo de la entrada del ratón.

El punto (1) se resuelve usando una transformación afín (la clase AffineTransform en Java). El truco es muy simple: Siempre dibujas a escala natural (no te pongas a hacer cálculos y multiplicaciones dentro de tu código de dibujo para "simular" el zoom, lo que sucede es que antes de dibujar, defines un AffineTransform usando el número que define el zoom como escala, y se lo asocias al Graphics2D con el que vas a dibujar. De esta forma el Graphics2D automáticamente dibuja más pequeño o más grande, dependiendo de lo que le pasaras al AffineTransform.

El problema suele ser (2), es decir cuando manejas los eventos del ratón. Por ejemplo cuando haces click en algún lugar de la pantalla, si tienes un zoom distinto de 1, entonces las coordenadas de la pantalla sobre las que haces click (Las que vienen en el MouseEvent asociado en el listener) no concuerdan necesariamente con lo que se está dibujando en dicha posición (si lo piensas tiene sentido).

La solución allí es que uses una simple transformación de escala (generalmente dividir o multiplicar las coordenadas por un factor) y transformes manualmente las coordenadas x e y que vienen en el MouseEvent. Eso generalmente es multiplicar cada coordenada por el zoom (o dividirlo, de memoria no estoy seguro, pero es fácil de deducir).

Ahora que lo pienso también se puede hacer usando un AffineTransform, de hecho creo que alguna vez lo hice así, pero no recuerdo exactamente como. En cualquier caso el principio es el mismo del párrafo anterior, sólo que con el AffineTransform es ésta clase la que te hace la multiplicación, mientras que de la otra forma lo haces tu directamente.

No encontré un tutorial concreto, pero si buscas en google "AffineTransform Java" o "AffineTransform Zoom Java" y cosas similares vas a conseguir mucho. Por ejemplo, yo conseguí algunos que parecen interesantes (pero tampoco es que los he revisado a detalle):

http://www.javalobby.org/java/forums/t19387.html

Te aconsejo que antes de lanzarte a hacer el zoom pruebes la clase AffineTransform en un JPanel que dibuje algo simple, de modo que te familiarizas con el asunto de las transformaciones afines.

Saludos,

[Imagen: dmi-1.jpg]
26-06-2012 05:13 PM
Visita su sitio web Encuentra todos sus mensajes Cita este mensaje en tu respuesta
Enviar respuesta 


Salto de foro:


Usuario(s) navegando en este tema: 1 invitado(s)