Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Animación, clase y GUI para crearla

Iniciado por Hechelion, 16 de Febrero de 2009, 08:26:13 AM

« anterior - próximo »

superbalgas

#15
me surgio una duda con respecto al dibujo final q hace en el juego...

la pregunta seria... ¿es posible rotar por angulo una animación?... por q yo usaba el MapEx q viene un lugarcito para poner el angulo Y...

y como pase todo a esta clase para hacerlo mas pro.. xD!... me faltó ese detalle de rotación... ¿o tengo q hacer otra animacion las rotaciones?




Edit: le estuve metiendo mano a la clase haber si lo podia hacer xD!!... mas o menos lo hice así...

se lo llama asi a la animación...

CitarCall Piernas_Anim.Draw(287, 128, 0, Angulo) ' en angulo iria el valor en grados...


y en la cls...

modifique la linea
Citar
   Public Sub Draw(ByVal PosX As Long, ByVal Posy As Long, ByVal Z As Long, Optional ByVal Transparencia As Long = 0, Optional ByVal Zoom As Long = 1)

por

CitarPublic Sub Draw(ByVal PosX As Long, ByVal Posy As Long, ByVal Z As Long, Optional ByVal Angulo As Long = 1, Optional ByVal Transparencia As Long = 0, Optional ByVal Zoom As Long = 1)

lo q guardaria el valor en una variable "Angulo" dentro de la clase...

y en la parte donde genera la imagen

CitarCall 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,  0, dx_lib32.Blit_Alpha.Blendop_Color, Color, Mirror, dx_lib32.Blit_Filter.Filter_None, False)

lo cambié por

CitarCall 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, Angulo, dx_lib32.Blit_Alpha.Blendop_Color, Color, Mirror, dx_lib32.Blit_Filter.Filter_None, False)

q utiliza el valor angulo en la función...

ahora la cosa es así... la imagen rota con el origen en la parte superior izquierda... osea... no gira desde su eje... si no que "El eje Y lo tendria en la parte superior izquierda..."

eso es lo q tengo hasta ahora xD!!...




una solución seria... capturar el ancho y alto de la imagen, dividirlo por 2, y sumar o restar a las coordenadas para q se mantenga en el centro xD!!...





quiero mi 10!! xD



Hechelion

Felicitaciones por el cambio.

La verdad no sé muy bien como funciona la rotación del MapEx, tendrías que esperar que Ex3 contestara esa pregunta, respecto a la clase, en su momento pensé en agregarlo como opción, pero como no es algo muy común de utilizar al final opté por no incluirlo.


[EX3]

Una pista: DEVICE_SetDrawCenter()

El unico detalle a comentar que no lo deja claro quizas la documentacion en DRAW_MapEx() es que el parametro Center define el centro del sprite no solo como origen de dibujo si no como eje de rotacion, o lo que viene a ser lo mismo, en dx_lib32 el origen de dibujo de un sprite siempre es el eje de rotacion.

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

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

superbalgas

#18
ahhhhh pillin y yo haciendo cuentas para centrarlo... xD!!!!... voy a verlo cuando me cambie... toy recien bañado y en bata xD



EDIT:

bueno bueno xD! tonce la modificación de la clase quedaria así ...


Citar
Call Piernas_Anim.Draw(320, 240, 0, Angle, True)
Call Piernas_Anim.Draw(posición X, Posición Y, Z, Valor Angulo, Centrado "por defecto false")

los valores angulo y centrado son opcionales...




en la cls en la parte de

CitarPublic Sub Draw(ByVal PosX As Long, ByVal Posy As Long, ByVal Z As Long, Optional ByVal Transparencia As Long = 0, Optional ByVal Zoom As Long = 1)

lo cambié por

CitarPublic Sub Draw(ByVal PosX As Long, ByVal Posy As Long, ByVal Z As Long, Optional ByVal Angulo As Long = 0, Optional ByVal Center As Boolean = False, Optional ByVal Transparencia As Long = 0, Optional ByVal Zoom As Long = 1)

q tiene como valor perdeterminado Angulo en 0 y Center en False, de lo contrario cambiarlo en la llamada, "Son valores opcionales"




y en donde dibuja el sprite...

CitarCall 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, 0, dx_lib32.Blit_Alpha.Blendop_Color, Color, Mirror, dx_lib32.Blit_Filter.Filter_None, false)

se lo cambia por

CitarCall 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, Angulo, dx_lib32.Blit_Alpha.Blendop_Color, Color, Mirror, dx_lib32.Blit_Filter.Filter_None, Center)

q aplicaria los valores Center y Angulo






Hechelion

#19
Actualización de las clases de Animación (Tanto para VB6 como para NET)

Se agregó la propiedad Pause que permite pausar la animación, aún cuando se siga dibujando con Draw.
Se agregó el parámetro opcional de ángulo a la función DRAW, la cual permite rotar la animación

