LooverLib
¿Qué es LooverLib?
Looverlib es una libreria 2d open source implementada bajo c++ y Direct3d por lo que utiliza aceleración por hardware para el render. No usa DirectDraw ni ID3DXSprite, sino Direct3d 9.0 montando todas las imágenes sobre texturas de una manera completamente transparente para el usuario, aprovechando de esta manera la aceleración por hardware al 100% y permitiendo sprites de tamaños increibles incluso con alpha blending activado.
Esta orientada a la programación de juegos 2d pero puede ser utilizada en cualquier aplicación multimedia.
LooverLib no es muy extensa, cualquier proyecto que la use utilizará apenas unas 7 clases, pero es muy potente, tremendamente intuitiva, está completamente documentada y... posiblementes esto sea lo mejor, es Open Source bajo licencia LGPL.
Con esas 7 clases tendrás una solución completa a todo lo que un motor 2d puede pedir gráficamente. Formatos de imágenes, mapas de bits, mapas de durezas, filtros tipo photoshop, animaciones por script, superficies de cualquier tamaño, scrolls cortados en el tamaño de bloque que tu desees realizando descarte autómatico incluso cuando están rotados o escalados, fuentes de texto con herramienta para crearlas incluída (MudgeFont), entintados, fades, transparencias, alpha blending, color key, primitivas gráficas, posibilidad del uso de entidades (lo que simplifica inmensamente su uso) y un largo etc.
Características de LooverLib
Todo lo que desees saber sobre las clases de LooverLib lo podrás encontrar en la documentanción, pero... ¿que tal si damos un breve repaso a sus características más importantes?
Creación de la ventana y del Render, LOV_Window y LOV_Render
Estas dos clases gestionan la creación de ventanas (LOV_Window) y el renderizado en pantalla (LOV_Render).
Algunas características dignas de resaltar son la posibilidad tanto de usar o no LOV_Window.
¿Y eso por que es una característica destacable? Pues porque para pruebas rápidas puedes crear la ventana con la clase LOV_Window, pero ¿y si prefieres crear tu mismo la ventana desde tu aplicación para por ejemplo gestionar los eventos y el paso de mensajes de Wind32? Pues nada más fácil que pasar a LOV_Render los dos punteros de Direct3d (el device y el render) y ya podrás usar tranquilamente LooverLib en tu apliación.
En esta clase se encuentran también todas las funciones de transformación, atributos y dibujo de objetos gráficos (superficies, primitivas, animaciones, fuentes, etc). Aunque una manera mucho más intuitiva y sencilla de dibujar los objetos gráficos es mediante el uso de entidades con LOV_Entity2dManager, como veremos más abajo.
Manejo de imágenes, LOV_ImageManager y LOV_Image
Esta clase (implementada gracias a OpenIl) se encarga de la gestión de las imágenes, carga y graba imágenes en los siguientes formatos gráficos: jpg, bmp, png, pcx y tga . Una vez cargada las imágenes, se puede aplicar sobre ellas filtros al más puro estilo photoshop (detección de bordes, pixelación, definición, desenfoque...) así como recortes de bloques, rotaciones, getpixels, putpixels, etc.
Un objeto de la clase LOV_Image no puede ser dibujado directamente, antes debe ser transformado a una superficie LOV_Surface (no confundir con las superficies de DirectDraw).
Y sino puede dibujarse directamente ¿para que tener esta clase intermedia? Pues aparte de para poder aplicar esos filtros que hemos comentado tipo photoshop, esta clase puede ser utilizada para mapas de durezas tan utilizados en juegos y al ser mapas de bits no es necesario lockear ninguna textura ni superficie.
Esta clase puede usarse por ejemplo para programar un generador de mapas tipo worms en tres horas.

