以下实现方式基于Quick-cocos2d-x 2.1.4,使用cocos2d-x版本的同学请自行修正。
C++数据类定义
class SHAccountData : public CCObject { CC_SYNTHESIZE(long long, _gameId, GameId); CC_SYNTHESIZE(int, _sessionId, SessionId); CC_SYNTHESIZE(int, _serverId, ServerId); public: SHAccountData() : _gameId(0L), _sessionId(0), _serverId(0) {} ~SHAccountData() {} };
以往,不知道 tolua_property 之前,我采用的笨办法来编写tolua描述文件
class SHAccountData : public CCObject { public: long long getGameId(); int getSessionId(); int getServerId(); void setGameId(long long var); void setSessionId(int var); void setServerId(int var); SHAccountData(); ~SHAccountData(); };
这才3个属性,从3行代码编程6行,工作量还OK。20个,100个属性呢?
认认真真地抽时间阅读了一遍《tolua++ reference manual》后,终于找到一条捷径。
新的tolua描述文件
class SHAccountData : public CCObject { public: tolua_property__java long long gameId; tolua_property__java int sessionId; tolua_property__java int serverId; SHAccountData(); ~SHAccountData(); };
这里用到了自定义的 Property types。
另外,注意 tolua_property__java,"property"和"java"之间是两个下划线,不是一个。
这时候,想要顺利编译的时候,需要修改 ${projectName}/luabinding/basic.lua (PS:每个人的目录结构不一样,请自行修正)。
-- usage: (use instead of ant) -- tolua++ "-L" "basic.lua" "-o" "../../scripting/lua/cocos2dx_support/LuaCocos2d.cpp" "Cocos2d.pkg" _is_functions = _is_functions or {} _to_functions = _to_functions or {} _push_functions = _push_functions or {} function get_property_methods_hook(ptype, name) name = name:gsub("^%l", string.upper) if ptype == "java" then return "get"..name, "set"..name end if ptype == "java_bool" then return "is"..name, "set"..name end -- etc end local CCObjectTypes = { "UnitManager", "GoObject", "GoObjectList", "GoMap", } -- register CCObject types for i = 1, #CCObjectTypes do _push_functions[CCObjectTypes[i]] = "toluafix_pushusertype_ccobject" end …………
get_property_methods_hook部分,是需要大家补充的。
由于我是从Java语言转到C++上的,所以习惯了JavaBean的格式。如果需要转为别的属性命名规范,请自行修改。