zoukankan      html  css  js  c++  java
  • 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重新生成一下.像这样.

  • 相关阅读:
    【Go语言系列】2.3、Go语言基本程序结构:变量及常量
    【Go语言系列】2.2、Go语言基本程序结构:关键字与标识符
    【Go语言系列】2.1、Go语言基本程序结构:注释
    【Go语言系列】第三方框架和库——GIN:快速入门
    【Go语言系列】第三方框架和库——GIN:GIN介绍
    【Go语言系列】1.4、GO语言简介:第一个Go语言程序
    【Go语言系列】1.3、GO语言简介:Go语言开发的知名项目
    【Go语言系列】1.2、GO语言简介:哪些大公司正在使用Go语言
    【Go语言系列】1.1、GO语言简介:什么是GO语言
    CentOS自行编译升级Git
  • 原文地址:https://www.cnblogs.com/emyueguang/p/3773054.html
Copyright © 2011-2022 走看看