Anuncios Google

AnimLib

AplicacionesLUA Playersrces

v4.8

Bueno, hoy quiero compartir esta lib que acabo de hacer :D
Se trata de la AnimLib!, una librería para cargar y mostrar animaciones de una manera muy sencilla en LuaDEV.
Bien, esta lib tiene algunas funciones interesantes, para crear, liberar, blitear, rotar, efectos de tintado, transparentado, y funciones de comenzar/resumir y pausa.
Y ahora con carga para GIFS animados.

Autor: Chimecho.

Características:

  • No hay límites más que el que la RAM imponga.
  • Tiene bastantes funciones.
  • Está diseñada para funcionar en LuaDEV.




Uso:

Para cargar un objeto de animación se usará una de estas funciones:

anim.create(ruta)
--
-- Descripción:
--     Crea y devuelve un objeto de animación a partir de un GIF animado, se extraen los frames y la duración de cada uno... al ser un objeto de animlib, se pueden usar sobre este objeto todas las funciones de la librería.
--
-- Parámetros:
--     ruta: String con la ruta del GIF animado.
 
 
anim.create(imgs, tiempo)
--
-- Descripción:
--     Crea y devuelve un objeto de animación a partir de los frames imgs, las entradas de esta tabla, deberán ser numéricas y su contenido, puede ser una ruta con una imagen a cargar o una imagen previamente cargada.
--
-- Parámetros:
--     imgs: Tabla con rutas o imágenes, o entrelazados (es decir que pueden ser strings e imágenes).
--     tiempo: Un número con el tiempo en milisegundos que durará cada frame.
 
 
anim.create(imgs, tiempos)
--
-- Descripción:
--     Crea y devuelve un objeto de animación a partir de los frames imgs, las entradas de esta tabla, deberán ser numéricas y su contenido, puede ser una ruta con una imagen a cargar o una imagen previamente cargada. Cada cuadro de la animación, tendrá su propio tiempo de duración, que será una entrada de la tabla tiempos.
--
-- Parámetros:
--     imgs: Tabla con rutas o imágenes, o entrelazados (es decir que pueden ser strings e imágenes).
--     tiempos: Tabla con la duración de cada frame en milisegundos (se espera que la longitud de esta tabla, sea la misma que la de imgs).
 
 
anim.create(spritesheet, ancho, alto, tiempo)
--
-- Descripción:
--     Crea y devuelve un objeto de animación a partir de una hoja de sprites, los cuadros, se obtendrán de la imagen spritesheet (debe ser previamente cargada con image.load), y serán dividos de izquierda a derecha y de arriba hacia abajo. Los cuadros se dividen en partes iguales según el ancho y alto especificado.
--
-- Parámetros:
--     spritesheet: Una imagen con todos los frames en ella.
--     ancho: Un número con el ancho de cada frame recortado.
--     alto: Un número con el alto de cada frame recortado.
--     tiempo: Un número con el tiempo en milisegundos que durará cada frame.
 
 
 
anim.create(spritesheet, ancho, alto, tiempos)
--
-- Descripción:
--     Crea y devuelve un objeto de animación a partir de una hoja de sprites, los cuadros, se obtendrán de la imagen spritesheet (debe ser previamente cargada con image.load), y serán dividos de izquierda a derecha y de arriba hacia abajo. Los cuadros se dividen en partes iguales según el ancho y alto especificado.
--
-- Parámetros:
--     spritesheet: Una imagen con todos los frames en ella.
--     ancho: Un número con el ancho de cada frame recortado.
--     alto: Un número con el alto de cada frame recortado.
--     tiempos: Tabla con la duración de cada frame en milisegundos (se espera que la longitud de esta tabla, sea la misma que la de imgs).
 
 
anim.create(ruta, ancho, alto, tiempo)
--
-- Descripción:
--     Crea y devuelve un objeto de animación a partir de una hoja de sprites, los cuadros, se obtendrán de la imagen localizada en la ruta especificada, y serán dividos de izquierda a derecha y de arriba hacia abajo. Los cuadros se dividen en partes iguales según el ancho y alto especificado.
--
-- Parámetros:
--     spritesheet: Una ruta a una imagen que tenga todos los frames en ella.
--     ancho: Un número con el ancho de cada frame recortado.
--     alto: Un número con el alto de cada frame recortado.
--     tiempo: Un número con el tiempo en milisegundos que durará cada frame.
 
 
 
