龙骨动画换肤

注意事项

替换的图片需要裁减掉周围填充的透明像素,因为龙骨内是以图片左下角为原点
图集暂时还没测试,单张图片已测

    /**
     * 静态图片修改插槽内图片
     * @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;
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容