青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

l

成都手游碼農一枚
隨筆 - 32, 文章 - 0, 評論 - 117, 引用 - 0
數據加載中……

[cocos2d-x]將ccb場景的plist文件轉換為lua的table格式。

//僅僅是一個練手,無實質性作用

#include "stdafx.h"

enum ValueType
{
    VT_NONE,
    VT_VALUE,    /* real integer true false  */
    VT_STRING, 
    VT_DICT,
    VT_ARRAY,
};

class CBaseValue
{
public:
    CBaseValue(ValueType vt)
        : m_eType(vt)
    {

    }

    virtual std::string toString() = 0;

    virtual ~CBaseValue()
    {
    }

protected:
    ValueType m_eType;
};

class CValue : public CBaseValue
{
public:
    CValue(const std::string& value)
        : CBaseValue(VT_VALUE)
        , m_sValue(value)
    {
    }

    std::string toString()
    {
        return m_sValue;
    }

protected:
    std::string m_sValue;
};

class CString : public CBaseValue
{
public:
    CString(const std::string& value)
        : CBaseValue(VT_STRING)
        , m_sValue("\"" + value + "\"")
    {
    }

    std::string toString()
    {
        return m_sValue;
    }

protected:
    std::string m_sValue;
};

class CArray : public CBaseValue
{
public:
    CArray(int depth = 0)
        : CBaseValue(VT_ARRAY)
        , m_nDepth(depth)
    {
    }

    ~CArray()
    {
        std::for_each(m_aValues.begin(), m_aValues.end(), [](CBaseValue* value)
        {
            delete value;
        });
    }

    void add(CBaseValue* value)
    {
        m_aValues.push_back(value);
    }

    std::string toString()
    {
        std::string prefix(m_nDepth, '\t');
        std::string text = "{\n";
        prefix.push_back('\t');
        std::for_each(m_aValues.begin(), m_aValues.end(), [&](CBaseValue* value)
        {
            text += prefix + value->toString() + ",\n";
        });
        prefix.pop_back();
        text += prefix + "}";

        return text;
    }

protected:
    int m_nDepth;
    std::vector<CBaseValue*>  m_aValues;
};

class CDict : public CBaseValue
{
public:
    CDict(int depth = 0)
        : CBaseValue(VT_DICT)
        , m_nDepth(depth)
    {
    }

    ~CDict()
    {
        std::for_each(m_mapValues.begin(), m_mapValues.end(), [](std::pair<std::string, CBaseValue*> keyValue)
        {
            delete keyValue.second;
        });
    }

    void add(const std::string& key, CBaseValue* value)
    {
        m_mapValues.insert(std::make_pair(key, value));
    }

    std::string toString()
    {
        std::string prefix(m_nDepth, '\t');
        std::string text = "{\n";
        prefix.push_back('\t');
        std::for_each(m_mapValues.begin(), m_mapValues.end(), [&](const std::pair<std::string, CBaseValue*> keyValue)
        {
            text += prefix + keyValue.first + " = ";
            text += keyValue.second->toString() + ",\n";
        });
        prefix.pop_back();
        text += prefix + "}";

        return text;
    }

protected:
    int m_nDepth;
    std::map<std::string, CBaseValue*>  m_mapValues;
};

CArray* parseArray(pugi::xml_node& node, int depth = 0);
CDict* parseDict(pugi::xml_node& node, int depth = 0);

CBaseValue* parseValue(pugi::xml_node& node, int depth = 0)
{
    std::string name = node.name();

    if (name == "real" || name == "integer")
    {
        return new CValue(node.text().get());
    }
    else if (name == "true")
    {
        return new CValue("true");
    }
    else if (name == "false")
    {
        return new CValue("false");
    }
    else if (name == "string")
    {
        return new CString(node.text().get());
    }
    else if (name == "array")
    {
        return parseArray(node, depth + 1);
    }
    else if (name == "dict")
    {
        return parseDict(node, depth + 1);
    }
    else
    {
        assert(false && "error type");
    }
    return NULL;
}