anim.create(ruta, ancho, alto, tiempos)
--
-- Descripción:
--     Crea y devuelve un objeto de animación a partir de una hoja de sprites, los cuadros, se obtendrán de la imagen localizada en la ruta especificada, y serán dividos de izquierda a derecha y de arriba hacia abajo. Los cuadros se dividen en partes iguales según el ancho y alto especificado.
--
-- Parámetros:
--     spritesheet: Una ruta a una imagen que tenga todos los frames en ella.
--     ancho: Un número con el ancho de cada frame recortado.
--     alto: Un número con el alto de cada frame recortado.
--     tiempos: Tabla con la duración de cada frame en milisegundos (se espera que la longitud de esta tabla, sea la misma que la de imgs).

Se recomienda que no se coloque de nombre "anim" a ninguna variable, ya que, reemplazaría las funciones de la lib.

Luego que tenemos nuestro objeto, disponemos de las siguientes funciones:

anim.blit(animacion,x,y) o animacion:blit(x,y)
-- blitea la animación en dichas coordenadas
 
anim.fxtint(animacion,x,y,color) o animacion:fxtint(x,y,color)
-- igual que el blit, pero con un efecto de tintado
 
anim.blend(animacion,x,y,alfa) o animacion:blend(x,y,alfa)
-- igual que el blit, pero con un efecto de transparentado
 
anim.rotate(animacion,angulo) o animacion:rotate(angulo)
-- como el image.rotate, rota la animación
 
anim.start(animacion) o animacion:start()
-- empieza o reanuda la animación
 
anim.pause(animacion) o animacion:pause()
-- pausa la animación
 
anim.reset(animacion) o animacion:reset()
-- reinicia una animación, dejándola en el primer frame
-- si la animación estaba pausada, seguirá pausada
-- si la animación estaba corriendo, seguirá corriendo
 
anim.free(animacion) o animacion:free()
-- libera las imágenes de la animación y también se liberan las de la tabla que recibió al crearlas, ya que en si, es la misma tabla la que se libera
 
anim.setframe(animacion,frame) o animacion:setframe(frame)
-- cambia el cuadro actual que se está mostrando de la animación por el que se ponga, además, si el frame está fuera de límites (frame mayor a la cantidad de cuadros), se setea al último frame
 
anim.fxadd(animacion,x,y,color) o animacion:fxadd(x,y,color)
-- igual que el blit, pero con un efecto de suma de colores
 
anim.fxsub(animacion,x,y,color) o animacion:fxsub(x,y,color)
-- igual que el blit, pero con un efecto de resta de colores
 
anim.currentframe(animacion) o animacion:currentframe()
-- devuelve el número del frame actual



Uso del Facilitador (v4.5):

anim.createloadtable(ruta, inicio, fin, extension, cifras)
--
-- Descripción:
--     Genera una tabla con rutas de imágenes secuenciales, a partir de los parámetros dados. Está pensada para ser usada en conjunto con las funciones de creación de imágenes que permitan recibir tablas con rutas para la carga de imágenes.
--
-- Parámetros:
--     ruta: String con la ruta inicial (Ej: "frame")
--     inicio: Número con el frame inicial (Ej: 0)
--     fin: Número con el frame final (Ej: 10)
--     extension: String con la extensión de todos los frames (Ej: "png")
--     cifras: Este parámetro es opcional, sirve para que cada índice del frame (en el rango de inicio y fin), sea autoformateado a esta cantidad de cifras (Ej: 2)
--
-- Ejemplos:
--     Con los parámetros de ejemplo anteriores:
--     anim.createloadtable("frame", 0, 10, "png", 2)
--     Se obtendrían los nombres "frame00.png" "frame01.png" "frame02.png" ..... "frame10.png"
--
--     Si no se especificaran la cantidad de cifras:
--     anim.createloadtable("frame", 0, 10, "png")
--     Se obtendrían los nombres "frame0.png" "frame1.png" "frame2.png" ..... "frame10.png"



