`
modabobo
  • 浏览: 508284 次
文章分类
社区版块
存档分类
最新评论

cocos2d-x LUA Binding实现C++里访问LUA的自定义对象

 
阅读更多

LUA Binding比JSBinding要简单,无论是使用脚本自动绑定还是手动写绑定代码,都能很轻松实现在LUA访问C++的类和对象。但如果想在C++里访问LUA里的自定义类和对象,则需要再自己修改一下C++的代码了。

应用场景:

1、 假设在LUA里有一个类MyLayer,继承了CCLayer,并添加了a,b,c,d这4个属性。

2、在LUA里,创建一个MyLayer的实例对象,并添加到当前的Scene中,然后通过Scene.getChildByTag方法拿出这个MyLayer的实例对象时,会发现自定义属性a,b,c,d都消失了,原因在于调用了toluafix_pushusertype_ccobject(tolua_S, nID, pLuaID, (void*)tolua_ret,"CCNode");返回的是一个CCNode,下面是LuaCocos2d.cpp里的代码

static int tolua_Cocos2d_CCNode_getChildByTag00(lua_State* tolua_S)
{
#ifndef TOLUA_RELEASE
 tolua_Error tolua_err;
 if (
     !tolua_isusertype(tolua_S,1,"CCNode",0,&tolua_err) ||
     !tolua_isnumber(tolua_S,2,0,&tolua_err) ||
     !tolua_isnoobj(tolua_S,3,&tolua_err)
 )
  goto tolua_lerror;
 else
#endif
 {
  CCNode* self = (CCNode*)  tolua_tousertype(tolua_S,1,0);
  int tag = ((int)  tolua_tonumber(tolua_S,2,0));
#ifndef TOLUA_RELEASE
  if (!self) tolua_error(tolua_S,"invalid 'self' in function 'getChildByTag'", NULL);
#endif
  {
   CCNode* tolua_ret = (CCNode*)  self->getChildByTag(tag);
    int nID = (tolua_ret) ? (int)tolua_ret->m_uID : -1;
    int* pLuaID = (tolua_ret) ? &tolua_ret->m_nLuaID : NULL;
    toluafix_pushusertype_ccobject(tolua_S, nID, pLuaID, (void*)tolua_ret,"CCNode");
  }
 }
 return 1;
#ifndef TOLUA_RELEASE
 tolua_lerror:
 tolua_error(tolua_S,"#ferror in function 'getChildByTag'.",&tolua_err);
 return 0;
#endif
}

3、 解决的方法很简单,说穿了一文不值,

a)、首先先调用tolua_usertype(tolua_S,"MyLayer");,注册自定义类,这句代码可以加在任何可以调用lua_State*这个指针的地方,但必须在初始化时只调用一次即可。

b)、将以下代码写在LuaCocos2d.cpp里,自己看着位置来放:

//扩展了getChildByTag,可以返回lua的对象,by lizc
/* method: getChildByTag of class  CCNode */
#ifndef TOLUA_DISABLE_tolua_Cocos2d_CCNode_getChildByTag01
static int tolua_Cocos2d_CCNode_getChildByTag01(lua_State* tolua_S)
{
#ifndef TOLUA_RELEASE
    tolua_Error tolua_err;
    if (
        !tolua_isusertype(tolua_S,1,"CCNode",0,&tolua_err) ||
        !tolua_isnumber(tolua_S,2,0,&tolua_err) ||
        (!tolua_isvaluenil(tolua_S,3,&tolua_err) && !tolua_isstring(tolua_S,3,0,&tolua_err)) ||
        !tolua_isnoobj(tolua_S,4,&tolua_err)
        )
        goto tolua_lerror;
    else
#endif
    {
        CCNode* self = (CCNode*)  tolua_tousertype(tolua_S,1,0);
        int tag = ((int)  tolua_tonumber(tolua_S,2,0));
        const char* userTypeName = ((const char*)  tolua_tostring(tolua_S,3,0));
#ifndef TOLUA_RELEASE
        if (!self) tolua_error(tolua_S,"invalid 'self' in function 'getChildByTag'", NULL);
#endif
        {
            CCNode* tolua_ret = (CCNode*)  self->getChildByTag(tag);
            int nID = (tolua_ret) ? (int)tolua_ret->m_uID : -1;
            int* pLuaID = (tolua_ret) ? &tolua_ret->m_nLuaID : NULL;
            toluafix_pushusertype_ccobject(tolua_S, nID, pLuaID, (void*)tolua_ret, userTypeName);
        }
    }
    return 1;
#ifndef TOLUA_RELEASE
tolua_lerror:
    return tolua_Cocos2d_CCNode_getChildByTag00(tolua_S);
#endif
}
#endif //#ifndef TOLUA_DISABLE

c)、再添加

tolua_function(tolua_S,"getChildByTag",tolua_Cocos2d_CCNode_getChildByTag01);到tolua_function(tolua_S,"getChildByTag",tolua_Cocos2d_CCNode_getChildByTag00);下面,方便管理。

4、 使用方法

--MyLayer必须继承自C++的某个类,这里就是继承CCLayer
local myLayer = MyLayer:create()
myLayer.a = 1
myLayer.b = 2
local scene = CCScene:create()
scene:addChild(myLayer, 0, 0)
myLayer = scene:getChildByTag(0, “MyLayer”)
myLayer = tolua.cast(myLayer, “MyLayer”)
cclog(“myLayer.a” .. myLayer.a)
cclog(“myLayer.b” .. myLayer.b)



分享到:
评论

相关推荐

    Cocos2d-x游戏编程——C++篇 .iso

    Cocos2d-x游戏编程——C++篇(电子工业出版社,徐飞 著)书本配套的光盘代码,

    Cocos2d-x实战:JS卷——Cocos2d-JS开发

    资源名称:Cocos2d-x实战:JS卷——Cocos2d-JS开发内容简介:本书是介绍Cocos2d-x游戏编程和开发技术书籍,介绍了使用Cocos2d-JS中核心类、瓦片地图、物理引擎、音乐音效、数据持久化、网络通信、性能优化、多平台...

    Cocos2d-x之C++和Lua通信5个入门Demo

    木头Cocos2d-x教程 Lua篇 Demo源代码。 教程地址: 第1章:http://blog.csdn.net/musicvs/article/details/8440707 第2章:http://blog.csdn.net/musicvs/article/details/8440919 第3章:...

    cocos2d-x+lua游戏demo源码

    cocos2d-x+lua游戏demo源码 xcode工程

    龙灵修-讲Lua的cocos2d-x进阶视频.rar

    cocos2d-x进阶教程1_1搭建和配置Lua开发环境.mp4 cocos2d-x进阶教程1_2编写自己的Lua版本的HelloWorld.mp4 cocos2d-x进阶教程1_3Lua语言的注释、变量、语句块.mp4 ...cocos2d-x进阶教程1_10在Lua中实现串行化.mp4

    shader cocos2d-x lua实现3D弧边搓牌效果

    shader编写,在lua层实现卡牌搓牌带3D弧边搓牌、翻牌效果。

    ShareSDK Android接入cocos2d-X lua文档

    ShareSDK Android接入cocos2d-X lua文档

    cocos2d-x-2.1.5

    cocos2d-x-2.1.5

    cocos2d-x事件类

    在使用cocos2d-x开发游戏的过程中,为了实现逻辑和显示相分离。 在下通宵了一个晚上,写出了该事件类。 谨记,该事件只能用于cocos2d-x中。 事件发送者需要继承EventDispatcher类 事件接收者需要继承EventHandle类...

    Cocos2d-x实战lua卷

    最新版的cocos2d-x实战 lua卷,分享给大家

    Cocos2d-Lua-社区:基于Cocos2d-x 4.0,打造易用稳定的Cocos2d-x lua引擎

    Cocos2d-Lua社区Cocos2d-Lua-Community是Cocos2d-x 4.0的改进,并且易于使用Lua游戏引擎。 它是与Quick-Cocos2dx-Community v3.7.x兼容的Lua“框架”。得到帮助 QQ群:社区版千人群(1群)号:361920466社区版2群:...

    关东升-Cocos2d-x实战:Lua卷

    《Cocos2d-x实战 Lua卷》是介绍Cocos2d-x Lua游戏编程和开发技术的书籍,本书是第1版,带完整书签

    Cocos2d-x高级开发教程

    Cocos2d-x是移动跨平台开发最流行的游戏引擎,而本书是一本很全面的、比较‘接地气’的游戏开发教程。书中汇聚了热门手机游戏《捕鱼达人》开发的实战经验,作者从最基础的内容开始,逐步深入地介绍了Cocos2d-x的相关...

    大富翁手机游戏开发实战基于Cocos2d-x3.2引擎

    资源名称:大富翁手机游戏开发实战基于Cocos2d-x3.2引擎内容简介:李德国编著的《大富翁手机游戏开发实战(基于 Cocos2d-x3.2引擎)》使用Cocos2d-x游戏引擎技术,带领读者一步一步从零开始进行大富翁移动游戏的开发...

    cocos2D-lua 核心编程内置代码

    coocs2d核心编程代码。。。lua。。游戏开发,包含各种核心编程第二版demo

    cocos2d-x-3.2旧版引擎下载

    cocos2d-x-3.2下载,不多说。或者可以下载另一个资源 cocos引擎老版本集合(cocos2d-x-2.2.1 - 3.5) http://download.csdn.net/download/crazymagicdc/9982656

    cocos2d-x实战项目

    cocos2d-x实战项目 01.cocos2d-x原理及环境配置.rar 03.cocostudio使用方法及UI控制.rar 04.XML文件读取与骨骼动画.rarcocos2d-x实战项目 01.cocos2d-x原理及环境配置.rar 03.cocostudio使用方法及UI控制.rar 04.XML...

    Cocos2D-X游戏开发技术精解.pdf

    《Cocos2D-X游戏开发技术精解》详细介绍如何使用Cocos2D-X引擎开发自己的移动平台游戏。全书共15章,主要内容包括:Cocos2D-X引擎简介;如何建立跨平台的开发环境;引擎的核心模块——渲染框架;如何实现动态画面和...

    Cocos2d-x之LUA脚本引擎深入分析

    Cocos2d-x之LUA脚本引擎深入分析

    Cocos2D-X游戏开发技术精解

    资源名称:Cocos2D-X游戏开发技术精解内容简介:Cocos2D-X是一款支持多平台的 2D手机游戏引擎,支持iOS、Android、BlackBerry等众多平台。当前,很多移动平台流行的游戏,都是基于Cocos2D-X开发的。 《Cocos2D-X...

Global site tag (gtag.js) - Google Analytics