cocos2d-x3.0alpha1 关于骨骼动画换装里存在的一个问题

首先,换装实现的主要代码是下面类似的:

// 加载纹理皮肤数据
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数据,也请告知。。。目前我没找到方法。

另外,注意的第(2)里面的第2点:

这个xml里记录的锚点坐标pX和pY是以左上角为0,0点。这里跟cocos2dx GL坐标系 默认以左下角为0,0点是不一样的!

最终效果:

顶一下,虽然遇到一样的问题,

同问,xml用什么编辑器?

我的动画不播放了呢

:2: 求指导啊 楼主

同问 xml怎么编辑的??官方的人呢

顶一下,楼上的大神们有没有找到方法啊,求指导。遇到同一个问题