Como cargar y mostrar un GIF (v4.5 y posteriores):

Para cargar y mostrar un GIF, basta con las siguientes lineas.

dofile("animlib.lua") -- cargamos la librería de animaciones
migif = anim.create("migif.gif") -- cargamos el gif y creamos la animación
migif:start() -- que empiece a reproducir la animación
 
while true do
	migif:blit(0,0) -- mostramos el gif
	screen.flip() -- actualizamos pantalla
end

Y para mostrar una animación a partir de los cuadros en una carpeta llamada "cuadros", nombrados "cuadro1.png" "cuadro2.png" "cuadro3.png"... hasta "cuadro20.png" con un tiempo de 7 milisegundos entre cada cuadro, basta con:

dofile("animlib.lua") -- cargamos la librería de animaciones
 
rutas = anim.createloadtable("cuadros/cuadro", 1, 20, "png")
mianim = anim.create(rutas, 7) -- creamos la animación a partir de las rutas creadas, con un tiempo de 7 milisegundos entre cuadro y cuadro
mianim:start() -- que empiece a reproducir la animación
 
while true do
	mianim:blit(0,0) -- mostramos el gif
	screen.flip() -- actualizamos pantalla
end

¿Más fácil? ¡Imposible!

Nota: Para liberar una animación, si bien es cierto hay un anim.free(), más sin embargo el objeto en sí, no pasa a ser nulo... Por lo tanto, recomiendo que luego de un "animacion:free()" se coloque un "animacion = nil"


AnimLib v4.8

Mejoras:

  • Corrige la función math.floor que usa la lib, debido a que en algunos eboots devuelve valores erróneos y afecta al comportamiento de la misma.

Descargar AnimLib v4.8  (Sólo Usuarios Registrados).


AnimLib v4.7

Mejoras:

  • Corregida la carga de ciertos gifs que tienen frames completos y no actualizaciones del anterior.

Descargar AnimLib v4.7  (Sólo Usuarios Registrados).


AnimLib v4.5

Mejoras:

  • GifLib corregida y actualizada a la versión 2.5.
  • Corregidos pequeños errores en el código interno.
  • Mejorada la gestión de la RAM (Los GIFS ahora son más livianos)
  • Todas las Libs que necesita AnimLib, ya vienen incorporadas en el mismo archivo de animlib.lua
  • Añadidas más funciones de creación de animaciones.
  • Añadido un facilitador para carga de imágenes separadas secuenciales (anim.createloadtable)

AnimLib v4.5 (con HexLib v1 y GifLib v2.5 incorporadas) - Creación y carga de animaciones, desde cuadros de animación, hoja con cuadros, o un gif animado :D
GifLib v2.5 - Aunque no es necesario tenerla ya que viene incluida en AnimLib v4.5, la subo por separado por si alguien quiere sólo extraer los frames y las duraciones, y usarlos a su gusto.
script - Script de ejemplo con carga de dos gifs y como mostrarlos por pantalla (uno de ellos está rotando), y una barra que muestra la cantidad de ram libre (parte roja)
nyan.gif y no.gif - dos gifs animados

Descargar AnimLib v4.5   (Sólo Usuarios Registrados).


AnimLib v4

Mejoras:

  • Añadida la función anim.create("ruta de un GIF") que crea todos los frames y los carga automáticamente.
Descargar AnimLib v4   (Sólo Usuarios Registrados).

HexLib - Ciertas facilidades de conversión hexadecimal a binario y viceversa.
GifLib (Usa HexLib) - Carga de GIFS.
AnimLib (Usa GifLib) - Creación y carga de animaciones, desde cuadros de animación, hoja con cuadros, o un GIF animado :D
script - Script de ejemplo con carga de dos GIFS y como mostrarlos por pantalla (uno de ellos está rotando), y una barra que muestra la cantidad de RAM libre (parte roja)
nyan.gif y no.gif - 2 GIFS animados de ejemplo.