Se soluciono un problema con el GetRect que no estaba sincronizado con la animación.

PD:  Los link en el primer post.

superbalgas

Acabo de hacer una mejoria con respecto al Zoom + Centrar el eje como habia dicho antes xD, y quiero compartirlo ^^ xD

normalmente para dibujar el objeto animado, se usa esta funcion...

Draw(PosX As Long, PosY As Long, Z As Long, Optional Angulo As Single,  Optional Transparencia As Long, Optional Zoom As Long)

La funcion despues de la modificación quedaria así...

Por supuesto me manejo en VB .Net :P

Draw(ByVal PosX As Long, ByVal Posy As Long, ByVal Z As Long, Optional ByVal Angulo As Long = 0, Optional ByVal Center As Boolean = False, Optional ByVal Transparencia As Long = 0, Optional ByVal Zoom As Long = 1)

La manera en que se maneja el zoom, es poniendole 1 o superior para la ampliación, con la siguiente modificación se podra no solo agrandar si no tambien achicar la imagen ingresando un valor menor a 0. xD

mando la funcion completa, x q ni da explicar xD... si hay dudas preguntar xD

    Public Sub Draw(ByVal PosX As Long, ByVal Posy As Long, ByVal Z As Long, Optional ByVal Angulo As Long = 0, Optional ByVal Center As Boolean = False, Optional ByVal Transparencia As Long = 0, Optional ByVal Zoom As Long = 1)
        Dim indiceframe As Integer
        Dim indiceAnim As Integer
        Dim Color As Long

        indiceAnim = CtrlAnim.PasoAnim + Animaciones(CtrlAnim.AnimCurso).PasoInicio
        indiceframe = PasosAnim(indiceAnim).IDframe
        Color = p_gfx.ARGB_Set(255 - Transparencia, 255, 255, 255)

        Dim X_Zoom = Frames(indiceframe).info.Width
        Dim Y_Zoom = Frames(indiceframe).info.Height

        If Zoom > 0 Then
            X_Zoom = Int(Frames(indiceframe).info.Width * Zoom)
            Y_Zoom = Int(Frames(indiceframe).info.Height * Zoom)
        ElseIf Zoom < 0 Then
            X_Zoom = Int(Frames(indiceframe).info.Width / Math.Abs(Zoom))
            Y_Zoom = Int(Frames(indiceframe).info.Height / Math.Abs(Zoom))
        End If

        Call p_gfx.MAP_SetRegion(Frames(indiceframe).FrameSetImg, Frames(indiceframe).info)
        Call p_gfx.DRAW_MapEx(Frames(indiceframe).FrameSetImg, PosX + PasosAnim(indiceAnim).OffX, Posy + PasosAnim(indiceAnim).OffY, Z, X_Zoom, Y_Zoom, Angulo, dx_lib32.Blit_Alpha.Blendop_Color, Color, Mirror, dx_lib32.Blit_Filter.Filter_None, Center)

        CtrlAnim.DuracionPaso = CtrlAnim.DuracionPaso + 1
        If CtrlAnim.DuracionPaso > PasosAnim(indiceAnim).iStep Then
            CtrlAnim.DuracionPaso = 0
            CtrlAnim.PasoAnim = CtrlAnim.PasoAnim + 1
            If CtrlAnim.PasoAnim + Animaciones(CtrlAnim.AnimCurso).PasoInicio > Animaciones(CtrlAnim.AnimCurso).PasoFinal Then
                CtrlAnim.PasoAnim = 0
                If CtrlAnim.Repetir = False Then
                    pLastAnim = CtrlAnim.AnimCurso
                    CtrlAnim.AnimCurso = CtrlAnim.AnimDefecto
                End If
                RaiseEvent StopAnim()
            End If
        End If

    End Sub



Hechelion

Me parece genial la idea, pero veo un problema, si quieres un Zoom menor a cero, debes seguir multiplicando, o sea, no necesitas tocas nada, porque si divides por un valor menor a 0, el resultado aumenta, no disminuye.

Me explico mejor con un ejemplo.
Tienes una imagen de 32*32.
Si le aplicas zoom * 2 te queda
32 * 2 = 64

Hasta ahí todo bien, pero que pasa si quieres disminuir a la mitad y aplicas un zoom de 0.5
32 * 0.5 = 16  (Al multiplicar un entero por una fracción menor a cero, el resultado es menor)

32 / 0.5 = 64 (Al dividir por un número menor a 0, el resultado no es menor, sino que aumenta)

Si para achicar quieres usar el mismo zoom pero con valores entre 0 y 1, entonces la función debe siempre estar multiplicando.


superbalgas

#22
si, intenté meter con 0.5 pero no me funcionó.... (Cosa  de brujas xD)

y we...  hice rapidito esa modificación que funciona de < ó > a 0 xD

osea... si metes -2 va a disminuir la mitad de su tamaño... si pones 2, agranda el doble de su dimensió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.