首先,换装实现的主要代码是下面类似的:
// 加载纹理皮肤数据
ArmatureDataManager::getInstance()->addArmatureFileInfoAsync(“Weapons0.png”, “Weapons0.plist”, “weapon.xml”, this, schedule_selector(HelloWorld::dataLoaded));
std::string weapon] = {“weapon_f-sword2.png”, “weapon_f-sword4.png”};
for (int i = 1; i <= 2; i++)
{
Skin skin = Skin::createWithSpriteFrameName(weapon.c_str());
armature->getBone(“weapon”)->addDisplay(skin, i, false);
}
armature->getBone(“weapon”)->changeDisplayByIndex(displayIndex, true);
这个代码不多解释,在testCPP里,对那个小小的黑骑士就可以换武器,大家都见过吧?
从下面这个图可以看出,发现小黑骑士拿大、小武器都是在同一个位置:

但是,当将这段代码移植自己项目中时,发现了一个问题,就是当武器规格不一样(比如武器的长度和宽度不一样)时,武器错位了。

通过反复查看代码终于发现了:
(1)addDisplay函数内对skinData的初始化存在问题:
addDisplay内,对加入的skin皮肤进行赋值,如果发现skinData不存在,则去查找原本存在的display对象的skinData,(一般就是默认的那个武器的skinData了)
这skinData主要包含的数据是:
“skin_data”:
{
“x”: 20.6592579,
“y”: 12.6013756,
“cX”: 1.00000012,
“cY”: 1.00000012,
“kX”: 1.64684021,
“kY”: -1.64684021
}
]
这里的x、y代表这个skin离绑定骨骼0坐标的位置。
所以,当武器规格不一样时,默认武器的x、y是一组数值,
那么更换的武器,它的x、y应该是不一样的。
所以这里就导致了更换的武器位置不对了。
(2)第二个问题,是addDisplay里,会调用DisplayFactory::initSpriteDisplay(_bone, decoDisplay, skin->getDisplayName().c_str(), skin);
在这里,会对每个skin的TextureData进行重新初始化赋值。
skin->setAnchorPoint(Point( textureData->pivotX, textureData->pivotY));
这样处理之后,skin的锚点位置就重新被设置成为了xml(可以查看示例weapon.xml)里的textureAltas里定义的锚点位置了。
所以,这里如果更换的装备的(xml里定义)锚点位置如果设置不对,则也会产生纹理位置不对的问题。
最重要的问题:你无法在addDisplay的时候更改锚点和skinData的数据!!!
而示例里看到的更换是正确的,是因为(1)skinData里 x和y值都是0,(2)每个纹理的锚点都设置在手柄处(可以看weapon.xml)定义的。
所以,要想正确的更换皮肤,需要注意2点:
(1)保证骨骼动画绑定的时候,皮肤锚点定义对齐骨骼的0点,保证skinData里的x、y坐标都是0

(2)其余皮肤纹理打包的xml里,正确定义数据,其中pX和pY就是锚点的位置,其中x和y却好像并不是skinData里的x和y数据
PS:不知道该文件(weapon.xml),即纹理打包内容,另外的这个xml数据是用什么工具编辑的?如果有人知道请告知,否则好像只能手动去编辑?!试过DragonBone,输出的格式却好像不一样。
另外,如果有人知道如何在换装时,显示的更改Anchor和skinData数据,也请告知。。。目前我没找到方法。
求指导啊 楼主