cocos2dx-lua的spine局部换装

首先我要说的是,别纠结了,只能自己加

这里涉及到简单的lua-binding

项目->frameworks->cocos2d-x->cocos->scripting->lua-bindings->auto->lua_cocos2dx_spine_auto.cpp

这里对应的是c++的SkeletonRenderer.cpp的代码,顺便说一句:lua_cocos2dx_spine_manual.cpp对应的是SkeletonAnimation.cpp

还有就是cocos2dx_spine.ini文件中有段代码: skip = SkeletonRenderer::[findBone findSlot 等,貌似是跳过了SkeletonRenderer::findBone等方法,所以才在lua中掉用不了findBone。

-----1.lua_cocos2dx_spine_auto.cpp添加代码:

int lua_cocos2dx_spine_SkeletonRenderer_addSkin(lua_State* tolua_S)
{
    int argc = 0;
    spine::SkeletonRenderer* cobj = nullptr;
    bool ok  = true;
#if COCOS2D_DEBUG >= 1
    tolua_Error tolua_err;
#endif
    
#if COCOS2D_DEBUG >= 1
    if (!tolua_isusertype(tolua_S,1,"sp.SkeletonRenderer",0,&tolua_err)) goto tolua_lerror;
#endif
    cobj = (spine::SkeletonRenderer*)tolua_tousertype(tolua_S,1,0);
#if COCOS2D_DEBUG >= 1
    if (!cobj)
    {
        tolua_error(tolua_S,"invalid 'cobj' in function 'lua_cocos2dx_spine_SkeletonRenderer_addSkin'", nullptr);
        return 0;
    }
#endif
    argc = lua_gettop(tolua_S)-1;
    do{
        if (argc == 2) {
            const char* arg0;
            const char* arg1;
            std::string arg0_tmp; ok &= luaval_to_std_string(tolua_S, 2, &arg0_tmp, "sp.SkeletonRenderer:addSkin"); arg0 = arg0_tmp.c_str();
            std::string arg1_tmp; ok &= luaval_to_std_string(tolua_S, 3, &arg1_tmp, "sp.SkeletonRenderer:addSkin"); arg1 = arg1_tmp.c_str();


            if (!ok) { break; }
            bool ret = cobj->addSkin(arg0,arg1);
            tolua_pushboolean(tolua_S,(bool)ret);
            return 1;
        }
    }while(0);
    ok  = true;
    do{
        if (argc == 2) {
            std::string arg0;
            ok &= luaval_to_std_string(tolua_S, 2,&arg0, "sp.SkeletonRenderer:addSkin");
            std::string arg1;
            ok &= luaval_to_std_string(tolua_S, 2,&arg1, "sp.SkeletonRenderer:addSkin");


            if (!ok) { break; }
            bool ret = cobj->addSkin(arg0,arg1);
            tolua_pushboolean(tolua_S,(bool)ret);
            return 1;
        }
    }while(0);
    ok  = true;
    luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n",  "sp.SkeletonRenderer:addSkin",argc, 1);
    return 0;
    
#if COCOS2D_DEBUG >= 1
tolua_lerror:
    tolua_error(tolua_S,"#ferror in function 'lua_cocos2dx_spine_SkeletonRenderer_addSkin'.",&tolua_err);
#endif
    
    return 0;
}

------------

其中argc = lua_gettop(tolua_S)-1;以上的代码都是没用的,重点在do while中

            bool ret = cobj->addSkin(arg0,arg1);
            tolua_pushboolean(tolua_S,(bool)ret);

这两句是掉用了SkeletonRenderer的addSkin方法并返回。

两个do while的意思是SkeletonRenderer中有两个重载的addSkin方法,都要传入对应实参。

当然你们的SkeletonRenderer中并没有addSkin方法,需要添加,一会再说。

-----2.lua_cocos2dx_spine_auto.cpp中的lua_register_cocos2dx_spine_SkeletonRenderer添加代码:

tolua_function(tolua_S,"addSkin",lua_cocos2dx_spine_SkeletonRenderer_addSkin);

-----3.lua方面搞定,这里也大致完成了lua绑定到c++方法。

-----4.在SkeletonRenderer.cpp中添加代码:(.h自行解决)

bool SkeletonRenderer::addSkin (const std::string& skinName, const std::string& partName) {
    return spSkeleton_addSkinByName(_skeleton, skinName.empty() ? 0 : skinName.c_str(), partName.empty() ? 0 : skinName.c_str()) ? true : false;
}

bool SkeletonRenderer::addSkin (const char* skinName, const char* partName) {
    return spSkeleton_addSkinByName(_skeleton, skinName, partName) ? true : false;
}

-----5.Skeleton.c(editor-support->spine文件夹中)添加代码:(.h自行解决)

int spSkeleton_addSkinByName (spSkeleton* self,const char* skinName,const char* partName) {

    spSkin *skin;

    if (!skinName) {

        spSkeleton_setSkin(self,0);

        return 1;

    }

    skin = spSkeletonData_findSkin(self->data, skinName);

    if (!skin) return0;

    spSkeleton_addSkin(self, skin, partName);

    return 1;

}

void spSkeleton_addSkin (spSkeleton* self,spSkin* newSkin, constchar* partName) {

    if (newSkin) {

        int i;

        for (i = 0; i < self->slotsCount; ++i) {

            spSlot* slot = self->slots[i];

            if (slot->data->attachmentName) {

                if (strcmp(slot->data->attachmentName, partName) ==0) {

                    spAttachment* attachment =spSkin_getAttachment(newSkin, i, slot->data->attachmentName);

                    if (attachment) spSlot_setAttachment(slot, attachment);

                }

            }

        }


    }

}

------6.掉用

self.actor1 = sp.SkeletonAnimation:create("red_zuoqi.json", "red_zuoqi.atlas", 1)
self.actor1:setAnimation(0, "red_zuoqi_wait", true)
self.actor1:setScale(0.5)

self:addchild(self.actor1)

self.actor1:addSkin("weap_lv1", "weap")

------7.总结

1.中主要就是处理lua掉用c++代码的问题

2.至于c++代码的局部换装其实也是参考SkeletonRenderer.cpp中原有的addSkin方法,只不过多了一步if骨骼名字等于换装部位名字的判断。

------8.后续

至于具体的lua-binding原理及步骤还不是很了解,

像lua_cocos2dx_spine_auto.cpp何时加载并掉用,以及

lua_register_cocos2dx_spine_SkeletonRenderer方法中的各种tolua_function作用,慢慢研究下吧。lua-binding目前了解的还不是很透彻。


  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值