Работа с форматом .plist в Cocos2d-x

Формат Property list - родом с платформы MAC почитать что это за зверь можно здесь: developer.apple.com: Property list, здесь: plist(5) Mac OS X manual pages и здесь: developer.apple.com: Property List Programming Неплохая штука, но поддерживается Cocos2d-x не полностью, хотя и того что есть вполне хватит для работы.

Property list это XML-документ который имеет набор данных типы которых ограничены следующим множеством (в 3-й колонке поддержка Cocos2d-x):

Abstract type XML element Cocos2d-x класс
Array <array> cocos2d::Array
Dictionary <dict> cocos2d::Dictionary
String <string> cocos2d::String
Data <data> ---
Date <date> ---
Integer <integer> cocos2d::Integer
Float <real> cocos2d::Float
Boolean <true/> или <false/> cocos2d::Bool

Собственно видно, что не поддерживаются только типы Data и Date, но и без них можно жить.

Следующий код создаст файл data.plist

using namespace cocos2d;

...

const char * fileName = String::createWithFormat(
    "%s/data.plist", FileUtils::getInstance()->getWritablePath().c_str()
)->getCString();

auto rootDict = Dictionary::create();

rootDict->setObject(String::create("Vasiliy Petrovich"), "Name");
rootDict->setObject(Integer::create(55), "Age");
rootDict->setObject(Float::create(95.5), "Weight");
rootDict->setObject(Bool::create(false), "Married");
rootDict->setObject(Bool::create(true), "Sitizen");

auto children  = Array::create();

auto childDict = Dictionary::create();
childDict->setObject(String::create("Ivan"), "Name");
childDict->setObject(Integer::create(19), "Age");
children->addObject(childDict);

auto childDict2 = Dictionary::create();
childDict2->setObject(String::create("Katya"), "Name");
childDict2->setObject(Integer::create(23), "Age");
children->addObject(childDict2);

rootDict->setObject(children, "Children");  

bool ok = rootDict->writeToFile(fileName);

log("WRITE OK: %s %d", fileName, ok);

Созданный Файл data.plist:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"/>

<plist version="1.0">
    <dict>
        <key>Name</key>
        <string>Vasiliy Petrovich</string>

        <key>Age</key>
        <integer>55</integer>

        <key>Weight</key>
        <real>95.5000000</real>

        <key>Married</key>
        <false/>

        <key>Sitizen</key>
        <true/>

        <key>Children</key>
        <array>
            <dict>
                <key>Name</key>
                <string>Ivan</string>

                <key>Age</key>
                <integer>19</integer>
            </dict>

            <dict>
                <key>Name</key>
                <string>Katya</string>

                <key>Age</key>
                <integer>23</integer>
            </dict>
        </array>
    </dict>
</plist>

Следующий код прочитает этот файл:

const char * fileName = String::createWithFormat(
    "%s/data.plist", FileUtils::getInstance()->getWritablePath().c_str()
)->getCString();

auto dictData = Dictionary::createWithContentsOfFile(fileName);

log("Name: %s", dictData->valueForKey("Name")->getCString());
log("Age: %d", dictData->valueForKey("Age")->intValue());
log("Weight: %.2f", dictData->valueForKey("Weight")->floatValue());
log("Married: %d", dictData->valueForKey("Married")->boolValue());
log("Sitizen: %d", dictData->valueForKey("Sitizen")->boolValue());

log("Children:\n");
for (auto & item : *(static_cast<Array*>(dictData->objectForKey("Children"))) ) {
    auto dict = static_cast<Dictionary*>(item);
    log("\tName: %s", dict->valueForKey("Name")->getCString());
    log("\tAge: %d\n", dict->valueForKey("Age")->intValue());
}

выведет:

Name: Vasiliy Petrovich
Age: 55
Weight: 95.50
Married: 0
Sitizen: 1
Children:

    Name: Ivan
    Age: 19

    Name: Katya
    Age: 23

И напоследок видео от Sonar Systems "Cocos2d-x C++ - Writing To A PLIST":