cocos2dx 3.xでActionTimeLineがsetLastFrameCallFuncのソリューションを使用できない

2602 ワード

CocosStudioはシーケンスフレーム機能3を導出.xその実用化はもう便利だ.しかし、多くの人が使用している間に、luaでシーケンスフレームコールバックsetLastFrameCallFuncが使用できないことに気づき、ネット上ではsetFrameEventCallFuncが処理するという人も多いが、このようなフレームごとにコールバックが明らかに頼りにならないし、筆者が使用している3.6でもActionTimelineがemitFrameEvent(実はこれはCCFrameでFrame::emitEventの実現)を呼び出していないことに気づき、コールバックも存在しない.
なぜsetLastFrameCallFuncが直接断言を投げ出すのか、ソースコードluaを見てみましょう.cocos2dx_studio_auto.cppはメソッドが実際に呼び出されていないことを発見することができる.
do {
   // Lambda binding for lua is not supported.
   assert(false);
  } while(0)

bindings-generatorが自動的に生成されると、lambda functionが関数として使用するパラメータはエクスポートできません(c++11のfunctionalもそうです).
解決策は簡単でlua_cocos2dx_coco_studio_manual.cppでsetLastFrameCallFuncを手動でエクスポートします.luaバインドがよく分からない子供靴は、setFrameEventCallFuncを手動でエクスポートする方法を参考にすることができます.
次に私のlua-bindingを貼って、必要なものがあれば持って行きます
static int lua_cocos2dx_studio_ActionTimeline_setLastFrameCallFunc(lua_State* L)
{
    if (nullptr == L)
        return 0;
    
    int argc = 0;
    cocostudio::timeline::ActionTimeline* self = nullptr;
    
#if COCOS2D_DEBUG >= 1
    tolua_Error tolua_err;
	if (!tolua_isusertype(L,1,"ccs.ActionTimeline",0,&tolua_err)) goto tolua_lerror;
#endif
    
    self = static_cast<:timeline::actiontimeline>(tolua_tousertype(L,1,0));
    
#if COCOS2D_DEBUG >= 1
	if (nullptr == self) {
		tolua_error(L,"invalid 'self' in function 'lua_cocos2dx_studio_ActionTimeline_setLastFrameCallFunc'
", NULL); return 0; } #endif argc = lua_gettop(L) - 1; if (1 == argc) { #if COCOS2D_DEBUG >= 1 if (!toluafix_isfunction(L,2,"LUA_FUNCTION",0,&tolua_err) ) { goto tolua_lerror; } #endif LUA_FUNCTION handler = ( toluafix_ref_function(L,2,0)); self->setLastFrameCallFunc([=](void){ LuaEngine::getInstance()->getLuaStack()->executeFunctionByHandler(handler, 0); }); return 0; } luaL_error(L, "'setLastFrameCallFunc' function of ActionTimeline has wrong number of arguments: %d, was expecting %d
", argc, 1); #if COCOS2D_DEBUG >= 1 tolua_lerror: tolua_error(L,"#ferror in function 'setLastFrameCallFunc'.",&tolua_err); #endif return 0; }

extendActionTimelineで追加メソッドのエクスポートを覚えています
tolua_function(L, "setLastFrameCallFunc", lua_cocos2dx_studio_ActionTimeline_setLastFrameCallFunc);

コンパイル後、コールバックが使用可能