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 »

Hechelion

Clase para control de animaciones a partir de archivo AAD (archivo de animación DXlib32)

EVENTOS
StopAnim -> se activa al momento de terminar una secuencia de animación que no sea infinita

Propiedades
AnimName -> recupera el nombre de la animación en curso

AnimIndex -> recupera el indice de la animación en curso

Mirror As Blit_Mirror -> determina si la animación se dibujara con algún tipo de espejo.

LastAnimName -> recupera el nombre de la última animación ejecutada antes de la actual

LastAnimIndex -> recupera el indice de la última animación ejecutada antes de la actual

AnimForFault -> determina cual animación se utilizara por defecto. (está animación se dispara por defecto al terminar cualquier otra animación).

Pause -> Pausa/ Recuepra la ejecución del ciclo de avance de animación. (Se puede usar para evitar que la animación avance pero sin dejar de dibujar)

Procedimientos
Init(nGFX As dx_GFX_Class, nSystem As dx_System_Class, Optional RutaAAD As String)
-> se utiliza para iniciar el objeto entregnado las referencias a las clases de la libreria DxLib32
RutaAAD-> opcional entregar la cadena o la ruta al arhcivo AAD que contiene la información de la animación

Terminate-> se utiliza para terminar el objeto y descargar todos los elementos gráficos cargados en memoria

Draw(PosX As Long, PosY As Long, Z As Long, Optional Angulo As Single,  Optional Transparencia As Long, Optional Zoom As Long)
-> se utiliza para dibujar el objeto
PosX -> coordenada del eje X donde desea dibujar la animación
PosY -> coordenada del eje Y donde desea dibujar la animación
Z -> igual que el Z de Map_Draw
Angulo -> Permite rotar la animación, igual que Map_Draw.
Transparencia -> valor de 0 a 100 que determina si la imagen debe llevar transparencia
Zoom -> permite aumentar el tamaño de la imagen. (no probado)

LoadADD(ruta As String, SinImagen as Boolean)
-> se utiliza para cargar la cadena AAD o la ruta al archivo AAD que contiene la información de la animación. cuando se carga una cadena AAD la clase se encarga de cargar los recursos gráficos necesarios
Si SinImagen es verdadero, la clase omite la carga de los archivos gráficos, siendo necesario agregarlos a mano

Play(NameAnim As String, Optional Repeat As Boolean)
-> se utiliza para indicar que se ejecute una animación
NameAnim -> indica el nombre o el indice de la animación a reproducir
Repeat -> determina si la animación se repite de forma infinita o no

GetAnimName(Index As Integer) as String
-> obtiene el nombre de una animación a partir de su valor indice

GetAnimIndex(Name As String) As Integer
-> obtiene el indice de una animación a partir de su nombre

GetRect(Index As Integer) As GFX_Rect
-> retorna la información del los rectangulos para colisiones.

Clone() As ClsAnim
-> se utiliza para clonar el objeto sin recargar los recursos gráficos

Z0 a Z5 -> NO UTILIZAR, son funciones reservadas para la clonación

NOTAS
utilice la función clone para crear copias individuales de las referencias a la clase sin recargar los recursos gráficos. Los objetos creados mediante CLONE no deben ser terminados, ya que la función terminate de la clase descarga los recursos gráficos.

Los Datos AAD se pueden pasar como un unico STRING o como una ruta a un fichero AAD, la ventaja de que se puede pasar el contenido del fichero AAD como un String es que permite cargar el archivo a una variable String, procesarlo y luego entregarlo a la clase.

Descargar:

Descarga Editor Animación Binario

Descarga Editor Animación Código Fuente (sólo VB6)

Descarga Clase con ejemplo vb6

Descarga Clase con ejemplo vb .NET

Hechelion

#1
Una pequeña GUI para crear archivo AAD que son los que utiliza la clase:
El programa es bastante fácil de utilizar y la mejor manera de mostrar su potencial es con un ejemplo, para lo cual vamos a crear una animación de un ovni (un fichero PNG de 512*512 pixel)



Cagar la imagen
lo primero es abrir la aplicación y cargar el archivo (o los archivos) con las imágenes de las cuales queremos crear las animaciones. (noten que la clase y el archivo AAD soportan más de una imagen para una misma animación)



