Чтение CSV из файла TMX

Прежде всего, я не уверен, возникает ли проблема во время чтения или где-то еще, но когда я пытаюсь вывести значения в файл .txt (для отладки), некоторые значения записываются как значения мусора.

Я пытаюсь загрузить карту столкновений изометрической RPG. Вот что я делаю: сначала я удаляю все пробелы из CSV, а затем вызываю функцию анализа.

xml::Text t = data->GetText();
std::string::iterator it = std::remove(s.begin(), s.end(), ' ');
s.erase(it, s.end());
parseCSV(mapType, s);

В следующей части я пытаюсь разделить значения и прочитать их в соответствующих местах. Обратите внимание, что passabilityMap является экземпляром объекта Map2D, который принадлежит API, который я использую. Я думаю, что проблема не с этим классом, потому что я использовал его раньше без каких-либо проблем. Во время отладки я обнаружил, что значения Tile :: passable и т. Д. Являются правильными, а также содержимое потока, отправленного из вышеприведенного кода, также кажется правильным (без пробелов и совпадений с картой CSV)

Я конвертирую CSValue из 218 (равно Tile :: flyable) в 2 (Passability :: flyable)
С 219 (равно Tile :: nonPassable) до 0 (Passability :: nonPassable)
и от 0 (равно Tile :: passable) до 1 (Passability :: passable), чтобы было удобнее. Сначала я подумал, что может быть проблема при конвертации или несоответствии, но я не смог уловить ни одной ошибки в этой части.

if(mapType == "Collision")
{
x = y = 0;
while(std::getline(ss, ID, ','))
{
if(ID == Tile::passable)
passabilityMap(x, y) = Passability::Passable;

else if(ID == Tile::nonPassable)
passabilityMap(x, y) = Passability::NonPassable;

else if(ID == Tile::flyable)
passabilityMap(x, y) = Passability::Flyable;

if(x == passabilityMap.GetWidth() - 1)
x = 0;

if(y == passabilityMap.GetHeight() - 1)
{
y = 0;
x++;
}
y++;
}
}

и наконец я получаю вывод, чтобы проверить это с помощью следующего кода:

std::ofstream file("Tile Map.txt");
ss.str(std::string());
ss.clear();
for(int x = 0; x < passabilityMap.GetWidth(); x++)
{
for(int y = 0; y < passabilityMap.GetHeight(); y++)
{
ss << passabilityMap(x, y) << ",";
}
file << ss.str() << std::endl;
ss.str(std::string());
ss.clear();
}
file.close()

часть вывода .txt

0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-842150451,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-842150451,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-842150451,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-842150451,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-842150451,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,
.
.
.
-842150451,0,-842150451,-842150451,-842150451,-842150451,-842150451,-842150451,-842150451,-842150451,-842150451,-842150451,-842150451,-842150451,-842150451,-842150451,-842150451,-842150451,-842150451,-842150451,

Наконец, вот полный код парсинга

while(layer)
{
data = layer->FirstChildElement("data");
while(att)
{
std::string attName = att->Name();
if(attName == "name")
mapType = att->Value();

else if(attName == "width")
size.Width = stoi(att->Value());

else if(attName == "height")
size.Height = stoi(att->Value());

att = att->Next();
}

resize(mapType, size);
xml::Text t = data->GetText();
std::string s = t.ValueStr();
std::string::iterator it = std::remove(s.begin(), s.end(), ' ');
s.erase(it, s.end());
parseCSV(mapType, s);
layer = layer->NextSiblingElement("layer");
if(layer)
att = layer->FirstAttribute();
}

и структура XML

<map atts...>
<layer atts...>
<data atts...>
1,1,1...
</data>
</layer>
<layer atts...>
<data atts...>
1,1,1...
</data>
</layer>
</map>

Как видите, проблема возникает в начале каждой строки, кроме последней. значение мусора должно быть 0. Надеюсь, это не слишком много кода.

Заранее спасибо.

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]