要点一:C++解析ccb主要是这几个文件
CCBReader.h/cpp、CCNodeLoaderLibrary.cpp、CCNodeLoader.h/cpp等
CCBReader文件中的CCBReader::readNodeGraph方法是读取ccbi的节点(该方法应该看懂),该方法做的事有
/* Read class name. */
std::string className = this->readCachedString();
2.节点名字memberVarAssignmentName
// Read assignment type and name
int memberVarAssignmentType = this->readInt(false);
std::string memberVarAssignmentName;
if(memberVarAssignmentType != kCCBTargetTypeNone) {
memberVarAssignmentName = this->readCachedString();
}
3.解析节点属性
...
CCNodeLoader *ccNodeLoader = this->mCCNodeLoaderLibrary->getCCNodeLoader(className.c_str());
if (! ccNodeLoader)
{
CCLog("no corresponding node loader for %s", className.c_str());
returnNULL;
}
CCNode *node = ccNodeLoader->loadCCNode(pParent, this);
...
// Read properties
ccNodeLoader->parseProperties(node, pParent, this);
从上面3中可以得知mCCNodeLoaderLibrary为CCNodeLoaderLibrary.cpp类实例对象getCCNodeLoader(className.c_str())为获取对应的节点类型Loader实例对象。
要点二:把CCB原有控件及事件绑定到Lua中(CCControlButton)
在CCNode * CCBReader::readNodeGraph(CCNode * pParent)方法最后加上以下代码
//-------------------binding lua
if (memberVarAssignmentName != "") {
ZGLuaUtils::bindCCBAssign(memberVarAssignmentName.c_str(), className.c_str(), node);
}
//-------------------binding lua------end
我们看下C++中ZGLuaUtils类代码
void ZGLuaUtils::bindCCBAssign(constchar* assignmentName, constchar *className, CCNode* node) {
lua_State *L = ((CCLuaEngine*)CCScriptEngineManager::sharedManager()->getScriptEngine())->getLuaStack()->getLuaState();
lua_getglobal(L, "GF_setCCBBind");
/**//* Push PARAMETERS to STACK */
tolua_pushstring(L, assignmentName);
tolua_pushusertype(L, node, className);
/**//* Call FUNCTION in LUA */
int iError;
iError = lua_pcall(L, //VMach