网上有很多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,-))//stack:...,_G,
{
register_all_game(L);
}
lua_pop(L, ); return ;
}

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

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

  1. cocos2dx v3.x lua绑定分析

    打算新项目转到cocos2dx v3上了,下载代码浏览过后发现改动真是非常大,结构性调整很多. 比如tolua绑定这一块,就几乎全翻新了. 胶水代码的生成,改成了全自动式的,通过clang来分析c++ ...

  2. 使用cocos2d脚本生成lua绑定

    这几天要老大要求把DragonBones移到cocos2dx 3.0 里边,并且绑定lua使用接口.因为刚学lua,使用的引擎也刚从2.2改为3.0,各种不熟悉,折腾了好几天才弄完,有空了总结一下 这 ...

  3. cocos2dx的lua绑定

    一.cocos2dx对tolua++绑定的修正 A.c对lua回调函数的引用 在使用cocos2dx编写游戏时,我们经常会设置一些回调函数(时钟.菜单选择等).如果采用脚本方式编写游戏的话,这些回调函 ...

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

    cococs2dx 3.13.1 + vs2013 + win10 1.首先按照<cocos2dx lua 绑定之一:自动绑定自定义类>绑定Student类 2.在Student类中增加一 ...

  5. cocos2dx之lua绑定简析

    一.总原则:c++对象的生命期不依赖lua gc管理,手动创建的对象要手动销毁 二.引擎层在设计上就是支持脚本概念的(也就是说脚本的使用是“侵入式”的),与lua打交道的代码都封在CCLuaEngin ...

  6. cocos2d-x lua绑定解析

    花了几天时间看了下cocos2d-x lua绑定那块,总算是基本搞明白了,下面分三部分解析lua绑定: 一.lua绑定主要用到的底层函数 lua绑定其本质就是有一个公用的lua_Stack来进行C和L ...

  7. cocos2dx lua 绑定之一:自动绑定自定义类中的函数

    cococs2dx 3.13.1 + vs2013 + win10 1.首先定义C++类Student 在cocos2d-x\cocos文件夹下新建一个user_define的文件夹放置两个文件. 注 ...

  8. quick-cocos2d-x 创建自定义lua绑定c++类

    内容主要参考 “在quick-cocos2d-x中添加自定义的类给lua使用” ( http://www.codeo4.cn/archives/746) 1. quick-coco2d-x 使用 to ...

  9. 开源基于lua gc管理c++对象的cocos2dx lua绑定方案

    cocos2dx目前lua对应的c++对象的生命周期管理,是基于c++析构函数的,也就是生命周期可能存在不一致,比如c++对象已经释放,而lua对象还存在,如果这时候再使用,会有宕机的风险,为此我开发 ...

随机推荐

  1. DataGridView实现分页

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; u ...

  2. 模拟请求之 HTTP_Request2

    简单安装: pear install HTTP_Request2 使用例子: <?php require_once 'HTTP/Request2.php'; $request = new HTT ...

  3. 推荐:PHPCMS v9 安全防范教程!

    一.目录权限设置很重要:可以有效防范黑客上传木马文件. 如果通过 chmod 644 * -R 的话,php文件就没有权限访问了. 如果通过chmod 755 * -R 的话,php文件的权限就高了. ...

  4. HDU 3749 Financial Crisis

    Financial Crisis 题意:给一个图,包含N ( 3 <= N <= 5000 )个点, M ( 0 <= M <= 10000 )条边 and Q ( 1 < ...

  5. Python 知识点

    1. generator #g is a generator and g is iterable g = (x*x for x in range(5)) for n in g: print(n) # ...

  6. python 读取SQLServer数据插入到MongoDB数据库中

    # -*- coding: utf-8 -*-import pyodbcimport osimport csvimport pymongofrom pymongo import ASCENDING, ...

  7. About Interface

      http://www.codeproject.com/Articles/18743/Interfaces-in-C-For-Beginners   Interface can't have thi ...

  8. MySql排序性能对比

  9. 年度十佳 DevOps 博客文章(前篇)

    如果说 15 年你还没有将 DevOps 真正应用起来,16 年再不实践也未免太落伍了.国内 ITOM 领军企业 OneAPM 工程师为您翻译整理了,2015 年十佳 DevOps 文章,究竟是不是深 ...

  10. 不改变中间层,如何玩转 .NET 的远程处理功能?

    原文链接: https://msdn.microsoft.com/enus/library/aa289846(v=vs.71).aspx Visual Studio .NET 2003 该方案展示了传 ...