注意事项
替换的图片需要裁减掉周围填充的透明像素,因为龙骨内是以图片左下角为原点
图集暂时还没测试,单张图片已测
/**
* 静态图片修改插槽内图片
* @param arm 龙骨动画数据,通过 dragon.armature()获得
* @param slotName 插槽名称 , 龙骨动画里插槽的名字
* @param sprite 需要更换的图片 : 此图片需要消除周围的透明像素填充 (图集会自动消除,如果是单个图片需要处理)
* @param isAtlas 是否是图集
* @param slotIndex 插槽的displayIndex
*/
public static changeLocalSpriteFrame(arm : dragonBones.Armature,slotName: string, sprite : cc.SpriteFrame,isAtlas:boolean = false, slotIndex = 0):void{
let slot = arm.getSlot(slotName);
let newHeight = isAtlas? sprite._rect.height : sprite.getTexture().height;
let newWidth = isAtlas? sprite._rect.width : sprite.getTexture().width;
let imageData = arm._skinData.displays[slotName][slotIndex];
let oldRegion = imageData.texture.region;
//修改图片的裁剪区域
let reg = dragonBones.TextureData.createRectangle();
if (isAtlas){
let rect = sprite._rect;
reg.x = rect.x;
reg.y = rect.y;
reg.height = rect.height;
reg.width = rect.width;
}
else{
reg.x = 0;
reg.y = 0;
reg.height = newHeight;
reg.width = newWidth;
}
imageData.texture.region = reg;
imageData.texture.spriteFrame = sprite;
//修改图片的位置
imageData.transform.x -= (newWidth-oldRegion.width)/2; //这里与x轴正对
imageData.transform.y -= (newHeight-oldRegion.height)/2 ; //与 y 轴相反
//将骨骼动画实时刷新
slot.display._updateDisplayData()
slot._transformDirty = true;
slot._displayDirty = true;
}