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

            亚洲国产成人久久综合一区77 | 少妇高潮惨叫久久久久久| 久久人人爽人人爽人人片AV东京热| 国产精品99久久久久久宅男| 久久综合精品国产一区二区三区| 色悠久久久久久久综合网| 午夜精品久久影院蜜桃| 久久亚洲精品国产精品婷婷| 狠狠色丁香婷婷久久综合不卡 | 色婷婷噜噜久久国产精品12p| 国内精品久久久久久久涩爱| 国内精品综合久久久40p| 久久综合综合久久97色| 欧美国产成人久久精品| 国产精品久久久久9999| 香蕉久久久久久狠狠色| 国内精品久久人妻互换| 欧美日韩精品久久久久| 久久免费高清视频| 亚洲欧美伊人久久综合一区二区 | 久久九九全国免费| 午夜精品久久久内射近拍高清| 国产高潮国产高潮久久久| 青春久久| 99久久国产亚洲高清观看2024| 亚洲日韩中文无码久久| 久久久久久亚洲精品影院| 一本久久久久久久| 国产成年无码久久久久毛片 | 欧美黑人又粗又大久久久| 伊人久久精品无码二区麻豆| 久久综合九色综合欧美就去吻| 国产精品免费久久久久电影网| 91精品国产乱码久久久久久| 精品久久久久久亚洲精品| 午夜精品久久久久久久| 亚洲精品无码久久久久sm| 亚洲AV无码久久精品狠狠爱浪潮 | 久久99精品国产麻豆婷婷| 99久久国产综合精品五月天喷水 | 精品久久久久久中文字幕人妻最新|