domingo 18 de enero de 2009

Crónicas de D+D Engine: D+D Begins.

Viernes 16: Todo listo… ¿y ahora?
Con todo andando solo falta algo que hacer…


Una vez que todo esta en marcha hay que usar el lápiz y el papel.
Los garabatos de ahora en más se van a esparcir sobre las pobres y blancas hojas para poder esquematizar el esqueleto de todo el engine.
Arriba Primer (UML)

Para diseñar se puede empezar de varias formas. Las que conozco yo son dos:
la uno: empezar por las clases principales de las cuales heredaran todas nuestras clases; o bien la segunda forma: empezar a diseñar como se come un plato de polenta caliente, de los bordes mas alejados hacia el centro, fuera de la hermosa (o deliciosa según el caso) metáfora esto quiere decir empezar por las clases que menos influyan en el resto del sistema desde un punto de vista de jerarquía de clases.

Dado que hay que entrar en calor creí oportuna la segunda opción. La Primer clase a diagramar no va a tener ningún heredero (o por lo menos por ahora no se me han ocurrido ninguno).
Y la primer clase del diagrama UML es trrttrtrrt (sonido de tambores): ImagenFuente.

Y bien, que demonios es ImagenFuente. Esta es una clase que va a encargarse de abstraer un poco el uso de imágenes, más específicamente el uso de sprite sheet.
Esta clase va a ser capaz de cargar una imagen en cualquier formato (bueno no cualquier formato solo los clásicos) gracias al uso de SDL_image y su mágica función IMG_load(“imagen.png”). También será capaz de dibujar solo una subimagen recortándola.

Por que es que esta clase no va a tener (en apariencias) dependencias es sencillo de explicar. A primera vista es fácil de suponer que clases como Sprite, TileSet descenderán de ella, pero hay una razón por la cual van ser útil que simplemente estas clases “conozcan” a ImagenFuente, y no que sean sus descendientes.

Y esta razón, es mala palabra al momento de diseñar y codificar, pero como incluir esto en el diseño cambia mucho la estructura y la comprensión del mismo es necesario dejarlo en claro del inicio, estoy hablando claro está de performance y por otro lado aparte flexibilidad.

Que ImagenFuente este aparte de Sprite, permitirá por ejemplo que si hay 100 sprite`s de un perro corriendo las “surfaces” que ocupen serán simplemente una, y cada sprite conocerá a este y a su propia subimagen velocidad de animación, alpha etc…. Y solo harán llamadas con información distinta con el mismo mensaje dibujarSubimagen( subImagen) a un mismo objeto;. Otra ventaja será que ImagenFuente será igual de útil para la clase TileSet haciendo posible manejar mapas en múltiples capas utilizando poco espacio en memoria.

He aquí el primer elemento del diagrama UML. Tiene lo básico como debe ser cuando uno empieza ¿No?.
Para quien no entienda UML, explico brevemente. Cada Clase se representa con un rectángulo que se divide en 3 partes. La primera obviamente corresponde al nombre de la clase. La segunda a los atributos, y por último los métodos. Más adelante explicaré con mas detalle como se representan relaciones de herencia y de conocimiento.

5 comentarios:

Darth RPG dijo...

Genial que te decidieras por SDL, me encanta tu idea de la clase para usar SDL_image. Yo no la he usado, prefiero usar bmps e ir a lo seguro. De todas maneras mis gráficos tampoco son muy complejos y carecen de animación :P.

Por cierto si necesitas una mano con SDL no dudes en contactarme, yo también tengo un proyecto en SDL y lo llevo algo avanzado.

Alejandro. dijo...

Buenísimo Darth!

Te cuento que instalar SDL_image es más simple de lo que parece y consta de una sola función (Bueno en realidad tiene un par más). Luego de instalarla cambias el SDL_LoadBMP por IMG_Load y listo!

Con lo de la ayuda ¡Es más que bienvenida! Cualquier cosa te contacto, ya que recien empiezo.

Un saludo! Y gracias por el comentario y el apoyo.

Kimis dijo...

Muy buena tu propuesta de hacer un engine. Por supuesto debe ser dificil, y yo no estoy preparado para hacer algo así en C++, pero si podría hacerlo en Python. Si no estoy equivocado, estas haciendo OOP/POO, ¿verdad?

Alejandro. dijo...
El autor ha eliminado esta entrada.
Alejandro. dijo...

Hola Kimis! Tanto tiempo.
No tengo muchos conocimientos en c++, y no creo que sean tan necesarios; si sabes diseñar en OOP es cuestion de detalles y de pelear un poco la implementación! :p

Bueno aunque ya te respondi con lo anterior, si es OO.

Un saludo!

P.D: Sin querer elimine el comentario anterior! jeje. El autor elimino su propio comentario debería decir XD