以下实现方式基于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的格式。如果需要转为别的属性命名规范,请自行修改。
C++与Lua桥接
本文介绍了一种简化C++类与Lua交互的方法,通过使用tolua++并自定义属性类型,减少代码量并提高效率。
1454

被折叠的 条评论
为什么被折叠?



