• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

cocos2d-x3.0在C++中调用lua函数(2)

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

个人觉得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重新生成一下.像这样.

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
用VS2010编译LUA静态库发布时间:2022-07-22
下一篇:
redis命令和lua实现分布式锁发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap