staticinttolua_math2dx_luabinding_dist00(lua_State*tolua_S){tolua_Errortolua_err;if(!tolua_isnumber(tolua_S,1,0,&tolua_err)||!tolua_isnumber(tolua_S,2,0,&tolua_err)||!tolua_isnumber(tolua_S,3,0,&tolua_err)||!tolua_isnumber(tolua_S,4,0,&tolua_err)||!tolua_isnoobj(tolua_S,5,&tolua_err)){gototolua_lerror;}else{floatp1x=(float)tolua_tonumber(tolua_S,1,0);floatp1y=(float)tolua_tonumber(tolua_S,2,0);floatp2x=(float)tolua_tonumber(tolua_S,3,0);floatp2y=(float)tolua_tonumber(tolua_S,4,0);{floattolua_ret=dist(p1x,p1y,p2x,p2y);tolua_pushnumber(tolua_S,tolua_ret);}}return1;tolua_lerror:tolua_error(tolua_S,"#ferror in function 'dist'.",&tolua_err);return0;}
//CCHttpRequest:create()staticinttolua_cocos2dx_extension_network_CCHttpRequest_create00(lua_State*tolua_S){tolua_Errortolua_err;if(!tolua_isusertable(tolua_S,1,"CCHttpRequest",0,&tolua_err)||(tolua_isvaluenil(tolua_S,2,&tolua_err)||!toluafix_isfunction(tolua_S,2,"LUA_FUNCTION",0,&tolua_err))||!tolua_isstring(tolua_S,3,0,&tolua_err)||!tolua_isnumber(tolua_S,4,1,&tolua_err)||!tolua_isnoobj(tolua_S,5,&tolua_err)){gototolua_lerror;}else{LUA_FUNCTIONlistener=toluafix_ref_function(tolua_S,2,0);constchar*url=(constchar*)tolua_tostring(tolua_S,3,0);CCHttpRequestMethodmethod=(CCHttpRequestMethod)tolua_tonumber(tolua_S,4,CCHttpRequestMethodGET);{CCHttpRequest*tolua_ret=CCHttpRequest::create(listener,url,method);tolua_pushusertype(tolua_S,(void*)tolua_ret,"CCHttpRequest");}}return1;tolua_lerror:tolua_error(tolua_S,"#ferror in function 'create'.",&tolua_err);return0;}
PS: 个人认为将 C++ 对象视为一个 Lua module 时,那么类静态方法的调用方式应该是 CCHttpRequest.create() 这样,以便和实例方法区别开。
实例方法的导出区别不大,仅仅是需要检查 stack 中的第一个值是否是对象实例:
12345678910111213141516171819202122232425
//CCHttpRequest:start()staticinttolua_cocos2dx_extension_network_CCHttpRequest_start00(lua_State*tolua_S){tolua_Errortolua_err;if(!tolua_isusertype(tolua_S,1,"CCHttpRequest",0,&tolua_err)||!tolua_isboolean(tolua_S,2,1,&tolua_err)||!tolua_isnoobj(tolua_S,3,&tolua_err)){gototolua_lerror;}else{CCHttpRequest*self=(CCHttpRequest*)tolua_tousertype(tolua_S,1,0);if(!self){tolua_error(tolua_S,"invalid 'self' in function 'start'",NULL);}boolisCached=(bool)tolua_toboolean(tolua_S,2,false);self->start(isCached);}return0;tolua_lerror:tolua_error(tolua_S,"#ferror in function 'start'.",&tolua_err);return0;}
定义完所有要导出的方法后,tolua++ 目标文件将定义所有的模块并注册上述导出的方法。
~
注册模块和方法
对于 C 函数,会添加到 Lua 的全局名字空间中,而每一个 C++ 对象,则会注册一个与类名相同的 table,并添加到全局名字空间。