• <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>

            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 閱讀(1335) 評論(0)  編輯 收藏 引用 所屬分類: C++游戲

            久久久久久久99精品免费观看| 久久精品一本到99热免费| 国产综合久久久久| 91久久精品91久久性色| 91精品国产高清久久久久久国产嫩草| 国产综合精品久久亚洲| 亚洲欧美日韩精品久久亚洲区| 亚洲AV日韩精品久久久久| 国产亚洲美女精品久久久久狼| 久久婷婷色综合一区二区| 久久精品国产免费观看| 99热热久久这里只有精品68| 伊人久久大香线蕉综合Av| 亚洲成色999久久网站| 99精品久久久久久久婷婷 | 久久精品国产福利国产琪琪| 久久久免费观成人影院| 99久久久国产精品免费无卡顿| 三级片免费观看久久| 久久久久久狠狠丁香| 久久久久亚洲AV无码永不| 久久亚洲高清综合| 久久精品这里热有精品| 久久婷婷色香五月综合激情| 久久线看观看精品香蕉国产| 精品久久久久久中文字幕大豆网| 久久久久国产日韩精品网站| 久久久久久久99精品免费观看| 亚洲AV日韩精品久久久久久| 久久丫忘忧草产品| 久久亚洲国产精品123区| 久久最近最新中文字幕大全| 九九久久自然熟的香蕉图片| 久久高潮一级毛片免费| 久久综合久久综合亚洲| 久久国产美女免费观看精品 | 国产成人综合久久久久久| 久久久久高潮毛片免费全部播放 | 国产精品久久久久jk制服| 久久久久久毛片免费播放| 亚洲精品蜜桃久久久久久|