cocos2dx解析lua table数据结构 简易版.

之前一直用xml填配置, cocos2dx自带了xml解析接口, 非常方便.

但是, 接口好用也改变不了xml的结构字符太多, 书写麻烦, 乱七八糟的事实.

很早就想换lua, 无奈引擎没有现成接口, 也一直拖到今天.

 1 inline ccValue parseTable(lua_State *lua)
 2 {
 3     ccValue value;
 4     ccValue result;
 5     lua_pushnil(lua);
 6     while (0 != lua_next(lua, -2))
 7     {
 8         switch (lua_type(lua, -1))
 9         {
10         case LUA_TBOOLEAN:
11             value = lua_toboolean(lua, -1) != 0;
12             break;
13         case LUA_TNUMBER:
14             value = lua_tonumber(lua, -1);
15             break;
16         case LUA_TSTRING:
17             value = lua_tostring(lua, -1);
18             break;
19         case LUA_TTABLE:
20             value = parseTable(lua);
21             break;
22         default:
23             CC_ASSERT(nullptr);
24             break;
25         }
26         if (lua_isnumber(lua, -2))
27         {
28             if (result.isNull())
29             {
30                 result = ccValueVector();
31             }
32             result.asValueVector().push_back(value);
33         }
34         else
35         {
36             if (result.isNull())
37             {
38                 result = ccValueMap();
39             }
40             result.asValueMap().insert(
41                 std::make_pair(lua_tostring(lua, -2), value));
42         }
43         lua_pop(lua, 1);
44     }
45     return result;
46 }
 1 ccValue getValueFromFile(const std::string &fileName)
 2 {
 3     auto luaCode = ccFileUtils::getInstance()->getStringFromFile(fileName);
 4     luaL_loadstring(_plua, luaCode.c_str());
 5     auto ret = runCall(0, 1);
 6     CC_ASSERT(ret && lua_gettop(_plua) == 1);
 7     auto result = parseTable(_plua);
 8     lua_pop(_plua, 1);
 9     return result;
10 }

数组用vector, 哈希用map.

这个实现很简单, 只支持number, string, table数据结构.

作为配置, 支持这些就足够了.

你可能感兴趣的:(cocos2dx解析lua table数据结构 简易版.)