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.
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).
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
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"
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!
Descargar AnimLib v4.8 (Sólo Usuarios Registrados).
Descargar AnimLib v4.7 (Sólo Usuarios Registrados).
Descargar AnimLib v4.5 (Sólo Usuarios Registrados).
Descargar AnimLib v3 (Sólo Usuarios Registrados).
Descargar AnimLib v1.5 (Sólo Usuarios Registrados).
Descargar AnimLib v1 (Sólo Usuarios Registrados).
Comentarios
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.
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 -_-
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.
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.
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 -_-
wow
Que rápido, gracias al editor que la actualizó ;)
Una cosilla, podría agregarse a la lista de funciones esto:
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 -_-
Cierto
Se me pasó ponerlo en esa parte, ya mismo lo arreglo.
Saludos.
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
Que Gran librería
Muchas gracias chimecho.
Donde estabas?.. Sigues en
Donde estabas?..
Sigues en Lua?
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!
Grandiosa libreria :D
Grandiosa libreria :D
gracias por este aporte master Chimecho xD muy util ;)
buena chime
seguramente la probare cuando tenga tiempo, se nota que está muy interesante.
:)
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?
^^
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:
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
Buenisimo chime se agradece
Buenisimo chime se agradece :D