守望者--AIR技术交流

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
热搜: ANE FlasCC 炼金术
查看: 673|回复: 0

[技术资料] 2dx给Lua增加C接口的两种方式

[复制链接]
  • TA的每日心情
    擦汗
    2018-4-10 15:18
  • 签到天数: 447 天

    [LV.9]以坛为家II

    1742

    主题

    2094

    帖子

    13万

    积分

    超级版主

    Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18

    威望
    562
    贡献
    29
    金币
    51788
    钢镚
    1422

    开源英雄守望者

    发表于 2015-1-16 13:34:47 | 显示全部楼层 |阅读模式

    配置环境与工具: cocos2d-x-2.2.3,Lua5.1,tulua++,Xcode;

    测试工程: /cocos2d-x-2.2.3/samples/Lua/HelloLua

    • 官方接口的方式

    cocos2d-x的Lua binding中给Lua增加C++接口相信很多朋友都会,谷歌上的教程全部是往/scripting/lua/cocos2dx_support 和搭配往/tools/tolua++/cocos2dx.pkg增加PKG然后重新生成LuaCocos2d.cpp 的方式,但是这种方式不适合引擎的无缝升级,而且封闭性感觉不太好,如果能把项目的东西和引擎的东西完全脱离开 那是最好的,这样在更新 在升级版本上都非常容易,而且你看 LuaCocosd2d.cpp 都70000多行了..所以 我们应该把个人定制的C++接口完全和官方的独立开来.

    • 独立的接口增加方式

    首先当然还是把接口写好.

    新建文件夹:

    存放C++新增的接口文件夹 – cocos2d-x-2.2.3/scripting/lua/GameLuaAPI;

    用于生成Cpp文件的文件夹 – cocos2d-x-2.2.3/scripting/lua/GamePkg;

    增加C++接口类:

    于GameLuaAPI中gameluaapi.h

    1. <font color="rgb(51, 51, 51)">#ifndef __GAMELUAAPI_H_
    2. #define __GAMELUAAPI_H_

    3. #include "cocos2d.h"
    4. // 以下两行注释非常重要.
    5. //tolua++根据这两行注释来取 C++接口

    6. // tolua_begin
    7. void API_LuaSample();
    8. // tolua_end

    9. #endif //_GAMELUAAPI_H_</font>
    复制代码
    于GameLuaAPI中gameluaapi.cpp

    1. <font color="rgb(51, 51, 51)">#include "cocos2d.h"
    2. #include "cocos-ext.h"
    3. #include "../cocos2dx_support/CCLuaEngine.h"
    4. USING_NS_CC;
    5. // 加载LUA脚本
    6. void API_LuaSample()
    7. {
    8.     printf("API_LuaSample test c++");
    9. }</font>
    复制代码
    于GameLuaAPI文件夹中LuaRequireSample.h 这个文件是tulua++生成后的cpp文件配套的.不是必须 但是方面调用.

    1. <font color="rgb(51, 51, 51)">//
    2. //  LuaRequireSample.h
    3. //  HelloLua
    4. //
    5. //  Created by rect on 14-5-6.
    6. //
    7. //
    8. #ifndef HelloLua_LuaRequireSample_h
    9. #define HelloLua_LuaRequireSample_h

    10. #ifdef __cplusplus
    11. extern "C" {
    12. #endif
    13. #include "tolua++.h"
    14. #ifdef __cplusplus
    15. }
    16. #endif
    17. TOLUA_API int tolua_LuaMainAPI_open (lua_State* tolua_S);
    18. #endif
    19. </font>
    复制代码
    于GamePkg中LuaMainAPI.pkg 非常简单

    1. <font color="rgb(51, 51, 51)">typedef unsigned char       BYTE;
    2. typedef int                 BOOL;
    3. typedef unsigned long       DWORD;
    4. typedef unsigned short      WORD;
    5. typedef char*               LPSTR;
    6. typedef const char*         LPCSTR;
    7. $cfile "../GameLuaAPI/GameLuaAPI.h"</font>
    复制代码
    配置其他文件

    把tolua++配置到GamePkg文件夹里 部分文件在tools/tolua++中取,基本文件结构如下:GamePkg文件夹中:basic.lua,build.sh,luamainapi.pkg,tolua++ (除了pkg文件自己编写之外,其他文件都可以去引擎文件夹tools/tolua++取)build.sh命令修改如下:
    1. /tolua++ -L basic.lua -o "LuaRequireSample.cpp" LuaMainAPI.pkg
    复制代码
    这时候执行build.sh应该生成了LuaRequireSample.cpp文件GameLuaAPI文件夹中:gameluaapi.cpp,gameluaapi.h,LuaRequireSample.h

    修改CCLuaStack.cpp文件


    这个文件位于cocos2d-x-2.2.3/scripting/lua/cocos2dx_support;
    新引入头文件:
    1. #include "LuaRequireSample.h"
    复制代码
    修改函数init,其实就加一句代码
    1. bool CCLuaStack::init(void)
    2. {
    3.     //....
    4.     tolua_CocoStudio_open(m_state);
    5.    
    6.     //新加的一句代码
    7.     tolua_LuaMainAPI_open(m_state);
    8.    
    9.     #if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS || CC_TARGET_PLATFORM == CC_PLATFORM_MAC)
    10.     CCLuaObjcBridge::luaopen_luaoc(m_state);
    11. #endif
    12.     //.….
    13.     return true;
    14. }
    复制代码
    于是我们就可以优雅的调用C++接口了.例如我们的lua文件下调用API_LuaSample函数.这个函数只打印一句话:
    1. -- lua
    2. -- API_LuaSample
    3. function main(  )
    4.     API_LuaSample()
    5. end
    6. main()
    复制代码
    Sample代码托管在我的github
    • 特别注意
    gameluaapi.h中的两行注释// tolua_begin,// tolua_end 必须包在需要导出的C++接口函数之间,否则会无法生成响应的接口,这一点在tolua++中并没有限制,是cocos2dx加的东西.
    本文来自:http://shadowkong.com/archives/1716




    守望者AIR技术交流社区(www.airmyth.com)
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    
    关闭

    站长推荐上一条 /4 下一条

    QQ|手机版|Archiver|网站地图|小黑屋|守望者 ( 京ICP备14061876号

    GMT+8, 2019-11-18 11:33 , Processed in 0.047382 second(s), 37 queries .

    守望者AIR

    守望者AIR技术交流社区

    本站成立于 2014年12月31日

    快速回复 返回顶部 返回列表