cocoscreator实现spine用外部图片进行换皮

我希望可以做到外部图片替换spine一个部位上面的图片
网上有看到2dx的做法是新建sp.spine.RegionAttachment,这个时候问题就来了:
如何通过我们的Texture2D来设置sp.spine.TextureAtlasRegion和sp.spine.TextureAtlasPage

笔者研究一个礼拜,自己写了个实现函数,大家可以参考下


void SkeletonRenderer::createRegion(const std::string& slotName,cocos2d::middleware::Texture2D * texture){
    
    Slot *slot = _skeleton->findSlot(slotName.c_str());
    
    Texture* texture2D  = texture->getNativeTexture();
    RegionAttachment* attachment = (RegionAttachment*)slot->getAttachment();
    
    float width = texture2D->getWidth();
    float height = texture2D->getHeight();
    
    float wide = texture->getPixelsWide();
    float high = texture->getPixelsHigh();
    attachment->setUVs(0, 0, 1,1, false);
    attachment->setWidth(wide);
    attachment->setHeight(high);
    attachment->setRegionWidth(wide);
    attachment->setRegionHeight(high);
    attachment->setRegionOriginalWidth(wide);
    attachment->setRegionOriginalHeight(high);
    attachment->setRegionOffsetX(0);
    attachment->setRegionOffsetY(15);
    texture->setPixelsWide(width);
    texture->setPixelsHigh(height);
    texture->setRealTextureIndex(1);
    
    AttachmentVertices * attachV = (AttachmentVertices *)attachment->getRendererObject();
    if (attachV->_texture == texture) return;
    
    CC_SAFE_RELEASE(attachV->_texture);
    attachV->_texture = texture;
    CC_SAFE_RETAIN(texture);

    
    V2F_T2F_C4B*  vertices = attachV->_triangles->verts;
    for (int i = 0, ii = 0; i < 4; ++i, ii += 2) {
        vertices[i].texCoord.u = attachment->getUVs()[ii];
        vertices[i].texCoord.v = attachment->getUVs()[ii+1];
    }
    
    attachment->updateOffset();
    
    
}

 

public changeSpineTexture(slotname: string, texture2d: cc.Texture2D, size: cc.Size = null): void {
		if (this._spine == null || texture2d == null) {
			return;
		}

		let slot = this._spine.findSlot(slotname);

		if (slot) {
			let att = slot.getAttachment();

			if (cc.sys.isNative) {
				let jsbTexture = new middleware.Texture2D();
				let texture = texture2d.getImpl();

				if (size == null) {
					jsbTexture.setPixelsWide(texture2d.width);
					jsbTexture.setPixelsHigh(texture2d.height);
				} else {
					jsbTexture.setPixelsWide(size.width);
					jsbTexture.setPixelsHigh(size.height);
				}
				jsbTexture.setNativeTexture(texture);
				this._spine._nativeSkeleton.createRegion(slotname, jsbTexture);
			} else {
				texture2d.setPremultiplyAlpha(true);
				let skeletonTexture = new sp.SkeletonTexture();
				skeletonTexture.setRealTexture(texture2d);
				let page = new sp.spine.TextureAtlasPage();
				page.name = texture2d.name
				page.uWrap = sp.spine.TextureWrap.ClampToEdge;
				page.vWrap = sp.spine.TextureWrap.ClampToEdge;
				page.texture = skeletonTexture;
				page.texture.setWraps(page.uWrap, page.vWrap);
				page.width = texture2d.width;
				page.height = texture2d.height;

				let region = new sp.spine.TextureAtlasRegion();
				region.page = page;
				region.width = texture2d.width;
				region.height = texture2d.height;


				region.originalWidth = texture2d.width;
				region.originalHeight = texture2d.height;

				region.rotate = false;
				region.u = 0;
				region.v = 0;
				region.u2 = 1;
				region.v2 = 1;
				region.texture = skeletonTexture;
				att.region = region;

				if (size != null) {
					att.width = size.width;
					att.height = size.height;
				}

				att.setRegion(region);

				att.updateOffset();
			}
		} else {
			cc.error('!!!no slot name!!=', slotname);
		}
	}

 

你可能感兴趣的:(cocos)