天天看点

将一个spine的骨骼绑定到另一个spine的骨骼上

改源码,如下:

-----1.BoneData.h文件(editor-support->spine文件夹下 )

将struct spBoneData{}中的spBoneData* const parent;的const取掉

-----2.Bone.h文件(editor-support->spine文件夹下)

将struct spBone{}中的spBone* const parent;的const取掉

-----3.Skeleton.h文件(editor-support->spine文件夹下)

增加方法

void spSkeleton_changeBone(spSkeleton* skeleton, spSkeleton* goleSkeleton, const char* boneName1, const char* boneName2);

//skeleton:要绑定的目标spSkeleton

//goleSkeleton:要绑定的目标spSkeleton

//boneName1:被绑定的目标骨骼名字

//boneName2:要绑定的目标骨骼名字

-----4.Skeleton.c文件(editor-support->spine文件夹下)

上述方法的实现

void spSkeleton_changeBone(spSkeleton* skeleton, spSkeleton* goleSkeleton, const char* boneName1, const char* boneName2)

{

    spBone* bone1;

    spBone* bone2;

    for (int i = 0; i < skeleton->bonesCount; i++)

    {

        if (!strcmp(skeleton->bones[i]->data->name, boneName1))

        {

            bone1 = skeleton->bones[i];

        }

    }

    for (int i = 0; i < goleSkeleton->bonesCount; i++)

    {

        if (!strcmp(goleSkeleton->bones[i]->data->name, boneName2))

        {

            bone2 = goleSkeleton->bones[i];

        }

    }

    bone2->data->parent = bone1->data;//1.的原因 因为const不能修改 或者你可以保留const然后*bone2来赋值

    bone2->parent = bone1;//2.的原因 因为const不能修改 或者你可以保留const然后*bone2来赋值

}

-----5.SkeletonRenderer.h文件(editor-support->spine文件夹下)

增加方法

void changeBone(spSkeleton* goleSkeleton, const char* name1, const char* name2);

-----6.SkeletonRenderer.cpp文件 (editor-support->spine文件夹下)

上述方法实现

void SkeletonRenderer::changeBone(spSkeleton* goleSkeleton, const char* name1, const char* name2)

{

    spSkeleton_changeBone(_skeleton, goleSkeleton, name1, name2);

}

-----7.使用

auto jianchihu = spine::SkeletonAnimation::createWithFile("monster_jianchihu1.json", "monster_jianchihu1.atlas",1);

jianchihu->setPosition(this->getContentSize().width/2-50,0);

jianchihu->setAnimation(0, "monster_jianchihu_wait", true);

this->addChild(jianchihu);

auto hero2 = DataManager::getInstance()->getHeroSkeletonAnimation(0.5);

hero2->setAnimation(0, "red_wait", true);

this->addChild(hero2);

jianchihu->changeBone(hero2->getSkeleton(), "zuoqi", "rig");

结果就是将hero2的rig骨骼绑定到了jianchihu的zuoqi骨骼上

-----8.总结

4.中的实现方法还有待改进,比如加完之后人物不一定是正立的,可能会根据jianchihu的zuoqi骨骼的rotation属性旋转一定的角度,这里可以根据boneData的属性做相应的改正。

还有就是可能涉及到绑定骨骼的父子骨骼关系问题,如果出现显示问题,可能需要循环遍历骨骼的所有同级骨骼,然后把响应骨骼的父节点或者子节点的骨骼全都换成要绑定到的骨骼上。

继续阅读