青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

colorful

zc qq:1337220912

 

Lua注冊回調到C++

http://cn.cocos2d-x.org/tutorial/show?id=1896

思路

像所有語言一樣,綁定回調主要是執行的任務執行到特定情形的時候,調用對用回調方法。 本文也一樣,Lua注冊回調到C++的核心思路是,當C代碼執行到特定特定情形的時候,調用Lua的方法。

我這里使用的是用lua_stack直接調用lua的方法,沒有使用Cocos2d-x封裝的那個dispatcher,因為熟悉那個格式太墨跡了。


主要步驟如下

  • 緩存Lua函數在Lua環境中的引用

  • 在C代碼的地方用C的方式設置好回調

  • 在C代碼回調函數執行的時候,調用lua函數


實現

  • C代碼綁定回調,調用Lua函數

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
void ArmatureNode::registerMovementEventHandler(int handler)
{
    unregisterMovementEventHandler();  //移除之前注冊的監聽
    _movementHandler = handler;         //緩存lua函數的引用 這個后邊說
     
    auto dispatcher = getCCEventDispatcher();
     
    auto f = [this](cocos2d::EventCustom *event) //注冊c代碼形式的回調 這里用function做
    {
        auto eventData = (dragonBones::EventData*)(event->getUserData());
        auto type = (int) eventData->getType();
        auto movementId = eventData->animationState->name;
        auto lastState = eventData->armature->getAnimation()->getLastAnimationState();
         
        auto stack = cocos2d::LuaEngine::getInstance()->getLuaStack();
        stack->pushObject(this"db.ArmatureNode");
        stack->pushInt(type);
        stack->pushString(movementId.c_str(), movementId.size());        
        //通過LuaStack調用lua里的函數    最后一個參數設置參數個數
        stack->executeFunctionByHandler(_movementHandler, 3);
    };
     
    dispatcher->addCustomEventListener(dragonBones::EventData::COMPLETE, f);
}
void ArmatureNode::unregisterMovementEventHandler(void)
{
    if (0 != _movementHandler)
    {
        cocos2d::LuaEngine::getInstance()->removeScriptHandler(_movementHandler); //移除lua函數的綁定
        _movementHandler = 0;
    }
}
  • 提供Lua函數綁定到C的方法   

上邊的這個函數直接用cocos里的genbinding.py 是無法正確生成Lua里可調用的接口的,需要手動編寫綁定方法.

說這個得用到Cocos2d-x中提供的一個方法:toluafix_ref_function會把一個Lua棧中的方法轉成一個int,以便C++中調用。我會在最后面說這個

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int tolua_db_DBCCArmature_registerMovementEventHandler(lua_State* tolua_S)
{
    if (NULL == tolua_S)
        return 0;
    int argc = 0;
     
    dragonBones::ArmatureNode* self = nullptr;
    self = static_cast<dragonBones::ArmatureNode*>(tolua_tousertype(tolua_S,1,0)); //第一個參數 就是lua里的self
     
    argc = lua_gettop(tolua_S) - 1;
     
    if (1 == argc)
    {
        //第二個參數,就是Lua里的function 這里要通過toluafix_ref_function這個函數映射成一個Int值
        int handler = (toluafix_ref_function(tolua_S,2,0)); 
        self->registerMovementEventHandler(handler);
         
        return 0;
    }
    return 0;
}

 

  • 將綁定方法綁定到Lua環境里

1
2
3
4
5
6
7
8
9
10
11
12
13
14
int extends_ArmatureNode(lua_State* tolua_S)
{
    lua_pushstring(tolua_S, "db.ArmatureNode");//之前db.ArmatureNode是通過腳本綁定在lua里。這里只做擴展
    lua_rawget(tolua_S, LUA_REGISTRYINDEX);
    if (lua_istable(tolua_S,-1))
    {
        lua_pushstring(tolua_S,"registerMovementEventHandler");
        lua_pushcfunction(tolua_S,tolua_db_DBCCArmature_registerMovementEventHandler);
        lua_rawset(tolua_S,-3);
    }
     
    lua_pop(tolua_S, 1);
    return 0;
}
  • Lua里設置回調到C++

1
2
3
4
5
6
7
8
 local arm = db.ArmatureNode:create("Dragon")
    local animation = arm:getAnimation()
    animation:gotoAndPlay("walk")
    arm:registerMovementEventHandler(
        function(...)
            print(...) 
        end
    )


