zoukankan      html  css  js  c++  java
  • Cocos2d-x v3.3 lua绑定c++类方法总结

    网上有很多cocos2d-x lua绑定c++类的接口教程,这篇文章也是总结他们的经验。

    其中重点参考了 http://cn.cocos2d-x.org/tutorial/show?id=1295

    整个过程步骤很详细,会比较傻瓜式,希望对新手读者入门有用。 

    教程基本环境:

    1.使用引擎是v3.3 beta版本

    2.开发环境:OSX Yosemite 

    3. Cocos code IDE

    4. Xcode 6 

    1、在Mac上用Cocos code IDE 写lua还是比较便利的,我们用cocos code 新建一个工程,命名LuaBindingTest,选择Add Nativie Code(为什么选这个可以去了解一下),工程新建完成后打开运行。如没问题,我们进行下一步。

    2、用Xcode打开以上工程,选择ios 模拟器运行,第一次运行会有错误和异常问题,我们修改一下:在Xcode -》General,把Device Orientation的Portrait选项去掉(游戏一般横屏或竖屏),只保留Langscape Left/Right,修改AppDelegate.cpp的applicationDidFinishLaunching方法,注释掉 initRuntime() ,run,应该能看到画面了。

    3. xcode中,新建Class类(放在AppDelegate.cpp所在目录),命名MClass,打开cpp,我们随便加一些方法,MClass类执行绑定过程,并导出lua接口。

    MClass.h

    #ifndef __LUaBindingTest__MClass__

    #define __LUaBindingTest__MClass__

    #include <stdio.h>

    #include "cocos2d.h"

    using namespace cocos2d;

    class MClass : public Ref
    {
    public:
        bool init()
        {
            return true;
        }
        CREATE_FUNC(MClass);
        void doLog()
        {
            CCLOG("MClass 绑定成功!");
        }
    };

    #endif /* defined(__LUaBindingTest__MClass__) */

    关于上面的c++类,构造函数是必须写上的

    4.  回到工程的Finder下,打开以下这个目录,

    。。。 LuaBindingTest ▸ frameworks ▸ cocos2d-x ▸ tools ▸ tolua

     我们会看到很多ini文件和一个genbindings.py,ini是引擎模块的lua绑定配置,genbindings.py脚本会配置这些已存在的ini文件然后导出一个c++导出给lua的接口文件(hpp和cpp文件)。为了不干扰引擎现有的lua接口代码,我们依葫芦画瓢,配置一个我们自己项目用到的lua绑定接口。 拷贝 cocos2dx_spine.ini,重命名为game.ini ;拷贝genbindings.py,重命名为genbindings_game.py.  剩下的就是修改这两个文件。

    game.ini

    修改处:

    [game]
    
    prefix = game
    
    #target_namespace,有点命名空间的作用,我举个例子,cocos2dx.ini的这个参数是cc,所以在lua里面调用Director 需要在#前面cc,这个参数可有可无,但建议写了就不要修改,我们这里不写
    
    target_namespace =
    
    headers = %(cocosdir)s/../runtime-src/Classes/MClass.h
    
    classes = MClass 
    
    skip = 
    
    abstract_classes =

    genbindings_game.py

    只修改第129行

            cmd_args = {'game.ini' : ('game', 'lua_game_auto'),

                        }

     

    5.  终端,cd 到tolua目录,python genbindings_game.py。

      如果遇到错误,请阅读tolua目录下的 README.mdown文件,参照上面的方法解决(特别注意,需要的是NDK r9b)

     

    6. 上面过程运行成功后我们会得到两个文件 lua_game_auto.cpp 和lua_game_auto.hpp,

       回到Xcode,导入这两个文件,注意导入到 cocos2d_lua_bindings.xcodeproj库工程而不是项目工程!

        添加 cocos2d_lua_bindings.xcodeproj 的Header Search Paths.  (小技巧,五个..)

    7. 把我们的game模块注册进lua环境中,以往注册,我们需要在AppDelegate里面添加,v3.3之后,这些模块注册过程全部放到

    lua_module_register.h里面的lua_module_register 方法中

    ...
    //主要代码 #include
    "lua_game_auto.hpp" int lua_module_register(lua_State* L) { //Dont' change the module register order unless you know what your are doing register_cocosdenshion_module(L); register_network_module(L); register_cocosbuilder_module(L); register_cocostudio_module(L); register_ui_moudle(L); register_extension_module(L); register_spine_module(L); register_cocos3d_module(L); #if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS register_audioengine_module(L); #endif lua_getglobal(L, "_G"); if (lua_istable(L,-1))//stack:...,_G, { register_all_game(L); } lua_pop(L, 1); return 1; }

    8. 至此,MClass的绑定过程已完成,我们在main.lua 中测试一下

        local test = MClass:create()

        test:doLog()

      xcode 运行,看是否打印log,亲测是可以的。如果想在 cocos code运行,需要编译一次 ,工程右键 Cocos tools-》Build custom runtimes(笔者操作之后,Build提示成功,但运行提示MClass 为nil,未解决,还请指教)

    注意,如果要删除c++导出到lua的类对象,直接把引用赋为nil就会调用c++类的析构

    9.当然,我们一个项目不可能只写一个类导出给lua用,如何实现多个c++类导出给lua呢?过程也非常简单, 这里,我们可以参考引擎的做法如cocos2dx.ini,即把多个类配置到同一个ini文件中。

    为了避免需要在ini中引入多个c++头文件,我们新建一个lua_c_export.h文件,把需要绑定的类(自己完成这三个类的代码)的头文件include到这个头文件里,然后game.ini文件只配置这个lua_c_export.h的路径,这样可避免做多余修改,要知道配路径非常容易出错,如果多人协作,更容易混乱。可参考下面的图例

    game.ini

     终端,cd 到tolua目录,python genbindings_game.py。我们在lua文件 调用我们绑定的c++类,运行

    打印log,下图说明我们多个类绑定成功

    以上就是整个lua绑定c++类过程,希望对读者有用!

  • 相关阅读:
    #Git 21天打卡第一天 01天0526
    老徐第六期百人计划之职业发展方向&学习方向
    LR12.53安装中文补丁包,录制后回放脚本一致卡在编译的问题
    常用oracle语句整理
    LoadRunner11之批量插入SQL数据~2
    LoadRunner12之SQLServer数据库批量插入--.Net协议
    Jmeter连接Oracle数据库简单使用
    AppScan安装使用
    SQL多表连接
    [剑指Offer] 4.二维数组的查找
  • 原文地址:https://www.cnblogs.com/howeho/p/4043580.html
Copyright © 2011-2022 走看看