CArray* parseArray(pugi::xml_node& node, int depth)
{
    CArray* array = new CArray(depth);

    for (auto i = node.begin(); i != node.end(); )
    {
        /* value */
        assert(i != node.end());
        CBaseValue* value = parseValue(*i, depth);

        ++i;

        array->add(value);
    }

    return array;
}

CDict* parseDict(pugi::xml_node& node, int depth)
{
    CDict* dict = new CDict(depth);

    for (auto i = node.begin(); i != node.end(); )
    {
        /* key */
        assert(i->name() == std::string("key"));
        std::string key = std::string("[\"") + i->text().get() + "\"]";

        ++i;

        /* value */
        assert(i != node.end());
        CBaseValue* value = parseValue(*i, depth);

        ++i;

        dict->add(key, value);
    }

    return dict;
}

CDict* parseCCB(const std::string& filename)
{
    pugi::xml_document doc;

    if (doc.load_file(filename.c_str()))
    {
        auto plist = doc.child("plist");
        
        /* <plist> == <dict> */
        if (plist)
        {
            return parseDict(plist.child("dict"));
        }
    }

    return NULL;
}

bool ccbToLua(const std::string& filename, std::ostream& os = std::cout)
{
    CDict* dict = parseCCB(filename);
    if (dict)
    {
        os << "return" << std::endl;
        os << dict->toString() << std::endl;
        delete dict;
    }

    return false;
}

int _tmain(int argc, _TCHAR* argv[])
{
    std::ofstream os("test.out.lua");
    ccbToLua("test.ccb", os);
    os.close();
    return 0;
}