AnimLib v3

Mejoras:

13-05-2011
  • Mejorado el código interno (Se simplifican algunas funciones que se repiten).
  • Se añaden dos efectos nuevos: fxadd, y fxsub.
  • Se añade una función para saber el número frame que se está mostrando.
  • Ahora se puede cargar tabla con imágenes y hoja de sprites.
  • Arreglado un pequeño bug que causaba error al crear una animación bajo ciertas condiciones.

Descargar AnimLib v3   (Sólo Usuarios Registrados).


AnimLib v1.5
Mejoras

  • La animación ya no se blitea centrada, y se ha añadido una nueva función: anim.setframe(animacion,frame)

Descargar AnimLib v1.5   (Sólo Usuarios Registrados).


AnimLib v1

Descargar AnimLib v1   (Sólo Usuarios Registrados).

4.059785
Tu voto: Ninguno Votos totales: 4.1 (184 votos)

Anuncios Google

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de barney77

Se que no es un bug, pero

Se que no es un bug, pero quiero informarlo, bien, use la anmlib 4.7 y se tardo 37.3 segundos(si,lo conte con un cronometro) en blitear el gif, el gif que blitee es el que tengo en la firma, pesa 92.3 KB y en total son 5 cuadros, el primero, el tercero y quinto son de 1 segundo, y el 2 y el 4 son de 0.7 segundos.

Saludos.

Imagen de Chimecho

sep xD

Es por el tamaño de los cuadros... hasta que DeViaNTe no arregle el blit a imagen, no queda más que esperar...

Explico: hay ciertos gifs que usan un sistema de economía, lo que hace es que cada cuadro, en realidad no sea un cuadro completo, sino una actualización del anterior.

Por otro lado, LuaDEV cuando blitea de imagen a imagen, sólo hace un reemplazo de colores, sin importar que el color a pintar sea transparente, es decir, que cuando bliteas un cuadro totalmente transparente sobre uno que ya tenía algo, este último desaparece por completo (claro, todo se pinta transparente).

Es por eso que cree una función que vaya pixel a pixel pintado todo aquel que tenga el valor alfa mayor a cero, es más, dentro de animlib dice "<-- razón por la que va lento".

Por otro lado... no se como hizo daftpunk00 para que se guarde como cuadros completos (esto es lo que arreglé en la última versión, para que pueda cargar gifs sin el sistema de economía de forma rápida y efectiva), ya le preguntaré.

Edito: después de todo lo que escribí... he vuelto a leer tu cometario xD, te referías al tiempo de carga, o al gif mostrándose ya cargado?

Saludos!



PSP FAT [5.00 M33-6] [6.60 ME] [Hard Moded] / Nintendo Wii [4.1U] [cIOS Hermes] [D2X cIOS] / iPhone 3G [4.2.1] [BB 05.13.04] [redsn0w] / iPod Touch 4 [6.1] [evasi0n]

07/05/10: Tuve el placer de llamarle con todo derecho "N00B" a molotovi xDDD

Recuerda: Sé el intérprete -_-

Imagen de barney77

Me refería aque tarda ese

Me refería aque tarda ese tiempo en blitear el gif ya cargado, gracias me lo has aclarado.

Saludos.

Imagen de User170294

Y si quiero reproducir un gif

Y si quiero reproducir un gif de una explosion?? no me interesa que se reproduzca sin cesar. ¿Como hago para reproducirlo solo una vez?

Gracias.


Imagen de Chimecho

pues...

Algun dia pondre un runonce, pero de igual forma, cuestion de usar la imaginacion y el set de funciones de la lib...

Si el frame actual no es el ultimo, entonces
Mostrar animacion
Caso contrario
Detener animacion
Fin

Si debe aparecer una explosion, entonces
Setear frame al primero (Resetear animacion)
Reproducir animacion
Fin

Y listo, vamos que solo bastaba con plantear bien un algoritmo, como que les hace falta practicar eso verdad?

