我希望可以做到外部图片替换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); } }