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

            99久久精品影院老鸭窝| 久久久久国产精品嫩草影院| 精品久久久久久国产潘金莲| 国内精品久久久久久久97牛牛| av午夜福利一片免费看久久 | 精品久久久久久99人妻| 亚洲天堂久久久| 99久久精品无码一区二区毛片 | 亚洲综合伊人久久综合| 亚洲午夜久久久精品影院| 无码任你躁久久久久久老妇| 91精品国产综合久久久久久| 香港aa三级久久三级老师2021国产三级精品三级在 | 欧美牲交A欧牲交aⅴ久久| AA级片免费看视频久久| 久久久久国产精品人妻| 国产精品日韩深夜福利久久| 久久亚洲私人国产精品| 99久久做夜夜爱天天做精品| 久久精品不卡| 久久96国产精品久久久| 久久无码人妻一区二区三区午夜| 日产久久强奸免费的看| 国产999精品久久久久久| 久久久久99精品成人片直播| 国内精品久久国产| 久久久久久国产精品无码下载| 久久综合中文字幕| 久久精品国产一区| 久久精品国产亚洲网站| 久久精品国产一区| 91久久国产视频| 精品久久久久久无码中文野结衣 | 亚洲伊人久久精品影院| 久久精品人妻中文系列| 精品国产日韩久久亚洲| 久久久噜噜噜久久中文字幕色伊伊 | 亚洲国产精品久久久久婷婷老年 | 国产午夜精品久久久久九九电影| 久久青青草原国产精品免费 | 国产成人精品久久二区二区|