-測試

打印回調輸出,測試通過 userdata 8 walk


其他

  • toluafix_ref_function 以及 toluafix_get_function_by_refid

這 兩個方法是相互對應的 toluafix_ref_function這個方法在注冊表上將一個lua的function與一個function_id生成映射 toluafix_get_function_by_refid 方法可以通過前一個方法生成的function_id來講綁定的lua function放到棧頂

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//
TOLUA_API int toluafix_ref_function(lua_State* L, int lo, int def)
{
    if (!lua_isfunction(L, lo)) return 0;
    s_function_ref_id++;                            //function_id 加1
    lua_pushstring(L, TOLUA_REFID_FUNCTION_MAPPING);//在注冊表上,存放luafunction 映射table 的key壓棧
    lua_rawget(L, LUA_REGISTRYINDEX);               //獲取方法映射表,放在棧頂
    lua_pushinteger(L, s_function_ref_id);          //function_id壓棧
    lua_pushvalue(L, lo);                           //lo有效處索引處是lua方法,lua方法拷貝,壓棧
 
 
    lua_rawset(L, -3);                        //生成映射 
    lua_pop(L, 1);                                              
    return s_function_ref_id;
}
TOLUA_API void toluafix_get_function_by_refid(lua_State* L, int refid)
{
    lua_pushstring(L, TOLUA_REFID_FUNCTION_MAPPING);            //存放luafunction 映射table 的key壓棧
    lua_rawget(L, LUA_REGISTRYINDEX);                           //獲取方法映射表,放在棧頂
    lua_pushinteger(L, refid);                                  //function_id壓棧
    lua_rawget(L, -2);                                          //獲取到的luafunction 放到棧頂
    lua_remove(L, -2);                                          //
}
  • executeFunctionByHandler

executeFunctionByHandler 這個方法只是通過toluafix_get_function_by_refid 獲取到function然后通過lua_pcall 方法調用,代碼就不寫了。

posted on 2015-01-17 11:12 多彩人生 閱讀(2867) 評論(0)  編輯 收藏 引用 所屬分類: luaandroid cocos2dx

導航

統計

常用鏈接

留言簿(3)

隨筆分類