Saludos!



PSP FAT [5.00 M33-6] [6.60 ME] [Hard Moded] / Nintendo Wii [4.1U] [cIOS Hermes] [D2X cIOS] / iPhone 3G [4.2.1] [BB 05.13.04] [redsn0w] / iPod Touch 4 [6.1] [evasi0n]

07/05/10: Tuve el placer de llamarle con todo derecho "N00B" a molotovi xDDD

Recuerda: Sé el intérprete -_-

Imagen de Chimecho

wow

Que rápido, gracias al editor que la actualizó ;)

Una cosilla, podría agregarse a la lista de funciones esto:

anim.create(ruta de un gif)
-- crea y devuelve un objeto de animación a partir de un gif animado, se extraen los frames y la duración de cada uno... al ser un objeto de animlib, se pueden usar sobre este objeto todas las funciones de la librería

Saludos! :D



PSP FAT [5.00 M33-6] [6.60 ME] [Hard Moded] / Nintendo Wii [4.1U] [cIOS Hermes] [D2X cIOS] / iPhone 3G [4.2.1] [BB 05.13.04] [redsn0w] / iPod Touch 4 [6.1] [evasi0n]

07/05/10: Tuve el placer de llamarle con todo derecho "N00B" a molotovi xDDD

Recuerda: Sé el intérprete -_-

Imagen de Tsukiumi

Cierto

Se me pasó ponerlo en esa parte, ya mismo lo arreglo.

Saludos.

Imagen de NauTiluS1

Responder rapido porfavor.

Qué pasa si en vez de image.load uso image.loadsprite ya que estoy haciendo un juego con sprites y no quiero cargar dos veces la misma imagen.

EDITO:

Ya está solucionado


Follow me twitter nautilus1_jmccu!!
Sony, ya a nadie le interesa tus UMD si alguien compra una psp es por nosotros los coders. Madura y has un FW que haga la diferencia y anime a las personas en comprar un PSP

Imagen de friz97

Que Gran librería

Muchas gracias chimecho.

Imagen de barney77

Donde estabas?.. Sigues en

Donde estabas?..

Sigues en Lua?

Imagen de friz97

En serió no

Me habías visto de vuelta??

y si sigo con lua.

checa esto :http://psp.scenebeta.com/node/76451

Saludos Chimecho

Muchas gracias por los aportes continuos a la comunidad!

Imagen de cam-maker

Grandiosa libreria :D

Grandiosa libreria :D

gracias por este aporte master Chimecho xD muy util ;)

Imagen de iRVing_Prog

buena chime

seguramente la probare cuando tenga tiempo, se nota que está muy interesante.

:)

Imagen de klozz

pfff me eh quedado sin

pfff me eh quedado sin palabras chime :) muy buena seguro la usare en proximos Homebrew's :D e agradce tu trabajo :)

como lo utilizo? cargo la lib

como lo utilizo? cargo la lib y despues que?

Imagen de Chimecho

^^

Ha quedado genial, como siempre, los editores hacen un gran trabajo en scenebeta :)

Por cierto, faltaron un par de líneas en el set de funciones:

anim.setframe(animacion,frame) o animacion:setframe(frame)
-- cambia el cuadro actual que se está mostrando de la animación por el que se ponga, además, si el frame está fuera de límites (frame mayor a la cantidad de cuadros), se setea al último frame

Saludos!



PSP FAT [5.00 M33-6] [6.60 ME] [Hard Moded] / Nintendo Wii [4.1U] [cIOS Hermes] [D2X cIOS] / iPhone 3G [4.2.1] [BB 05.13.04] [redsn0w] / iPod Touch 4 [6.1] [evasi0n]

07/05/10: Tuve el placer de llamarle con todo derecho "N00B" a molotovi xDDD

Recuerda: Sé el intérprete -_-

Como siempre todo mi respeto

Como siempre todo mi respeto amigo. Excelente

Imagen de NauTiluS1

Buenisimo chime se agradece

Buenisimo chime se agradece :D

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.