1. 程式人生 > >使用Cocos2d-x的LuaBridge接入OC程式碼時需要注意的問題

使用Cocos2d-x的LuaBridge接入OC程式碼時需要注意的問題

在使用ios接入sdk時,通常需要呼叫本地的oc程式碼,對此,cocos提供了LuaBirdge來解決這一問題,總體來說,接入sdk需要三個需求:

1.lua層呼叫oc的本地函式
2.oc呼叫lua的上層函式
3.lua呼叫oc並傳入oc執行完需要回調的函式,並能正確執行回撥

第3個需求可以用1,2兩步來擴充套件,通常做法就是建立一個專用的回撥響應介面,該介面由oc呼叫lua層程式碼,傳入函式id以及函式引數。在使用時,lua傳遞給oc回撥函式的id,然後等待回撥介面回傳回來這個id,以及對應的引數。

現在LuaBridge提供了直接在oc裡索檢lua的全域性函式,直接呼叫的方法,大大簡化我們在上下層互動上的問題,但目前LuaBridge只提供了在oc中呼叫無引數的全域性函式的方法executeGlobalFunction(),我們對此進行擴充,新增一個string型別的引數,具體程式碼如下:

int LuaStack::executeGlobalFunctionWithString(const char* functionName, const char* data)
{
    lua_getglobal(_state, functionName);

    if (!lua_isfunction(_state, -1))
    {
        CCLOG("[LUA ERROR] name '%s' does not represent a Lua function", functionName);
        lua_pop(_state, 1);
        return 0;
    }

    pushString(data);
    int error = lua_pcall(_state, 1, 1, 0);


    if (error)
    {
        CCLOG("[LUA ERROR] %s", lua_tostring(_state, - 1));
        lua_pop(_state, 1); // clean error message
        return 0;
    }


    // get return value
    if (!lua_isnumber(_state, -1))
    {
        lua_pop(_state, 1);
        return 0;
    }


    int ret = lua_tointeger(_state, -1);
    lua_pop(_state, 1);
    return ret;
}

在互動中,採用以下策略:

1.lua層呼叫oc函式:

    傳入一個table,然後在oc層獲取的引數為一個dic,然後根據引數名,從字典中取到相應的引數。

2.oc層呼叫lua函式:

    先將引數組裝成json的字串,然後通過我們上面新增的executeGlobalFunctionWithString方法,將json串以一個string型別傳給lua程式碼,進行解析,然後獲得一個引數的table,從中取到相應的引數。

3.lua傳入oc進行回撥:

    這段回撥的對映邏輯在lua層實現,先將需要回調函式存放到一個table中和相應的函式id相關聯,然後把id傳給oc層,在oc中回撥這個函式的時候,呼叫回撥函式介面(就是呼叫lua中一個定義好的全域性靜態函式),傳入函式id,以及對應的引數,在回撥函式介面的方法中,通過查找回調函式的對映table,獲取到該回調函式,呼叫並傳入引數,完成回撥過程。