al lado de texto de ruta hay un pequeño botón con "...", ese botón nos permite buscar la imagen PNG que deseamos agregar.

luego de agregar la imagen, le debemos dar un nombre para identificarla en nuestro proyecto, en mi caso la nombré "ovni" y además le diré que me divida la imagen en frames de 100*100 pixel (las propiedades ancho y alto). con estos parámetros el programa automáticamente calcula cuantos frames vamos a encontrar en la imagen.

Ahora presionan "Agregar" y listo, la imagen ha sido agrega como un frameset, repitiendo este proceso pueden agregar todas las imágenes que deseen, en mi caso, sólo es una.
NOTA: los nombre no pueden llevar el signo under "_" ni ser sólo la letra "s".

agregar frames personalizados
2.) si descargan la imagen, notaran que algunas  zonas con explosión son más grandes que los 100*100 pixel que fije para el resto de los frames


este pequeño no es problema para nuestra clase, ya que si vamos al menú "Frames" (el botón frame en la parte superior"  ) verán un menú al lado izquierdo que nos permite personalizar los frames.


básicamente la librería crea dos tipos de frames, los normales creados a partir de los valores ancho y alto que definimos al cargar la imagen y que en este menú aparecen separados por líneas rojas, cada frame recibe el nombre de la imagen más su valor de fila y su valor de columna (los número que salen en Azul).  Y los Frames personalizados.
Para crear un frame personalizado, simplemente le damos un nombre y con el mouse marcamos la zona que deseamos abarcar. Si se dan cuenta, en el ejemplo nombre a los frames especiales como e1,e2 y e3, el programa de forma automática les agrega el prefijo "S_" para reconocerlos como frames personalizados. Además podrán aprecias un cuadrado verde en la parte inferior de la última imagen, ese cuadrado verde es la zona que deseo llamar "e3".

crear animaciones
una vez hemos creado nuestros frames personalizados es hora de crear las animaciones
para ello simplemente nos pasamos a la tercera pantalla con el botón "animación" (parte superior)

el menú izquierdo tiene 3 opciones, "controles", "animaciones" y "animación"
la opción "animaciones" nos permite crear las animaciones, en este ejemplo vamos a crear 4, "vuelo" para cuando la nave este sin hacer nada, "izq" para cuando giremos a la izquierda, "der" para virar a la derecha y "explot" para cuando la nave se destruida. Una vez tenemos creadas las animaciones debemos marcar con cual deseamos trabajar y luego de eso vamos a la opción "animación" este submenú es el que nos permite enlazar los frames con la animación.


el control animación se compone de dos ascensores que nos permiten seleccionar los frames que queremos añadir a nuestra animación, debajo de estos se encuentra los offset para la imagen y el control de repetición (cuantas veces queremos que se repita este frame antes de pasar al siguiente paso de la animación), en mi caso voy a colocar 15 repeticiones ya que voy a atrabajar con 60 FPS y quiero que el ciclo de animación dure 1 segundo, así que repetire cada imagen 15 veces (4 imágenes repetidas 15 veces = 60 FPS).



Al intentar agregar la segunda imagen que compone mi animación, me he topado conque el dibujo del ovni no concuerda con la imagen anterior, así que para hacerlos calzar y que no se produzca un efecto de que la nave tiembla podemos modificar los valor de OffX y OffY, tal como muestra la siguiente imagen.



Agregando Frame Personalizados
si en vez de utilizar un frame normal, quieren usar uno de los frame que crearon, tienen la lista completa de esos frames en el segundo ascensor (FRAMES EXTRAS),  se trabajan exactamente igual que los anteriores




Colisiones

un pequeño agregado que tiene la clase, es la capacidad de agregar 2 rectángulos a cada paso de animación, esos rectángulos se pueden utilizar para crear rutinas de colisión, de esa forma se puede adaptar la colisión de un objeto a cada paso de su animación, los rectángulos se denominan Rect1 y Rect2
para agregar el REct1 (color Azul) con SHIFT izquierdo use el mouse para demarcar el área que desea asignarle al primer rectángulo.
para agregar el REct2 (color Rojo) con CTRL izquierdo use el mouse para demarcar el área que desea asignarle al primer rectángulo.



Para finalizar, le damos al botón guardar y escogemos un nombre para el archivo, el programa nos creara el archivo .AAD que es el que utiliza la clase de animación



Espero que está pequeña reseña sea de utilidad por si desean utilizar la clase de animación.

PD: estoy terminando esto a altas horas de la madrugada, mañana en la noche, de vuelta del trabajo le daré una releída y lo ordenare por si ha quedado muy desordenado y subo los archivos.



[EX3]

Pedazo de curro, tio :D Tengo ganas de verlo en marcha ;)

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

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

tewe76

Tewe
www.TAPAZAPA.com : Funny and easy to play games for all ages! - Fairy Match - Brain Crash
www.LaRebelionDelBiberon.com : Experiencias de unos padres primerizos

Hechelion

#4
Para descargar la clase y el programa que permite crear archivos AAD os dejo el siguiente Link
http://www.filefactory.com/file/af258ch/n/GUI_aad_rar

el proyecto "proyecto1" es la aplicación GUI para crear archivos AAD
el proyecto "Prueba_ClaseAnim.vbp" es un pequeño programa que utiliza la clase de animación en un ejemplo donde movemos 2 ovnis por la pantalla

el proyecto permite apreciar como se utiliza la clase de animación y como es posible clonar un recurso cargado, evitando la doble carga de los recursos gráficos.

PD: de momento ambas herramientas las considero como BETA,  así que agradecería cualquier comentario o que informaran de posibles errores.

Código (vb) [Seleccionar]

Option Explicit

'Clases de la libreria dx_lib32.DLL
Dim m_gfx As dx_GFX_Class 'Referencia a la clase dx_GFX:
Dim m_Input As dx_Input_Class 'Referencia a la clase dx_Input.
Dim m_System As dx_System_Class

Dim MainLoop As Boolean

Dim WithEvents Ovni1 As ClsAnim
Dim WithEvents Ovni2 As ClsAnim
Dim Hit As GameInputHitEventClass

'Recursos
Dim Impact As Long

Dim PosX As Long
Dim PosY As Long
Dim AuxExplocion As Boolean


Private Sub Form_Load()

'Crear las instancias
Set m_gfx = New dx_GFX_Class 'Creamos la instancia de la clase dx_GFX:
Set m_Input = New dx_Input_Class 'Creamos la referencia a la clase dx_Input.
Set m_System = New dx_System_Class 'Creamos la instancia a la clase dx_system

Set Ovni1 = New ClsAnim
Set Ovni2 = New ClsAnim
Set Hit = New GameInputHitEventClass

Me.Show

'inicializar las clases
Call m_gfx.Init(Me.hWnd, 1024, 768, , True)
Call m_Input.Init(Me.hWnd) 'Inicializamos la clase dx_Input.
Call Ovni1.Init(m_gfx, m_System, App.Path & "\ovni.aad")
Call Hit.Initialize(m_Input)
Set Ovni2 = Ovni1.Clone 'clonamos el objeto ovni1 que cargo el archivo AAD


'Call m_Sound.Init(Me.hWnd) 'Inicializamos la clase dx_Sound.
Impact = m_gfx.FONT_LoadSystemFont("Lucida Console", 12, False, False, False, False)
MainLoop = True
PosX = 100
PosY = 100

Do While MainLoop
   
    If Hit.Key_Hit(Key_Escape) Then MainLoop = False  'salir del programa con scape
   
    'Control de poscisión y de animaciones
    If m_Input.key(Key_Up) And AuxExplocion = False Then
        PosY = PosY - 2
        If Ovni1.AnimName <> "vuelo" Then Call Ovni1.Play("vuelo", False)
        If Ovni2.AnimName <> "vuelo" Then Call Ovni2.Play("vuelo", False)
    End If
    If m_Input.key(Key_Down) And AuxExplocion = False Then
        PosY = PosY + 2
        If Ovni1.AnimName <> "vuelo" Then Call Ovni1.Play(0, False)
        If Ovni2.AnimName <> "vuelo" Then Call Ovni2.Play("vuelo", False)
    End If
    If m_Input.key(Key_Right) And AuxExplocion = False Then
        PosX = PosX + 2
        If Ovni1.AnimName <> "der" Then Call Ovni1.Play("der", True)
        If Ovni2.AnimName <> "izq" Then Call Ovni2.Play("izq", True)
    End If
    If m_Input.key(Key_Left) And AuxExplocion = False Then
        PosX = PosX - 2
        If Ovni1.AnimName <> "izq" Then Call Ovni1.Play("izq", True)
        If Ovni2.AnimName <> "der" Then Call Ovni2.Play("der", True)
    End If
    If Not (m_Input.key(Key_Left)) And Not (m_Input.key(Key_Right)) And AuxExplocion = False Then
        If Ovni1.AnimName <> "vuelo" Then Call Ovni1.Play("vuelo", False)
        If Ovni2.AnimName <> "vuelo" Then Call Ovni2.Play("vuelo", False)
    End If
    If Hit.Key_Hit(Key_Space) Then
        AuxExplocion = True
        Call Ovni1.Play("exp", False)
    End If
   
    Call m_gfx.DRAW_Text(Impact, CStr(m_gfx.FPS), 0, 0, 5, &HFF00FF00, Align_Left)
    Call m_gfx.DRAW_Box(0, 0, 1024, 768, 8, &HFF000000, True, &HFF000000)
   
    Call Ovni1.Draw(PosX, PosY, 0)
    Call Ovni2.Draw(1024 - PosX, 768 - PosY, 0)
   
    Call m_gfx.Frame(0, 60, True) 'limitar el programa a 60 FPS
    Hit.Update
Loop

'Liberar recursos
Call m_gfx.FONT_UnloadSystemFont(Impact)

'Finalizar clases Iniciadas de la libreria
Call Ovni1.Terminate


Call m_gfx.Terminate 'Terminamos la ejecucion de la clase:
Call m_Input.Terminate 'Terminamos la ejecucion de la clase:
'Call m_Sound.Terminate 'Terminamos la ejecucion de la clase:




'Destrucción de clases
Set Ovni1 = Nothing
Set Ovni2 = Nothing
Set Hit = Nothing
Set m_Input = Nothing 'Destruimos la instancia de la clase:
Set m_gfx = Nothing 'Destruimos la instancia de la clase:
'Set m_Sound = Nothing 'Destruimos la instancia de la clase:


Unload Me

End Sub

Private Sub Ovni1_StopAnim()

If Ovni1.LastAnimName = "exp" Then AuxExplocion = False

End Sub



Hechelion

#6
Me alegra que les guste. Espero que estas herramientas sean de utilidad para la gente que se anima con esta librería.

Aprovecho para mencionar un pequeño error en el programa de ejemplo, las líneas:
Código (vb) [Seleccionar]

    If Not (m_Input.key(Key_Left)) And Not (m_Input.key(Key_Right)) And AuxExplocion = False Then
       Call Ovni1.Play("vuelo", False)
       Call Ovni2.Play("vuelo", False)
    End If


se deben cambiar a:
Código (vb) [Seleccionar]

    If Not (m_Input.key(Key_Left)) And Not (m_Input.key(Key_Right)) And AuxExplocion = False Then
        If Ovni1.AnimName <> "vuelo" Then Call Ovni1.Play("vuelo", False)
        If Ovni2.AnimName <> "vuelo" Then Call Ovni2.Play("vuelo", False)
    End If


el motivo es que la instrucción original, llama a la función play en cada ciclo del programa,  cuando se hace una llamada a play, está interrumpe la animación actual y comienza la ejecución desde 0 de la animación que se pasa con el procedimiento play. Si agregamos el  "If Ovni1.AnimName <> "vuelo" Then" nos aseguramos que sólo se llame a play una vez y así la animación puede correr sin problemas.

Mis disculpas por este tipo de errores, pero como comentaba, estos días se me ha notado demasiado el cansancio.

[EX3]

Cita de: Hechelion en 19 de Febrero de 2009, 12:44:42 AM
Mis disculpas por este tipo de errores, pero como comentaba, estos días se me ha notado demasiado el cansancio.
De disculpas nada, hombre, buen trabajo :) Ahora falta por mi parte darle bombo a estas colaboraciones en la pagina del proyecto para que esten mas a la vista de los nuevos visitantes.

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

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

Hechelion

#8
He subido una versión actualizada que resuelve algunos Bug y de paso he cambiado el servidor, ya que al parecer el archivo fue borrado del enlace anterior.
http://www.deitec.cl/descargas/dxlib32/

superbalgas

muchas gracias... estaba pensando hacer un for de varias imagenes xD!...
buen trabajo...

