lua绑定

1.通过 genbindings.py 绑定

coco2d-x3.10

1.根据 README 选择对应的 NDK

android-ndk-r10c

2.出错找不到libclang

  1. ./frameworks/cocos2d-x/tools/bindings-generator/clang/cindex.py
    第 3395 行改为 : library = cdll.LoadLibrary(“../bindings-generator/libclang/” + self.get_filename())

3.修改 .ini 文件

复制 cocos2dx_controller.ini 修改文件名 cocos2dx_test.ini
修改文件内容:
1. 第一行 [cocos2dx_test]
2. prefix = cocos2dx_test
3. target_namespace = cc 如果没有 target_namespace = 即可,有通过 cc.ClassName 调用
4. headers = %(cocosdir)s/../runtime-src/Classes/ClassName.h %(cocosdir)s/../runtime-src/Classes/ClassName2.h
5. classes = ClassName ClassName2

4.修改 genbindings.py

复制 genbindings.py 修改文件名 genbindings_test.py
修改:cmd_args = {‘cocos2dx_test.ini’ : (‘cocos2dx_test’, ‘lua_cocos2dx_test_auto’), \
}

2.自动绑定

1.通过源码查看 lua 的 api

XMLHttpRequest 为例

1.属性

赋值 xhr.timeout = 10、取值 xhr.timeout
tolua_variable(L, “timeout”, lua_get_XMLHttpRequest_timeout, lua_set_XMLHttpRequest_timeout);
只能取值
tolua_variable(L, “timeout”, lua_get_XMLHttpRequest_timeout, nullptr);

2.函数

xhr:open()
tolua_function(L, “open”, lua_cocos2dx_XMLHttpRequest_open);

3.查看参数个数

  1. lua 通过 send 方法调用 xhr:send() 或 xhr:send(“参数”) lua文件
  2. 执行 lua_cocos2dx_XMLHttpRequest_send 自动生成cpp文件
  3. if ( 1 == argc ) 判断如果有一个参数,没有参数执行下面的 自动生成cpp文件
  4. 通过 LuaMinXmlHttpRequest 对象调用此类里的方法 自己写的cpp文件
static int lua_cocos2dx_XMLHttpRequest_send(lua_State* L)
{
    int argc = 0;
    LuaMinXmlHttpRequest* self = nullptr;
    //std::string data = "";
    const char* data = NULL;
    size_t size = 0;

#if COCOS2D_DEBUG >= 1
    tolua_Error tolua_err;
    if (!tolua_isusertype(L,1,"cc.XMLHttpRequest",0,&tolua_err)) goto tolua_lerror;
#endif

    self = (LuaMinXmlHttpRequest*)  tolua_tousertype(L,1,0);
#if COCOS2D_DEBUG >= 1
    if (nullptr == self)
    {
        tolua_error(L,"invalid 'self' in function 'lua_cocos2dx_XMLHttpRequest_send'\n", nullptr);
        return 0;
    }
#endif
    self->getHttpHeader().clear();
    self->setErrorFlag(false);

    argc = lua_gettop(L) - 1;

    if ( 1 == argc )
    {
#if COCOS2D_DEBUG >= 1
        if (!tolua_isstring(L, 2, 0, &tolua_err))
            goto tolua_lerror;
#endif
        //data = tolua_tostring(L, 2, "");
        data = (const char*) lua_tolstring(L, 2, &size);
    }

    if (size > 0 &&
        (self->getMethod().compare("post") == 0 || self->getMethod().compare("POST") == 0
         || self->getMethod().compare("put") == 0 || self->getMethod().compare("PUT") == 0 )&&
        nullptr != self->getHttpRequest())
    {
        self->getHttpRequest()->setRequestData(data,size);
    }

    self->_setHttpRequestHeader();
    self->_sendRequest();
    return 0;

#if COCOS2D_DEBUG >= 1
tolua_lerror:
    tolua_error(L,"#ferror in function 'lua_cocos2dx_XMLHttpRequest_send'.",&tolua_err);
    return 0;
#endif
}

3.自动绑定回调函数

找到 lua_cocos2d-x_manual.cpp 文件,

1.先要注册

把MenuItem替换成你要绑定的类 MyClass
1. MenuItem* cobj = nullptr;
2. if (!tolua_isusertype(tolua_S,1,”cc.MenuItem”,0,&tolua_err)) goto tolua_lerror;
3. cobj = static_cast

static int tolua_cocos2d_MenuItem_registerScriptTapHandler(lua_State* tolua_S)
{
    if (NULL == tolua_S)
        return 0;

    int argc = 0;
    MenuItem* cobj = nullptr;
#if COCOS2D_DEBUG >= 1
    tolua_Error tolua_err;
    if (!tolua_isusertype(tolua_S,1,"cc.MenuItem",0,&tolua_err)) goto tolua_lerror;
#endif
    cobj = static_cast<cocos2d::MenuItemImage*>(tolua_tousertype(tolua_S,1,0));
#if COCOS2D_DEBUG >= 1
    if (nullptr == cobj) {
        tolua_error(tolua_S,"invalid 'cobj' in function 'tolua_cocos2d_MenuItem_registerScriptTapHandler'\n", NULL);
        return 0;
    }
#endif
    argc = lua_gettop(tolua_S) - 1;
    if (1 == argc)
    {
#if COCOS2D_DEBUG >= 1
        if (!toluafix_isfunction(tolua_S,2,"LUA_FUNCTION",0,&tolua_err)) {
            goto tolua_lerror;
        }
#endif
        LUA_FUNCTION handler = toluafix_ref_function(tolua_S,2,0);
        ScriptHandlerMgr::getInstance()->addObjectHandler((void*)cobj, handler, ScriptHandlerMgr::HandlerType::MENU_CLICKED);
        return 0;
    }

    luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n", "cc.MenuItem:registerScriptTapHandler",argc, 1);
    return 0;

#if COCOS2D_DEBUG >= 1
tolua_lerror:
    tolua_error(tolua_S,"#ferror in function 'tolua_cocos2d_MenuItem_registerScriptTapHandler'.",&tolua_err);
    return 0;
#endif
}

2.回调注册的函数

LuaEngine::getInstance()->getLuaStack()->pushString(backTag.c_str());
LuaEngine::getInstance()->getLuaStack()->executeFunctionByHandler("回调对象", 参数个数);
LuaEngine::getInstance()->getLuaStack()->clean();

//移除注册函数
ScriptHandlerMgr::getInstance()->removeObjectHandler("回调对象", ScriptHandlerMgr::HandlerType::MENU_CLICKED);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值