2014-09-17 5 views
0

Я пытаюсь сделать функцию в своем приложении, которая может загружаться в объект через атрибуты в XML-файле. Я хотел бы использовать TinyXML2, поскольку я слышал, что это довольно легко и быстро для игр.Проблемы с загрузкой данных из xml с помощью TinyXml2

В настоящее время у меня есть следующий XML-файл:

<?xml version="1.0" encoding="UTF-8"?> 
<Level> 
    <Pulsator starttime="0" type="0" higherradius="100" lowerradius="10" time="60" y="500" x="300" bpm="60"/> 
</Level> 

Каждый атрибут пульсатор переменной в моем классе пульсатора. Я использую функцию followign для импорта своих пульсаторов и добавляю их к вектору объектов.

void Game::LoadLevel(string filename) 
{ 
    tinyxml2::XMLDocument level; 
    level.LoadFile(filename.c_str()); 
    tinyxml2::XMLNode* root = level.FirstChild(); 
    tinyxml2::XMLNode* childNode = root->FirstChild(); 

    while (childNode) 
    { 
     Pulsator* tempPulse = new Pulsator(); 
     float bpm; 
     float type; 
     std::string::size_type sz; 

     tinyxml2::XMLElement* data = childNode->ToElement(); 
     string inputdata = data->Attribute("bpm"); 
     bpm = std::stof(inputdata, &sz); 

     if (type == 0) 
     { 
      tempPulse->type = Obstacle; 
      tempPulse->SetColor(D2D1::ColorF(D2D1::ColorF::Black)); 
     } 
     if (type == 1) 
     { 
      tempPulse->type = Enemy; 
      tempPulse->SetColor(D2D1::ColorF(D2D1::ColorF::Red)); 
     } 
     if (type == 2) 
     { 
      tempPulse->type = Score; 
      tempPulse->SetColor(D2D1::ColorF(D2D1::ColorF::Green)); 
     } 
     else 
     { 
      tempPulse->type = No_Type; 
     } 

     objects.push_back(tempPulse); 
    } 
} 

Каждый раз, когда я добираюсь до корневого узла, он загружается некорректно, а childnode становится нулевым. Я использую это неправильно или есть проблема с моим XML-файлом?

ответ

0

В коде неверно указан ребенок, которого он хочет. Вам нужен первый XMLElement, а не первый ребенок. Чтобы сделать это, используйте этот код, когда вы получаете childNode:

tinyxml2::XMLElement* childNode = root->FirstChildElement(); 

И это спасает Вас бросание позже. (Вам не нужно и не следует использовать ToElement()).

 Смежные вопросы

  • Нет связанных вопросов^_^