代碼用的是<cocos2d-x 3.0 在lua中調用自定義類>中的代碼.
在上篇的基礎上進行擴充.
寫lua函數

local function process_packet(user_data) if user_data then user_data = tolua.cast(user_data, "user_data"); print (user_data:uid()); print (user_data:uname()); end end local ghall = hall:get_singleton_ptr(); ScriptHandlerMgr:getInstance():registerScriptHandler(tolua.cast(ghall, "cc.Ref"), process_packet, cc.Handler.CALLFUNC);
在C++添加對此函數的調用

void hall::process_packet() { auto engine = cocos2d::LuaEngine::getInstance(); user_data ud("kukudi", 10001); cocos2d::BasicScriptData scriptdata(this, &ud); cocos2d::ScriptEvent eve(cocos2d::ScriptEventType::kCallFuncEvent, &scriptdata); engine->sendEvent(&eve); }
執行結果, 輸出1001 kukudi
我遇到一些問題在此記錄一下
1. user_data, 這個要傳到lua函數中的數據對象必須繼續自cocos2d::Ref類, (當然了, 繼續自Ref的子類也可以的), 否則程序會崩潰, 因為在int LuaEngine::handleCallFuncActionEvent(void* data)里面有這樣一句話:Ref* target = static_cast<Ref*>(basicScriptData->value);可以看出來, 它的父類必須是Ref類.
2. user_data, 想要直接使用成員對象是不行的, 我之前將成員對象設置成public, 想在腳本中直接對成員對象直接操作, 后來發現lua_hall_auto.cpp文件中根本沒有對這些成員對象進行轉換, 所以得把它封裝起來, 用成員函數對其成員對象進行操作.
3. 如果要調用多個腳本函數怎么辦呢? 我發現cc.Handler.CALLFUNC只能指定一個腳本函數, 再指定其它的腳本函數必須得用另一個handletype值, 還有就是這個cc.Handler.CALLFUNC這個對象的腳本函數只能使用一個參數或者不使用參數, 關於這方面的應用我還沒有研究很深, 就目前看來, 只能調用一個函數, 並且函數只能有一個參數, 這就夠用了, 在此lua函數中做分支來分派給其它的腳本函數來處理數據, 至於傳入到lua函數中的數據只要繼承自Ref這個類, 多寫幾個不同的對象也是可以的, 這個沒有什么大的問題;
4. 有一個比較困惑, int ScriptHandlerMgr::getObjectHandler(void* object,ScriptHandlerMgr::HandlerType handlerType)在這個函數, 每個lua_function對應一個唯一的handletype, 那為什么這個里面還要使用for循環來遍歷呢? 為什么不將handletype & lua_function作map映射呢?
5. 在lua中調用tolua.cast(obj, "hall"); 轉換成自定義的類型時會出現Cast name user_data doesn't include modular name which it belongs to,please add the modular name這樣的信息, 不用理它; 如果你跟蹤源代碼會發現像Ref這樣的類是這樣對應的Ref:cc.Ref, 我自己定義的類沒有這些模塊, 所以不用理它, 它也就是一個提示信息, 而已