Manejo de superficies, LOV_SurfaceManager y LOV_Surface
Esta es sin duda la clase más importante de la libreria. Otras clases, como la de animación o la de fuentes, la utilizan como base.
Una vez cargada una imagen, bien desde un objeto LOV_Image o directamente desde un archivo, si quieremos dibujarla en pantalla, debe ser cargada como una superficie LOV_Surface. Cuando hablamos de superficie no nos referimos a las superficies de DirectDraw, sino a un conjunto de texturas, que conforman la imagen.
Es decir, todo objeto gráfico, ya sea un sprite, una animación o una fuente, es en LooverLib una superficie. Cada una de estas superficies está constituida internamente por una o varias texturas de manera totalmente transparente para el usuario. Es decir, si decides dibujar una imagen de 5623x453, LooverLib, se encargará de fragmentarla en trozos teniendo en cuenta el máximo de textura permitido por tu tarjeta. Así mismo, si lo deseas, puede especificar el ancho de bloque. Esto puede ser util por ejemplo para cortar un scroll en trozos de 255x255. Incluso puedes especificar que los bloques que queden fuera del ViewPort no sean dibujados, aún cuando el scroll está rotado o escalado.
El uso de superficies que internamente están constituidas por texturas permite aprovechar la aceleración hardware al límite. Efectos de partículas, sprites gigantes con alpha blending, entintado y transparencia al mismo tiempo... todo esto es posible con LooverLib.
Esta clase puede usarse por ejemplo para programar tres scrolles haciendo parallax con alfpha blending en 20 minutos.

Manejo de animaciones, LOV_AnimationManager y LOV_Animation
Una de las grandes bazas de LooverLib es su sistema de animaciones. Las animaciones, se diseñan a través de un script muy sencillo de aprender y que otorga una configuración muy amplia. Define que archivos gráficos constituyen los "frames" o "imágenes" de la animación y construye con ellos secuencias. Así mismo, se puede elegir el tiempo que tarda cada frame, su desplazamiento, etc.
Esta clase puede usarse por ejemplo para programar unos luchadores de un juego de SDK animados en una pantalla del juego.

Manejo de fuentes, LOV_FontMananger, LOV_Font1 y LOV_Font2
Existes dos tipos de fuentes en LooverLib . El primer tipo (LOV_Font1) gestiona fuentes creadas con MudgeFont. Para hacer uso de estas fuentes bastará con usar dicho editor modificado para LooverLib (ver sección de descargas). Una vez creada la fuente, estas pueden ser añadidas al administrador pasando como parámetro el archivo de configuración y el fichero gráfico que contiene los caracteres dibujados; ambos generados automáticamente por MudgeFont.
Por otro lado, el segundo tipo de fuentes que soporta LooverLib, es decir los objetos LOV_Font, son fuentes creadas a partir de una imagen cualquiera dividida en bloques. De esta manera se le da libertad al grafista que quiera dibujar sus propias fuentes, el cual tan solo tendrá que indicar los caracteres que aparecen y las dimensiones de cada bloque que contiene un carácter.

Manejo de entidades, LOV_Entity2dManager y LOV_Entity2d
Y la guinda para el final.
¿Qué es una entidad?
Una entidad es una abstracción que resulta del diseño de una estructura compuesta por un elemento audivisual junto con unos atributos que lo describen.
Es decir, una entidad podría ser un sprite con su posición x,y,z; una animación con su posición también y además su escala y un entintado, etc.
Lo bueno de las entidades es que son independientes del gráfico. Es decir puedes tener mil entidades "pelota" que compartan un mismo gráfico "pelota.bmp".
LooverLib permite "montar" los objetos gráficos sobre entidades de forma que simplemente haciendo esto:
mSombrilla.SetSurface (&mSurfaceSombrilla);
mSombrilla.SetPosition (400, 250, 1);
mSombrilla.SetScale (2, 2);
mSombrilla.SetFade (0, 0, 255, 128);
Se dibuje en pantalla la superficie "sombrilla", en la posición 400, 250 profundidad 1. Escalada al doble de su tamaño y tintada de azúl medio transparente.
Genial, ¿verdad? :)
Si por el contrario esto no te gusta y prefieres tan solo una función de transformación, una función de atributos de color, y una serie de funciones para dibujar cada objeto gráfico, puedes usar directamente la clase LOV_Render. Esto podría ser útil si por ejemplo decides crear tu propia clase de entidades.
Todos los ejemplos de LooverLib usan intensivamente entidades.



