Introducci�n
Lo que se intenta con �ste documento es intentar desarrollar el mundo 3D que del que va a depender TaiKai. Hay que tener en cuenta que deber� generarse un motor 3D que pueda reutilizarse en otras aplicaciones.
Antes de nada, destacar que TaiKai se apoyar� en las librerias que incluye DirectX con respecto al mundo tridimensional (Direct3D). Por lo que nuestro motor 3D se basar� en dicha tecnolog�a. La estructura que se formar� ser� la siguiente, del nivel m�s bajo de Windows, hasta la presentaci�n del video-juego en pantalla ...
API Windows |
DirectX |
Motor3D |
TaiKai |
Ventana de Juego |
Vamos a intentar ir describiendo cada uno de �stos niveles. Teniendo en cuenta que no se va a definir de una forma completa, sino simplemente lo que puede llegar a interesarnos a nivel de desarrollo del TaiKai.
En desarrollo.
En desarrollo.
Se van a definir varios tipos de clases, empezando por el nivel m�s b�sico, y terminando en el nivel m�s global o gen�rico.
La clase m�s b�sica de un mundo tridimensional, ser� un punto en el espacio. Pues bien, esa ser� nuestra primera clase. Denominada cPto3D, contempla �nicamente una referencia a las coordenadas de un punto con respecto al eje principal.
class cPto3D { int x,y,z; public: void Get(int *_x, int *_y, int *_z); void Set(int _x, int _y, int _z); }; |
Hay que tener en cuenta que la clase definida y las que a continuaci�n se definan, no est�n actualizadas al 100%, debiendose hacer un estudio m�s preciso de la mejor forma de implementaci�n. Lo que aqu� se representa es un ejemplo, el cu�l deber� optimizarse.
Continuemos. Bien, ya podemos definir puntos en el espacio. El siguiente paso consiste en que, a partir de dichos puntos podamos generar planos. Los planos pueden generarse a partir de la definici�n de tres puntos en el espacio, pues bien, nuestro plano debera tener definidos tres puntos distintos para poder representarse. As� mismo, podr� tener una textura o color, atributo que se definir� en su clase, denominada cPlano3D.
#include "cPto3D.hh" class cPlano3D { cPto3D Punto[3]; // Plano int Color; // Color [0=Textura] char *Textura; // Fichero grafico public: void Get(cPto3D *_x, cPto3D *_y, cPto3D *_z); void Set(cPto3D _x, cPto3D _y, cPto3D _z); int GetColor(void); void SetColor(int _color); char *GetTextura(void); int SetTextura(char *_textura); }; |
Ahora ya tenemos planos, pero el mundo 3D no est� formado de planos, sino de objetos. Como veis, vamos desarrollando el mundo desde el nivel m�s b�sico que puede ser el punto, hasta el m�s desarrollado que es el objeto. El objeto s�lo contendr� una serie de planos, lo que dar� el volumen necesario y delimitar� el objeto. Sobre esta clase es sobre la que se aplicar� en su momento la cinem�tica de los luchadores, de momento este paso nos lo saltaremos, actualizando la clase, denominada cObj3D, cuando sea necesario. De momento, s�lo vamos a definir la forma y el color o textura, contenido en cada uno de los diferentes planos que definen la figura.
#include "cPlano3D.hh" struct sPlano { cPlano3D *Plano; sPlano *sig; }; class cObj3D { sPlanos *BasePlanos; // Planos del objeto public: void Del(cPlano3D *_plano); void Add(cPlano3D *_plano); }; |
Ya podemos crear cualquier objeto a partir de planos triangulares. Cuanto mayor n�mero de planos haya y menor tama�o tengan, mayor resoluci�n alcanzar� la representaci�n, aunque aumentar� considerablemente el tiempo que se tardar� en generar dicho objeto.
Bien. Pero, �C�mo mostrar los diferentes objetos que se vayan creando por pantalla?. Para ello vamos a crear otra serie de objetos, cuyo cometido principal van a ser, gestionar todo el mundo 3D y representarlo en la pantalla.
Pero antes de continuar, definiremos otra serie de clases necesarias para poder crear el mundo 3D del que hemos estado hablando. Estas clases son dos, la de focos de luz, que llamaremos cFoco3D, y las camaras desde donde se vera el mundo, denominadas cCamara3D. Ninguno de ambos "objetos" son extra� al lector.
El foco de luz o cFoco3D representara una luz direccionada, es decir, una especie de flexo de estudio. Solo iluminar� aquello que se cruce en el camino al que apunta, y no al resto. La clase ser�a algo as�.
#include "cPto3D.hh" class cFoco3D { cPto3D Orig; cPto3D Des; int radiofoco; int intensidad, public: void Set(cPto3D *_Orig, cPto3D *_Des, int _radiofoco, int _intensidad); void Get(cPto3D *_Orig, cPto3D *_Des, int *_radiofoco, int *_intensidad); int On(void); // Devuelve 0 si no se encendio void Off(void); }; |
Recuerdo que las clases aqu� mostradas no son las finales y deber�n sufrir muchas modificaciones antes de que logren serlo.
La clase cCamara3D representar� el punto desde el que se observar� el mundo tridimensional. S�lo podr� definirse una en el mundo, por lo que si le pasamos otra camara, cambiar� el punto de vista desde el que se v�, sin sufrir ning�n otro cambio y eliminando la c�mara actualmente definida, es decir, "la pisa".
#include "cPto3D.hh" class cCamara3D { cPto3D Orig; // Punto origen cPto3D Des; // Punto destino int lente; // Lente de la camara public: void Set(cPto3D *_Orig, cPto3D *_Des, int _lente); void Get(cPto3D *_Orig, cPto3D *_Des, int *_lente); }; |
La lente, es el tipo de objetivo con el que se ve el mundo. El punto de origen es la posici�n donde se encuentra la c�mara, y el punto destino es la direcci�n a donde apunta la camara. Tambi�n se pueden utilizar vectores para definir la direcci�n de la c�mara.
Ya casi hemos terminado. Una vez definidos todos los elementos esenciales de un mundo, pasaremos a definir el escenario donde se desarrolle toda la acci�n, y sobre el que se actuar� para representar el escenario en la ventana de Windows. Para ello se ha definido la clase principal del motor 3D que estamos desarrollando, cMundo3D. Esta clase ser� la que lleve a cabo todo el proceso de representaci�n y movimiento. Aunque el proceso de representaci�n se lo reservamos a la clase cWin3D, que se definir� m�s adelante.
Sobre la clase mundo3D (cMundo3D), se crear�n todos los objetos, focos y luces, que formen parte de �l y, por supuesto, la c�mara
#include "cObj3D.hh" #include "cFoco3D.hh" #include "cCamara3D.hh" struct sObjetos { cObj3D *Objeto; sObjetos *sig; }; class cMundo3D { sObjetos *BaseObjetos; public: // Funciones de a�adir objetos, focos y camaras. // Funciones de eliminar objetos, focos y camaras. // Faltan ademas las funciones de movimientos en // todas las clases anteriormente definidas. }; |
[En desarrollo]
La idea principal consiste en crear una librer�a din�mica (DLL) que trabajase con todas y cada una de estas clases 3D, de tal forma que cuando quisi�semos comenzar a jugar (combate), se cargase la librer�a, se inicializasen los datos y se empezase a luchar. Se podr�a programar todo dentro de TaiKai, pero el objetivo no s�lo es crear un juego de lucha, sino adem�s construir un motor 3D que fuese capaz de ser modificado para su optimizaci�n, de tal forma que pudiese ser utilizado en futuros proyectos 3D de la empresa.
Independizando lo que es el juego 3D en s� con el resto de la aplicaci�n se conseguira un importante avance a la hora de desarrollar el video-juego, ya que poseeremos dos grupos de desarrollo, adem�s de los otros grupos, graf�stas y m�sicos. Uno de esos grupos se encargar� de la aplicaci�n y el otro del juego en s�.
Respecto a la aplicaci�n de TaiKai, inicialmente ser� la m�s trabajada por todos los grupos, excepto por el que se dedique en exclusiva al motor 3D. Parte m�s delicada del proyecto.
La versi�n 1.0 de Taikai obliga a crear o iniciar el producto por el men� 100% Windows, al que se le ir�n agregando componentes, gr�ficos, animaciones, efectos sonoros y m�sica de fondo, etc ... seg�n lo vayan generando los graf�stas y m�sicos. Pero siempre partiendo de una versi�n totalmente operativa desde el comienzo.
La gran cantidad de cosas que hay que hacer, e inventar, obliga a generar un men� as� de simple, me explicar�. La necesidad de un men� operativo y a la vez simple, radica en que existen otras zonas que deben desarrollarse y de las que todav�a no hemos tratado: Generaci�n de los diferentes juegos y entrenamientos (si pueden inventarse mejor que mejor), pensar en un sistema de tratamiento de los atributos de los luchadores, desgaste f�sico, y como componente m�s atractivo, la creaci�n de todo el sistema de Inteligencia Artificial del juego, as� como el de dise�o de juego, totalmente independiente del combate 3D. Todo esto deber�a crearse posteriormente a la generaci�n del men� y teniendo medianamente avanzado el motor 3D (aunque sea te�ricamente, aunque esto no suceder�).
Entre los objetivos que hay que completar se encuentran ...
En desarrollo.