cocoscreator实现spine用外部图片进行换皮
我希望可以做到外部图片替换spine一个部位上面的图片网上有看到2dx的做法是新建sp.spine.RegionAttachment,这个时候问题就来了:如何通过我们的Texture2D来设置sp.spine.TextureAtlasRegion和sp.spine.TextureAtlasPage自己写了个实现函数,大家可以参考下void SkeletonRenderer::createRegio
·
我希望可以做到外部图片替换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);
}
}
这里是一个专注于游戏开发的社区,我们致力于为广大游戏爱好者提供一个良好的学习和交流平台。我们的专区包含了各大流行引擎的技术博文,涵盖了从入门到进阶的各个阶段,无论你是初学者还是资深开发者,都能在这里找到适合自己的内容。除此之外,我们还会不定期举办游戏开发相关的活动,让大家更好地交流互动。加入我们,一起探索游戏开发的奥秘吧!
更多推荐
已为社区贡献1条内容
所有评论(0)