cocos2d-x 3.0 在C++中調用lua函數


代碼用的是<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);
View Code

在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);
}
View Code

執行結果, 輸出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, 我自己定義的類沒有這些模塊, 所以不用理它, 它也就是一個提示信息, 而已


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM