Mercurial > sumwars
changeset 16:f91e0e1ba856
monster-meshes werden aus XML geladen
author | kemic |
---|---|
date | Fri, 03 Oct 2008 14:10:18 +0000 |
parents | c821f69fc167 |
children | 09edaddbcb97 |
files | src/core/itemfactory.cpp src/core/objectloader.cpp src/core/objectloader.h src/gui/scene.cpp src/gui/scene.h |
diffstat | 5 files changed, 198 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/src/core/itemfactory.cpp Fri Oct 03 10:53:18 2008 +0000 +++ b/src/core/itemfactory.cpp Fri Oct 03 14:10:18 2008 +0000 @@ -1,5 +1,4 @@ #include "itemfactory.h" -#include "itemloader.h" #define USE_ITEMLOADER
--- a/src/core/objectloader.cpp Fri Oct 03 10:53:18 2008 +0000 +++ b/src/core/objectloader.cpp Fri Oct 03 14:10:18 2008 +0000 @@ -34,9 +34,11 @@ } else if (!strcmp(pAttrib->Name(), "subtype")) { - if (!strcmp(pAttrib->Value(), "GOBLIN")) + m_monster_data->m_type_info.m_subtype = pAttrib->Value(); + //Veraltet, da Enum hier auf String umgestellt ist + /*if (!strcmp(pAttrib->Value(), "GOBLIN")) m_monster_data->m_type_info.m_subtype = "goblin"; - //m_monster_data->m_type_info.m_subtype = WorldObject::TypeInfo::SUBTYPE_GOBLIN; + //m_monster_data->m_type_info.m_subtype = WorldObject::TypeInfo::SUBTYPE_GOBLIN;*/ } else if (!strcmp(pAttrib->Name(), "fraction")) { @@ -288,7 +290,7 @@ } -list<MonsterBasicData*>* ObjectLoader::loadObjects(const char* pFilename) // TODO Noch nicht benutzen! +list<MonsterBasicData*>* ObjectLoader::loadObjects(const char* pFilename) { for (int i=0; i<4; i++) { @@ -321,4 +323,115 @@ } } +//############################################################################## +int ObjectLoader::generateMonsterMeshData(TiXmlElement* pElement, string element) +{ + if ( !pElement ) return 0; + + TiXmlAttribute* pAttrib=pElement->FirstAttribute(); + int i=0; + int ival; + double dval; + + if (element == "Monster" && pAttrib) + { + if (m_monster_mesh_data == 0) + { + m_monster_mesh_data = new MonsterMeshData; + } + + while (element == "Monster" && pAttrib) + { + if (!strcmp(pAttrib->Name(), "subtype")) + m_monster_mesh_data->m_subtype = pAttrib->Value(); + + i++; + pAttrib=pAttrib->Next(); + } + } + + if (element == "Mesh" && pAttrib) + { + while (element == "Mesh" && pAttrib) + { + if (!strcmp(pAttrib->Name(), "file")) + m_monster_mesh_data->m_mesh = pAttrib->Value(); + + i++; + pAttrib=pAttrib->Next(); + } + } + + return i; +} + + +void ObjectLoader::searchMonsterMeshData(TiXmlNode* pParent) +{ + if ( !pParent ) return; + + TiXmlNode* pChild; + TiXmlText* pText; + + int t = pParent->Type(); + int num; + + switch ( t ) + { + case TiXmlNode::ELEMENT: + //printf( "Element [%s]", pParent->Value() ); + num = generateMonsterMeshData(pParent->ToElement(), pParent->Value()); + /*switch(num) + { + case 0: printf( " (No attributes)"); break; + case 1: printf( "%s1 attribute", getIndentAlt(indent)); break; + default: printf( "%s%d attributes", getIndentAlt(indent), num); break; + }*/ + break; + /* + case TiXmlNode::TEXT: + pText = pParent->ToText(); + printf( "Text: [%s]", pText->Value() ); + break; + */ + default: + break; + } + + for ( pChild = pParent->FirstChild(); pChild != 0; pChild = pChild->NextSibling()) + { + searchMonsterMeshData(pChild); + + if ( !strcmp(pChild->Value(), "Monster") && pChild->Type() == TiXmlNode::ELEMENT) + { + m_monster_mesh_list->push_back(m_monster_mesh_data); + m_monster_mesh_data = 0; + DEBUG5("Monster Mesh loaded"); + } + } +} + + +list<MonsterMeshData*>* ObjectLoader::loadMonsterMeshData(const char* pFilename) +{ + m_monster_mesh_data = 0; + m_monster_mesh_list = new list<MonsterMeshData*>; + + TiXmlDocument doc(pFilename); + bool loadOkay = doc.LoadFile(); + + if (loadOkay) + { + DEBUG5("Loading %s", pFilename); + searchMonsterMeshData(&doc); + DEBUG5("Loading %s finished", pFilename); + return m_monster_mesh_list; + } + else + { + DEBUG("Failed to load file %s", pFilename); + return 0; + } +} +
--- a/src/core/objectloader.h Fri Oct 03 10:53:18 2008 +0000 +++ b/src/core/objectloader.h Fri Oct 03 14:10:18 2008 +0000 @@ -12,6 +12,24 @@ #include <cstring> using namespace std; +/** + * \struct ItemMeshData + * \brief Enthaelt die Daten, die zum Laden des Meshs fuer ein Monster notwendig sind + */ +struct MonsterMeshData +{ + /** + * \var string m_subtype + * \brief Subtyp des Monsters + */ + string m_subtype; + + /** + * \var string m_mesh + * \brief Name des Meshes + */ + string m_mesh; +}; /** * \class ObjectLoader @@ -29,6 +47,13 @@ */ list<MonsterBasicData*>* loadObjects(const char* pFilename); + /** + * \fn void loadMonsterMeshData(const char* pFilename) + * \brief Sorgt fuer das Anlegen von MonsterMeshData, die in einer XML-Datei gespeichert sind + * \param pFilename Pfad zu einer XML-Datei, die Monster enthaelt + * \return Liste der geladenen Monster + */ + list<MonsterMeshData*>* loadMonsterMeshData(const char* pFilename); private: @@ -48,10 +73,29 @@ */ void searchXml(TiXmlNode* pParent); + /** + * \fn int generateMonsterMeshData(TiXmlElement* pElement, string element) + * \brief Legt ItemMonsterData im Speicher anhand von Daten an, die als Parameter uebergeben wurden. Diese Daten stammen aus einer XML-Datei. + * \param pElement Zeiger auf ein Element der XML-Datei + * \param element Name des Elements + * \return Anzahl der Attribute des bearbeiteten Elements + */ + int generateMonsterMeshData(TiXmlElement* pElement, string element); + + /** + * \fn void searchMonsterMeshData( TiXmlNode* pParent ) + * \brief Durchmustert eine XML-Datei und sucht nach Elementen. + * \param pParent Zeiger auf eine XML-Datei + */ + void searchMonsterMeshData(TiXmlNode* pParent); + MonsterBasicData* m_monster_data; list<MonsterBasicData*>* m_monster_list; + MonsterMeshData* m_monster_mesh_data; + list<MonsterMeshData*>* m_monster_mesh_list; + float m_size_prob[4]; int m_min_level[2]; int m_max_level[2];
--- a/src/gui/scene.cpp Fri Oct 03 10:53:18 2008 +0000 +++ b/src/gui/scene.cpp Fri Oct 03 14:10:18 2008 +0000 @@ -1,6 +1,6 @@ #include "scene.h" -#include "itemloader.h" +#define USE_OBJECTLOADER #define USE_ITEMLOADER Scene::Scene(Document* doc,Ogre::RenderWindow* window) @@ -56,7 +56,42 @@ registerObject("archer","warrior.mesh",""); // TODO // Monster +#ifdef USE_OBJECTLOADER + // Monster Meshes aus XML-Datei Laden + ObjectLoader* objectloader = 0; + objectloader = new ObjectLoader; + + list<MonsterMeshData*>* monster_mesh_list; + monster_mesh_list = objectloader->loadMonsterMeshData("../../data/monsters.xml"); + + if (monster_mesh_list != 0) + { + // Daten auslesen und registrieren + list<MonsterMeshData*>::iterator iter = monster_mesh_list->begin(); + while (iter != monster_mesh_list->end()) + { + registerObject((*iter)->m_subtype, (*iter)->m_mesh, ""); + *iter++; + } + + // Liste aus Speicher loeschen + iter = monster_mesh_list->begin(); + while (iter != monster_mesh_list->end()) + { + delete *iter; + *iter++; + } + } + + delete monster_mesh_list; + monster_mesh_list = 0; + delete objectloader; + objectloader = 0; +#endif + +#ifndef USE_OBJECTLOADER registerObject("goblin","goblin.mesh",""); +#endif registerObject("gob_dog","gobDog.mesh",""); registerObject("lich","lich.mesh","");
--- a/src/gui/scene.h Fri Oct 03 10:53:18 2008 +0000 +++ b/src/gui/scene.h Fri Oct 03 14:10:18 2008 +0000 @@ -5,6 +5,8 @@ #include "Ogre.h" #include <string> +#include "itemloader.h" +#include "objectloader.h" #include "document.h" #include "serverwobject.h" // TODO : include anpassen (es wird nur ein Spieler allgemein benoetigt)