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


個人覺得3.0里面, 在C++下面調用lua函數很不方便, 所以就擴展了一個類, 繼承自LuaStack, 代碼和使用方式如下:

#ifndef __CC_LUA_STACKEX_H_
#define __CC_LUA_STACKEX_H_

#include "CCLuaStack.h"

NS_CC_BEGIN

class LuaStackEx : public LuaStack
{
public:
    
    void call_script_fun(const char* fun)
    {
        executeGlobalFunction(fun);
    }

    template<typename... Args>
    void call_script_fun(const char* fun, Args... args)
    {
        lua_getglobal(_state, fun);       /* query function by name, stack: function */
        if (!lua_isfunction(_state, -1))
        {
            CCLOG("[LUA ERROR] name '%s' does not represent a Lua function", fun);
            lua_pop(_state, 1);
            return;
        }

        int args_amount = 0;
        split_args(args_amount, args...);
        executeFunction(args_amount);
    }

protected:
    template<typename T>
    void split_args(int &args_amount, T data)
    {
        push_data(data);
        args_amount++;
    }

    template<typename T, typename... Args>
    void split_args(int &args_amount, T data, Args... args)
    {        
        push_data(data);
        args_amount++;
        split_args(args_amount, args...);
    }

protected:
    template<typename T>
    void push_data(T data)
    {
        CCLOG("存在未定義類型的數據, 無法傳參到lua腳本.");
    }

    template<> void push_data(int data) { pushInt(data); }
    template<> void push_data(long data) { pushLong(data); }
    template<> void push_data(float data) { pushFloat(data); }
    template<> void push_data(std::string str) { pushString(str.c_str()); }
    template<> void push_data(const std::string& str) { pushString(str.c_str()); }
    template<> void push_data(const char* str) { pushString(str); }
    template<> void push_data(bool data) { pushBoolean(data); }
    // 用戶數據, 傳指針
    template<> void push_data(void* udata) { lua_pushlightuserdata(_state, udata); }
};

NS_CC_END

#endif // __CC_LUA_STACKEX_H_
View Code
#include "CCLuaStackEx.h"
View Code

下面是使用方式:

    cocos2d::LuaStackEx*    luaStack = static_cast<cocos2d::LuaStackEx*>(cocos2d::LuaEngine::getInstance()->getLuaStack());
    luaStack->call_script_fun("common_progrss_message", "kukudi", 27, std::string("man"));
View Code

其實就是把cocos2d::LuaEngine::getInstance()->getLuaStack()獲取到的LuaStack指針強行改成它的子類LuaStackEx的指針, 然后用這個指針來調用我寫的一些方法, 但是它的內部創建的還是LuaStack對象,  而且我也沒有改成創建LuaStackEx對象, 因為LuaStackEx這個自定義類中沒有定義自己的數據成員, 用到的數據成員都是基類的! 嘿嘿.

當然了,  這個僅限於自己使用, 有一些缺點,  比如不能獲取lua函數的返回值, 我也沒這個需求.

還有就是要注意一點,  傳入自己定義的數據對象時要取它的地址! 轉換成void*, 然后在lua中再改成相關對象使用. 如果是同步對象直接取地址調用沒問題, 如果是異步調用的話, 那就要new出對象, 把地址傳進去,  這些東東已經不屬於使用這個擴展類要注意的事項啦!

好啦, 這回真正的方便使用了, 呵呵

對了, 要把這兩個文件放到工程liblua下面, 把liblua重新生成一下.像這樣.

 


免責聲明!

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



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