Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Duda sobre rotar imagen

Iniciado por Hechelion, 19 de Noviembre de 2010, 11:27:56 AM

« anterior - próximo »

Hechelion

Buenas Ex3.

Cuando se rota una imagen con MapEx, ¿hay alguna forma de indicar el punto de pivote de la imagen a rotar?

Tengo que la impresión que la imagen se rota desde la esquina superior izquierda y eso causa que la imagen no concuerde con su valor lógico, la solución más simple que se me ocurre es indicarle que rote desde el centro de la imagen (que vendría a ser el centro de mi proyectil), así la imagen y la coordenada lógica que uso para comprobar el impacto se mantendrían siempre en el mismo lugar.

[EX3]

#1
Estas de suerte :)

DEVICE_SetDrawCenter(). La tienes que llamar siempre antes de llamar a MAP_DrawEx() para aplicar el cambio del punto de rotación.

Cita de: Hechelion en 19 de Noviembre de 2010, 11:27:56 AM
Tengo que la impresión que la imagen se rota desde la esquina superior izquierda y eso causa que la imagen no concuerde con su valor lógico
Por defecto, y salvo que le indiques que centre el sprite en el ultimo parámetro de MAP_DrawEx(), el centro de rotación siempre es la coordenada 0,0 del sprite.

Salu2...

P.D.: Y si, no me preguntes por que ubique esa función en el grupo de funciones DEVICE_ y no en MAP_ o DRAW_ que hubiera sido lo logico :P
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

Hechelion

Te adelantaste a mi siguiente pregunta  :P

Lo acabo de probar y no me funcionó, tal vez se deba a que lo uso junto con un SetRegion, igual se me ocurrió otra solución que si está funcionando y es meter el valor del angulo en el Center del  DRAW_MapEx, eso hace que se centre solo para aquellos dibujos que tienen un ángulo.

[EX3]

Que no te funciono DEVICE_SetDrawCenter()? Si lo he estado usando en mi ultima version del TLSA Engine con el sprite del marine compuesto por piezas (cabeza, brazos, torso y piernas), con sus respectivas llamadas a MAP_SetRegion() y me iba de maravilla, varios del foro lo vieron funcionar en un par de ocasiones :(

Que coordenadas estas pasando a la función? Recuerda que son coordenadas de la textura, no de la escena. Ponme un ejemplo de lo que estas haciendo, es que es muy extraño que no te funcione ???

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

Hechelion



        Call p_gfx.MAP_SetRegion(Frames(indiceframe).FrameSetImg, Frames(indiceframe).info)
        Call p_gfx.DEVICE_SetDrawCenter(50, 50)
        Call p_gfx.DRAW_MapEx(Frames(indiceframe).FrameSetImg, PosX + PasosAnim(indiceAnim).OffX, Posy + PasosAnim(indiceAnim).OffY, Z, Frames(indiceframe).info.Width * Zoom, Frames(indiceframe).info.Height * Zoom, Angle, dx_lib32.Blit_Alpha.Blendop_Color, Color, Mirror, dx_lib32.Blit_Filter.Filter_None, False)


Esas son las 3 líneas principales encargadas de dibujar lo que quiero, para efectos de pruebas coloque valores fijos al SetDrawCenter, las animaciones de proyectiles (Por lo menos de momento) están todas basadas en cuadros de 100*100 y la imagen original es de 1024*1024.

Sobre la estructura Frames no te hagas problema, eso está bien y es parte de la clase de animación que está publicada y todos esos cálculos funcionan bien, el único dato que se me ocurre relevante es el Mirror, el cual uso para espejar de forma horizontal las animaciones cuando van a la izquierda, eso si, o uso el mirror o uso el angulo pero no los dos valores al mismo tiempo.

[EX3]

Cita de: Hechelion en 19 de Noviembre de 2010, 07:18:48 PM
el único dato que se me ocurre relevante es el Mirror, el cual uso para espejar de forma horizontal las animaciones cuando van a la izquierda
Vale. Un detalle importante. Los espejados afectan tambien al eje de rotacion, esto es, tu coordenada 50x 50y de tu frame 100x100 no debería inmutarse ya que es el centro de la seleccion, pero si la coordenada fuera 25x 50y y le aplicas un espejado horizontal la coordenada se transforma a 75x 50y. Esto no es un bug si no intencionado, a mi al menos me interesaba que se "espejara" tambien el eje de rotación al aplicar espejados.

Lo que si me he dado cuenta haciendo la prueba ahora es que si no hago una llamada a MAP_SetRegion() la funcion DEVICE_SetDrawCenter(() hace que DRAW_MapEx() no dibuje el sprite, esto si es un bug (de la funcion DRAW_MapEx() concretamente) y no me lo he encontrado en mi motor dado que mi clase sprite siempre hace hace una llamada a MAP_SetRegion() a la hora de dibujar aunque se tenga que dibujar la textura entera ???

Si quieres te paso la prueba en VB 6.0 (lo hubiera hecho en VB.NET pero ahora mismo solo tengo C# instalado) y le echas un vistazo al resultado.

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

Hechelion

#6
Lo del espejado me imaginaba que era así, pero ahí no hay problema porque o uso espejado o uso rotación pero no los estoy mezclando.  Los proyectiles deben usar rotación porque describen trayectorias parabólicas (producto de la gravedad) , vienen a ser el único objeto que debo rotar (salvo que a mitad de proyecto me de cuenta que debo rotar otra cosa  ^_^')

No hay problema que sea en VB6. Igual el problema que comentas es raro, yo no me haría mucho problema con eso la verdad, yo estoy implementando el sistema de angulo dentro de mi clase de animación la cual también siempre llama a SetRegion.

Mira te coloco algunos ejemplos de lo que me pasa :
(El punto Rojo es el centro del objeto proyectil y es el punto lógico que uso para las colisiones)


Como vez, independiente del valor que coloque, no parece afectar la rotación.







Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.