--

una pregunta, la cls es compatible con vb2005? gracias...

Hechelion

La clase es compatible con VB6 y en estos momentos estoy migrando todas las clases que he creado a .net (2008 para ser preciso y espero subirlo este fin de semana) pero por la forma de programación que le di no creo que tengas problemas con 2005.

El editor está programado con VB6 y no tengo pensado migrarlo a .net, pero se encuentra en .exe para su descarga y cualquier problema que  puedas tener me avisas y lo resolveré, aún así los archivos que genera el editor son archivos de texto plano y bastante intuitivos por lo cual se pueden editar a mano en caso de necesidad.

Hechelion

#11
He terminado la migración a VB net de la librería:

Editor de animaciones
Binario
File size:     172032 bytes
Filetype:    PE32 executable for MS Windows (GUI) Intel 80386 32-bit
MD5:    95716d233601482c8e6a4f99102d172b
SHA1:    4532aab4ce2a2b1a83359008fd559b741b1d467f


Descarga Editor Animación Binario

Descarga Editor Animación Código Fuente (sólo VB6)

Descarga Clase con ejemplo vb6

Descarga Clase con ejemplo vb .NET

superbalgas

#12
gracias...

emmm... una sugerencia??... ponete este fondo, por q con el q tenes no se distinge bien las imagenes q pones en el programa xD!!...

---

me puse este y veo muy bien xD... "es del photoshop xd"

http://www.superbalgas.com.ar/ImgPersonal/fondo.png

pongo el link sin los tag de "img" para q no se les descargue la imagen al q no quiere, y para el q quiera verla ingrese al link...

culd

Antes de ayer entre al foro por primera vez para ver que ejemplos y tutoriales habia para esta libreria y encontre este post, baje el fuente y lo probe (no esta actualizacion que hiciste hoy, sino la anterior que solo estaba en vb6.0) y si se cambiaba el foco del form, es decir perdia el foco el dx al volver el foco se trababa mucho mi maquina, mucho mucho constantemente, no revise el codigo para encontrar el problema por que cuando probe las dos veces tuve que reiniciar y la verdad que no lo quise ni revisar... (ojo tengo una phenom 2 x4 810 con 4gb de ram, asi que no es problema de mi maquina, algun bucle mal puesto habra sido la causa).

Ahora asi revisando vi que subiste una actualizacion mas precisamente para .net y me volvio las ganas de probar...

Bueno, descartando la introduccion vamos a los problemas...

En el ejemplo ClsAnim ya sea de 6.0 ó .net no funciona el evento input, o por lo menos aca en esta maquina no lo detecta a ningun evento. Es decir no se mueve el ovni, ni sale con SPACE.
Ahora lo reviso para ver que sera

Pero en fin, me gustaria agregarte al MSN asi hablamos un poco al respecto, ya que quiero iniciar un juego para probar la libreria y veo que ya tenes cancha con ella. Si podes mandame por privado tu msn

Hechelion

#14
Superbalgas se agradece, ya cambie el fondo y subí una nueva revisión, la 1.1.2 del programa (la cual corrige un problema que se producía al agregar imágenes desde distintos path y un par de detalles), también actualicé el post que incluye el MD5 y la revisión de virus.



Culd, realmente extraño lo que comentas, acabo de probar el programa, más el ejemplo en VB6, más el ejemplo en VB net, escuchando música y viendo vídeos en youtube, todo en paralelo y no tuve ningún problema.

Mi máquina es un intel dore 2 de 6300+ con 3 Gb de RAM, el OS fue WinXP SP3.
Igual tengo que instalar Win7 estos días, así que voy a repetir las pruebas con dicho OS.

Que no te reconozca el teclado, me suena al típico problema con el evento HIT de la librería (ese evento utiliza un timer interno el cual no está sincronizado con la parte gráfica y eso causa que dependiendo de la velocidad de la máquina está deje de reconocer las teclas), por lo mismo estoy usando el evento Key en todos los ejemplos actuales, no sabría decirte si en la versión que bajaste usaba los HIT o los KEY, si puedes baja los últimos ejemplos y nos comentas.
Por cierto, "Esc" es para salir y "Space" es para ver la cutre animación de explosión.

Mi MSN es hechelion(a)hotmail.es






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.