隨筆檔案

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            在线视频你懂得一区| 国内精品久久久久久久影视麻豆| 亚洲人成精品久久久久| 免费不卡亚洲欧美| 欧美3dxxxxhd| 亚洲激情中文1区| 亚洲大胆人体视频| 欧美电影专区| 亚洲日本电影| 亚洲美女黄网| 亚洲欧美精品伊人久久| 欧美中在线观看| 久久视频在线视频| 欧美精品性视频| 国产精品丝袜91| 尤妮丝一区二区裸体视频| 一区在线影院| 日韩亚洲国产精品| 欧美一区二区三区免费看| 久久亚洲精品视频| 最新日韩在线视频| 亚洲欧美日韩国产中文| 久久免费视频在线观看| 亚洲国产欧美一区二区三区同亚洲 | 欧美激情第一页xxx| 欧美福利网址| 国产精品性做久久久久久| 精东粉嫩av免费一区二区三区| 伊人婷婷久久| 亚洲香蕉在线观看| 久久综合九色欧美综合狠狠| 亚洲精品小视频| 亚洲欧美伊人| 欧美丰满高潮xxxx喷水动漫| 国产精品一区二区三区久久| 亚洲黄页一区| 欧美在线一二三| 亚洲乱码国产乱码精品精| 久久久久久久久久久久久女国产乱 | 欧美aa在线视频| 国产精品女主播| 亚洲精品乱码久久久久久蜜桃麻豆 | 国产精品久久久久久五月尺| 亚洲丶国产丶欧美一区二区三区| 亚洲曰本av电影| 亚洲丰满在线| 欧美亚洲综合另类| 国产精品麻豆成人av电影艾秋| 亚洲国产片色| 久久免费黄色| 欧美一区二区三区在线看 | 亚洲一区二区三区免费视频| 欧美国产日韩精品免费观看| 又紧又大又爽精品一区二区| 欧美在线日韩| 亚洲午夜电影| 欧美日韩一区三区四区| 亚洲片在线观看| 欧美18av| 久久人人97超碰国产公开结果| 国产精品资源| 欧美一区二区在线视频| 亚洲视频中文| 国产精品每日更新| 亚洲欧美99| 一区电影在线观看| 欧美日韩综合一区| 亚洲小说春色综合另类电影| 99精品热6080yy久久| 欧美日韩视频| 9l国产精品久久久久麻豆| 在线一区二区三区四区| 欧美三级在线| 亚洲亚洲精品在线观看| 日韩一区二区免费看| 欧美日精品一区视频| 亚洲欧美日韩在线观看a三区 | 国产一区三区三区| 久久久亚洲国产天美传媒修理工| 久久成人av少妇免费| 精品成人在线视频| 欧美黑人多人双交| 欧美日本不卡| 小黄鸭精品aⅴ导航网站入口| 亚洲永久在线| 欲香欲色天天天综合和网| 亚洲观看高清完整版在线观看| 美女精品在线观看| 亚洲视屏在线播放| 久久国产精品亚洲va麻豆| 亚洲黄页一区| 日韩性生活视频| 国产欧美一区视频| 欧美韩日一区| 国产精品久久久久久一区二区三区| 欧美亚洲午夜视频在线观看| 久久久精品国产免大香伊| 99国产精品久久久久久久| 亚洲婷婷免费| 在线观看日韩国产| 亚洲一区bb| 在线精品福利| 日韩午夜电影| 在线免费观看日本欧美| 在线中文字幕不卡| 亚洲国产成人在线| 亚洲一区二区少妇| 亚洲美女福利视频网站| 欧美在线播放| 亚洲天堂av综合网| 欧美视频在线观看免费网址| 亚洲免费伊人电影在线观看av| 午夜精品一区二区三区在线| 一区二区三区www| 猛男gaygay欧美视频| 欧美在线免费观看视频| 欧美午夜一区二区福利视频| 亚洲国产精品日韩| 欧美丝袜一区二区三区| 麻豆freexxxx性91精品| 国产伦精品免费视频| 一本久久青青| 亚洲乱码国产乱码精品精98午夜| 羞羞视频在线观看欧美| 性xx色xx综合久久久xx| 国产精品成人免费| 日韩午夜中文字幕| 亚洲天堂av综合网| 欧美交受高潮1| 亚洲日本电影| 宅男噜噜噜66一区二区66| 久久天天躁狠狠躁夜夜av| 亚洲天堂av在线免费观看| 一本大道av伊人久久综合| 久久亚洲高清| 欧美成人免费网| 尹人成人综合网| 久久婷婷国产综合国色天香| 久久综合成人精品亚洲另类欧美| 国产精品亚洲美女av网站| 亚洲天堂成人在线观看| 亚洲女与黑人做爰| 国产精品视频免费观看| 亚洲一区精彩视频| 篠田优中文在线播放第一区| 国产精品一区免费观看| 欧美一区二区三区精品| 久久久久久亚洲精品杨幂换脸 | 老司机精品视频一区二区三区| 久久激情综合网| 国产亚洲视频在线| 久久激情五月婷婷| 欧美高清视频在线| 一区二区三区波多野结衣在线观看| 欧美精品999| 亚洲摸下面视频| 久久久久九九九九| 亚洲国产精品一区二区第一页| 欧美二区乱c少妇| 日韩视频精品在线| 久久精品国产免费观看| 在线成人激情| 欧美精品在线视频观看| 亚洲综合不卡| 老鸭窝亚洲一区二区三区| 亚洲精品乱码久久久久久黑人 | 久久久夜夜夜| 亚洲精品在线观看免费| 久久er精品视频| 亚洲激情视频| 国产精品成人观看视频免费 | 亚洲欧美国产三级| 久久婷婷国产麻豆91天堂| 亚洲精品女人| 国产三级欧美三级| 欧美韩国日本一区| 午夜久久影院| 亚洲人体一区| 久久精品视频亚洲| 9l国产精品久久久久麻豆| 国产区日韩欧美| 欧美日韩成人综合天天影院| 欧美一区二区视频网站| 亚洲精品乱码| 久久在线视频| 国产一区二区三区四区| 欧美日韩视频免费播放| 久久资源av| 欧美一级久久久久久久大片| 国产亚洲精品激情久久| 狂野欧美性猛交xxxx巴西| 欧美在线视频导航| 一本久久综合| 亚洲成色777777在线观看影院| 中文国产成人精品| 欧美午夜性色大片在线观看| 亚洲一区二区三区乱码aⅴ蜜桃女| 亚洲精品中文在线| 欧美人成在线| 欧美成人一区二区三区在线观看|