posted on 2013-07-01 23:55 l1989 閱讀(1358) 評論(0)  編輯 收藏 引用 所屬分類: C++ 、游戲

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美在线首页| 亚洲电影中文字幕| 欧美在线观看视频| 99精品视频免费在线观看| 国产精品爱啪在线线免费观看| 亚洲福利视频专区| 一区二区精品| 亚洲网友自拍| 99在线精品视频| 欧美亚洲一区二区在线观看| 亚洲人成网站777色婷婷| 国产精品久久久久久影院8一贰佰 国产精品久久久久久影视 | 亚洲免费一级电影| 国产亚洲成av人片在线观看桃| 欧美一区二区视频在线观看2020 | 久久精品视频在线播放| 国产一区二区福利| 亚洲高清资源| 国产在线拍偷自揄拍精品| 国产精品一区二区久久久久| 国产精品人成在线观看免费| 国产精品人人爽人人做我的可爱| 美日韩在线观看| 欧美日韩国产高清视频| 亚洲伊人伊色伊影伊综合网| 亚洲欧美视频一区| 亚洲综合日韩在线| 亚洲女人天堂av| 久久国产精品久久久| 欧美sm重口味系列视频在线观看| 欧美成人一品| 欧美成人精品影院| 国产欧美一区二区三区另类精品 | 亚洲国产精品一区二区尤物区| 精品成人a区在线观看| 99国产精品久久久| 久久亚裔精品欧美| 欧美黄色大片网站| 亚洲区一区二| 99国产精品99久久久久久粉嫩| 亚洲婷婷在线| 欧美亚洲一区三区| 国产欧美一区二区三区在线老狼 | 一区二区三区 在线观看视| 一区二区91| 久热精品视频| 久久精品国产免费看久久精品| 欧美日韩免费高清| 亚洲国产黄色片| 香港成人在线视频| 亚洲欧美日韩一区二区在线| 免费欧美日韩国产三级电影| 欧美—级a级欧美特级ar全黄| 亚洲精品国产品国语在线app| 久久精品1区| 日韩视频欧美视频| 欧美色欧美亚洲高清在线视频| 亚洲精品小视频| 一区二区三区在线观看国产| 欧美伊人久久久久久久久影院| 亚洲天堂偷拍| 亚洲欧美在线x视频| 国产精品久久久久国产精品日日 | 久久亚洲图片| 亚洲人成网站精品片在线观看 | 欧美1级日本1级| 日韩视频在线一区| 亚洲日产国产精品| 在线观看日韩国产| 亚洲国产福利在线| 国产精品成人一区二区网站软件| 中文在线不卡视频| 久久爱另类一区二区小说| 国产亚洲激情视频在线| 亚洲女ⅴideoshd黑人| 亚洲日本va午夜在线电影| 亚洲精品之草原avav久久| 激情成人av在线| 夜夜爽av福利精品导航 | 亚洲私人影院| 亚洲国产精品黑人久久久| 韩国一区二区三区美女美女秀| 亚洲美女黄色| 一本高清dvd不卡在线观看| 久久久精品五月天| 樱桃国产成人精品视频| 先锋资源久久| 久久久久国产精品厨房| 国产精品美女久久久| 亚洲综合色在线| 欧美亚洲第一区| 99热精品在线| 国产精品国产一区二区| 亚洲欧美三级在线| 亚洲一区二区在线播放| 国产一区二区日韩精品欧美精品| 亚洲网友自拍| 久久综合成人精品亚洲另类欧美| 国产一区三区三区| 嫩模写真一区二区三区三州| 激情综合色综合久久| 欧美激情一区二区三区四区| 一区二区三区产品免费精品久久75| 欧美成人综合网站| 日韩一级免费观看| 久久精品导航| 国产婷婷97碰碰久久人人蜜臀| 亚洲日韩欧美一区二区在线| 国产精品久久午夜夜伦鲁鲁| 美女黄色成人网| 亚洲婷婷综合久久一本伊一区| 国产视频久久网| 国产精品专区h在线观看| 亚洲免费电影在线| 久久综合九色综合久99| 国产欧美韩日| 国产精品无码永久免费888| 免费在线欧美视频| 亚洲国产导航| 欧美国产日韩一区二区在线观看| 久久成人精品一区二区三区| 亚洲激情二区| 影音国产精品| 狠狠色综合日日| 激情婷婷欧美| 激情久久中文字幕| 久久久99国产精品免费| 欧美一区二区三区在线| 亚洲在线一区| 欧美激情国产日韩精品一区18| 国产一区二区精品久久| 国产欧美91| 久久久久国产精品厨房| 亚洲国产高清自拍| 亚洲亚洲精品在线观看| 在线综合欧美| 国产精品国产三级国产 | 久久综合狠狠综合久久综合88 | 欧美日韩国产另类不卡| 免费不卡在线观看av| 美女尤物久久精品| 亚洲久久一区二区| 午夜精品福利在线观看| 欧美1区视频| 夜夜嗨av色综合久久久综合网 | 麻豆精品在线播放| 欧美精品手机在线| 国产综合精品一区| 夜夜爽99久久国产综合精品女不卡| 亚洲欧美日韩区| 欧美电影电视剧在线观看| 最新国产拍偷乱拍精品| 久久成人资源| 国产日韩欧美夫妻视频在线观看| 日韩天堂在线观看| 久久精品九九| 午夜激情综合网| 国产精品v日韩精品| 日韩一区二区高清| 欧美电影美腿模特1979在线看| 久久久久欧美| 亚洲激情一区二区三区| 欧美与欧洲交xxxx免费观看| 亚洲综合日韩在线| 韩国成人精品a∨在线观看| 亚洲一级二级| 亚洲欧美久久| 国产原创一区二区| 亚洲二区精品| 国产精品毛片在线| 欧美一区二区三区四区在线观看地址 | 欧美午夜片在线观看| 亚洲免费电影在线观看| 亚洲免费观看在线观看| 国产老肥熟一区二区三区| 久久精品二区三区| 久久女同精品一区二区| 亚洲一区二区三区免费观看| 亚洲一区二区三区在线| 曰韩精品一区二区| av成人毛片| 亚洲精品一区中文| 这里只有精品在线播放| 小嫩嫩精品导航| 亚洲精品免费一二三区| 久久久久久久欧美精品| 在线亚洲精品| 老司机免费视频一区二区三区| 亚洲综合日本| 国产精品久久久久久久久借妻| 欧美激情1区2区| 亚洲黄色有码视频| 老司机精品视频网站| 久久国产精品久久久久久电车| 欧美视频不卡| 一区二区三区四区五区精品视频| 亚洲精品综合| 欧美激情第六页| 欧美岛国在线观看| 亚洲国产欧美不卡在线观看|