之前一直用xml填配置, cocos2dx自带了xml解析接口, 非常方便.
但是, 接口好用也改变不了xml的结构字符太多, 书写麻烦, 乱七八糟的事实.
很早就想换lua, 无奈引擎没有现成接口, 也一直拖到今天.
inline ccValue parseTable(lua_State *lua) { ccValue value; ccValue result; lua_pushnil(lua); != lua_next(lua, -)) { )) { case LUA_TBOOLEAN: value = lua_toboolean(lua, -) != ; break; case LUA_TNUMBER: value = lua_tonumber(lua, -); break; case LUA_TSTRING: value = lua_tostring(lua, -); break; case LUA_TTABLE: value = parseTable(lua); break; default: CC_ASSERT(nullptr); break; } )) { if (result.isNull()) { result = ccValueVector(); } result.asValueVector().push_back(value); } else { if (result.isNull()) { result = ccValueMap(); } result.asValueMap().insert( std::make_pair(lua_tostring(lua, -), value)); } lua_pop(lua, ); } return result; }
ccValue getValueFromFile(const std::string &fileName) { auto luaCode = ccFileUtils::getInstance()->getStringFromFile(fileName); luaL_loadstring(_plua, luaCode.c_str()); auto ret = runCall(, ); CC_ASSERT(ret && lua_gettop(_plua) == ); auto result = parseTable(_plua); lua_pop(_plua, ); return result; }
数组用vector, 哈希用map.
这个实现很简单, 只支持number, string, table数据结构.
作为配置, 支持这些就足够了.