• <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久久久国产精品~~牛| 久久久午夜精品| 超级碰久久免费公开视频| 狠狠久久综合伊人不卡| 久久久精品国产免大香伊| 国产精品美女久久久久久2018| 国产视频久久| 久久精品国产第一区二区三区| 国产A级毛片久久久精品毛片| 色老头网站久久网| 国产福利电影一区二区三区久久久久成人精品综合 | 最新久久免费视频| 精品久久香蕉国产线看观看亚洲| 久久久久亚洲AV无码专区网站| 亚洲精品无码成人片久久| 国产一区二区三精品久久久无广告 | 综合久久国产九一剧情麻豆| 狠狠色丁香婷婷综合久久来| 狠狠色综合网站久久久久久久高清 | 久久精品国产清自在天天线| 狠狠色丁香久久婷婷综合五月| 囯产极品美女高潮无套久久久| 久久精品国产亚洲一区二区三区| 久久亚洲美女精品国产精品| 久久久久久久女国产乱让韩| 久久久久香蕉视频| 色成年激情久久综合| 久久精品成人国产午夜| 久久狠狠色狠狠色综合| 国产高潮国产高潮久久久| 久久夜色精品国产网站| 亚洲国产精品一区二区久久hs| 久久久久se色偷偷亚洲精品av| 亚洲精品综合久久| 久久无码高潮喷水| 区久久AAA片69亚洲| 久久精品国产亚洲AV影院| 国产精品久久久久久久久久影院| 久久综合九色综合网站| 亚洲中文字幕无码久久精品1 | 久久狠狠色狠狠色综合|