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还是比较便利的,我们用coco 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__) */

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,未解决,还请指教)

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++类过程,希望对读者有用!

时间: 2024-09-30 19:13:20

Cocos2d-x v3.3 lua绑定c++类方法总结的相关文章

cocos2dx v3.x lua绑定分析

打算新项目转到cocos2dx v3上了,下载代码浏览过后发现改动真是非常大,结构性调整很多. 比如tolua绑定这一块,就几乎全翻新了. 胶水代码的生成,改成了全自动式的,通过clang来分析c++代码,可以准确的知道每一个类.函数.参数的信息,再也不用手动写pkg文件了. 运行期对象管理这块,似乎也有了不少改动,至少我原来的一些扩展代码运行不了了,还没来得及细看,待看完再一一录下. 先记录一下目前已看清楚的[类名表.类元表.对象实例]之间的关系: 1.类元表:最核心的表,在lua代码里是不可

使用cocos2d脚本生成lua绑定

这几天要老大要求把DragonBones移到cocos2dx 3.0 里边,并且绑定lua使用接口.因为刚学lua,使用的引擎也刚从2.2改为3.0,各种不熟悉,折腾了好几天才弄完,有空了总结一下 这篇先说一下cocos2d生成lua绑定的修改,有空的话再写一篇lua中注册回调到c++中方法 我的目录结构 假设我的目录名称是DragonBones -Cocosdx目录 -DragonBones  -c代码 -c代码头 -tools  db_DragonBones.ini genbindings.

cocos2dx lua 绑定之二:手动绑定自定义类中的函数

cococs2dx 3.13.1 + vs2013 + win10 1.首先按照<cocos2dx lua 绑定之一:自动绑定自定义类>绑定Student类 2.在Student类中增加一个用于测试手动绑定的函数manual_call ①Student.h中增加函数 //手动绑定调用函数 void manual_call(); ②Student.cpp中增加函数实现 //和自动绑定相比,只增加了这个函数 void Student::manual_call() { std::cout <&

Cocos2d-x3.0 lua绑定C++类

这里记录下我实现Lua绑定的全过程. 原文地址:http://blog.csdn.net/qqmcy/article/details/26099859 准备工作: 1.创一个一个Lua的2dx工程.(这个网上已经有好多了) 2.创一个C++类. TestScene.h  这个只是一个简单的场景 // // TestScene.h // uitestLua // // Created by 杜甲 on 14-5-17. // // #ifndef __uitestLua__TestScene__

【转】如何做dragonbones的lua绑定(VisualStudio)

原文:<如何做dragonbones的lua绑定(VisualStudio)>(不完善和错误的地方我已做红字修改) 最近好多同学在QQ群里问怎么在lua项目中使用DB(DrgonBones,龙骨),为了帮助更多的人,同时也好让更多的人跟容易使用DB,这里详细记录coco2dx-3.2版本对应DB的lua绑定. 首先要说明下,本文章对应的cocos2dx-3.2版本,其他cocos2dx-3.x版本跟3.2版本类似.这里假设自己使用cocos命令行创建的lua项目,而且没有修改过目录结构,如果修

【转】如何做dragonbones的lua绑定(Android)

这篇写dragonbones的lua绑定之Android部分,不知道怎么在VS(Visual Studio)中绑定的话请看如何在lua项目中使用dragonbones.有了上篇的基础,这次再做Android就比较简单了.注意:ndk9b不能编译通过,我这里使用的是ndk9d,其他版面没有测试. 修改 Application.mk 文件路径:MyLuaGame/frameworks/runtime-src/proj.android/jni/Application.mk 添加预定义宏 APP_CPP

如何做dragonbones的lua绑定(mac)

部分文件需要如何做dragonbones的lua绑定(VisualStudio) 支持 a. 将dragonbones(cocos2d_libs), lua_dragonbones_auto.cpp,lua_dragonbones_auto.hpp(cocos2d_lua_bindings/auto)添加到工程 b.  cocos2d_libs/project/Build Settings/Search Paths/User Header Search Paths增加 $(SRCROOT)/..

用LuaBridge为Lua绑定C/C++对象

最近为了总结Lua绑定C/C++对象的各种方法.第三方库和原理,学习了LuaBridge库为Lua绑定C/C++对象,下面是学习笔记,实质是对该库的Reference Manual基本上翻译了一遍,学习过程中测试代码,放在我的github上. LuaBridge的主要特点 源码只有头文件,没有.cpp文件,没有MakeFile,使用时只需一个#include即可. 支持不同的对象生命周期管理模式. 对Lua栈访问方便并且是类型安全的(type-safe). Automatic function

cocos2d-x lua绑定解析

花了几天时间看了下cocos2d-x lua绑定那块,总算是基本搞明白了,下面分三部分解析lua绑定: 一.lua绑定主要用到的底层函数 lua绑定其本质就是有一个公用的lua_Stack来进行C和Lua之间的值传递,在路径[项目根目录]\frameworks\cocos2d-x\external\lua\luajit\include下有个lua.h文件,大部分lua绑定底层函数以及相关的常量都在这里. 1.lua堆栈常量 #define LUA_REGISTRYINDEX (-10000) /