lunes, 29 de agosto de 2011

GameEngine: Capitulo 28 . Usando XML

Hola a todos,

Bienvenidos a un nuevo capitulo de como crear tu propio game engine y no morir en el intento.

Antes que nada disculpad por la tardanza pero este capitulo ha costado un poco más de lo que esperaba.

El capitulo de hoy tratará sobre el uso de XML tal y como se explicó en el capitulo 9 del curso de programación:

Los cambios implementados han sido cambiar todo los archivos de configuración en txt por xml. La forma estandar de implementar estos cambios se han realizado de la siguiente manera ( esto es solo un ejemplo, no cabrian todos los cambios implementados ):


void GUIManager::Init(int* argc, char* argv[])
{
    char id[256];    //Cadena donde guardaremos el identificador de cada recurso   
    char ruta[256];    //Cadena donde guardaremos la ruta de cada recurso
       
    TiXmlDocument doc( "Data\\LoadGUI.xml");

    cout << "Inicializamos el GUI manager\n";

    num_gui = 0;

    if ( !doc.LoadFile() )
    {
        printf( "Could not load test file 'Data\\LoadGUI.xml'. Error='%s'. Exiting.\n", doc.ErrorDesc() );
        exit( 1 );
    }

    TiXmlElement *root = doc.RootElement();
    for(TiXmlElement* element = root->FirstChildElement(); element; element = element->NextSiblingElement())
    {
        //Leemos el elemento
        sprintf(id,"%s", element->FirstChild("ID")->FirstChild()->Value());            //tomamos el ID
        sprintf(ruta,"%s",element->FirstChild("ROUTE")->FirstChild()->Value());        //tomamos la RUTA   
       
        LoadGUI(id,ruta);                //Cargamos el recurso
    }
}

LoadGUI
void GUIManager::LoadGUI( char id[], char ruta[] )
{
    char type[32],graf[32],var[32],max[32];
    int xi,yi,xf,yf;

    sprintf(loaded[num_gui].id,"%s",id);
    loaded[num_gui].num_item = 0;

    TiXmlDocument doc( ruta );

    cout << "Cargamos GUI: " << ruta <<"\n";

    if ( !doc.LoadFile() )
    {
        printf( "Could not load GUI FILE'. Error='%s'. Exiting.\n", doc.ErrorDesc() );
        exit( 1 );
    }

    TiXmlElement *root = doc.RootElement();
    for(TiXmlElement* element = root->FirstChildElement(); element; element = element->NextSiblingElement())
    {
        //Leemos el elemento
        sprintf(type,"%s", element->FirstChild("TYPE")->FirstChild()->Value());            //tomamos el ID

        sprintf(graf,"%s", element->FirstChild("GRAF")->FirstChild()->Value());   
        xi = atoi( element->FirstChild("xi")->FirstChild()->Value() );   
        yi = atoi( element->FirstChild("yi")->FirstChild()->Value() );   
        xf = atoi( element->FirstChild("xf")->FirstChild()->Value() );   
        yf = atoi( element->FirstChild("yf")->FirstChild()->Value() );

        if(!strcmp(type,"BAR"))
        {
            sprintf(var,"%s", element->FirstChild("VAR")->FirstChild()->Value());   
            sprintf(max,"%s", element->FirstChild("MAX")->FirstChild()->Value());   

            sprintf(loaded[num_gui].lista[loaded[num_gui].num_item].actual ,"%s" , var );
            sprintf(loaded[num_gui].lista[loaded[num_gui].num_item].max ,"%s" , max );
        }   

        //Introducimos la información de este item
        sprintf(loaded[num_gui].lista[loaded[num_gui].num_item].id ,"%s" , type );
        sprintf(loaded[num_gui].lista[loaded[num_gui].num_item].graf ,"%s" , graf );
        loaded[num_gui].lista[loaded[num_gui].num_item].xi = xi;
        loaded[num_gui].lista[loaded[num_gui].num_item].yi = yi;
        loaded[num_gui].lista[loaded[num_gui].num_item].xf = xf;
        loaded[num_gui].lista[loaded[num_gui].num_item].yf = yf;

        loaded[num_gui].num_item++;
    }
    num_gui++;
}

Los archivos de carga en XML son de este estilo:
<list>
    <element>
        <ID>PLAY</ID>
        <ROUTE>Data/GUI/play.xml</ROUTE>
    </element>
</list>

Y los archivos de configuración pueden ser de este estilo:
<list>
    <element>
        <TYPE>GRAF</TYPE>
        <GRAF>GUI</GRAF>
        <xi>0</xi>
        <yi>0</yi>
        <xf>640</xf>
        <yf>100</yf>
    </element>

    <element>
        <TYPE>BAR</TYPE>
        <GRAF>GUIAMMO </GRAF>
        <xi>100</xi>
        <yi>10</yi>
        <xf>500</xf>
        <yf>20</yf>
        <VAR>AMMO</VAR>
        <MAX>MAXAMMO</MAX>
    </element>

    <element>
        <TYPE>BAR</TYPE>
        <GRAF>GUILIFE </GRAF>
        <xi>100</xi>
        <yi>40</yi>
        <xf>500</xf>
        <yf>50</yf>
        <VAR>LIFE</VAR>
        <MAX>MAXLIFE</MAX>
    </element>
</list>

En breve os subiré el código a la zona de descargas....

Espero que os haya gustado y hayais aprendido.

Nos vemos

0 comentarios :

Publicar un comentario

Entradas populares