引擎3.6,用了官方的外部换装案例,加以修改支持spriteframe,论坛那个2.4.7spine图集参考后,我在原有的官方的这个案例上修改支持了一波sf,部分正常:
散图默认向左边,图集如果是向左边没问题。
异常:
如果导出的图集里是的某个散图顺时针旋转了90度,相当于spine旋转了270度。经过我的算法,游戏表现是图的头尾没旋转对。。看不懂uvs这块怎么改。
/**
* 局部换装
*/
public changeSlotSkin (slotName: string, sp: SpriteFrame) {
const slot = this.findSlot(slotName);
if (!slot) return;
let attachment = slot.getAttachment();
if (!attachment) return;
const isMesh = attachment instanceof spine.MeshAttachment;
const isRegion = attachment instanceof spine.RegionAttachment;
if (!isMesh && !isRegion) return;
attachment = slot.getAttachment().copy();
attachment.name = 'xxx';
let regionInfo = this.makeRegionIno(sp,'');
let texture = regionInfo.texture;
let rect = regionInfo.rect
let origSize = regionInfo.origSize
let offset = regionInfo.offset
let degrees = regionInfo.degrees
const skelTex = new SkeletonTexture({ width: texture.width, height: texture.height } as ImageBitmap);
skelTex.setRealTexture(texture);
// const region = new spine.TextureAtlasRegion();
let region = attachment.region;
// region.u = 0;
// region.v = 0;
// region.u2 = 1;
// region.v2 = 1;
region.texture = skelTex;
region.renderObject = region;
// region.page = attachment.region.page;
region.x = rect.x
region.y = rect.y
region.width = rect.width
region.height = rect.height
region.originalWidth = origSize.width
region.originalHeight = origSize.height
region.offsetX = offset.x
region.offsetY = offset.y
region.rotate = degrees != 0
region.degrees = degrees
if (region.rotate){
region.u = rect.x / texture.width
region.v = rect.y / texture.height
region.u2 = (rect.x + rect.height) / texture.width
region.v2 = (rect.y + rect.width) / texture.height
} else{
region.u = rect.x / texture.width
region.v = rect.y / texture.height
region.u2 = (rect.x + rect.width) / texture.width
region.v2 = (rect.y + rect.height) / texture.height
}
attachment.width = rect.width;
attachment.height = rect.height;
if (isMesh) {
attachment.updateUVs()
} else if (isRegion) {
let uvs = attachment.uvs;
if (region.degrees == 90 ) {
uvs[2] = region.u;
uvs[3] = region.v2;
uvs[4] = region.u;
uvs[5] = region.v;
uvs[6] = region.u2;
uvs[7] = region.v;
uvs[0] = region.u2;
uvs[1] = region.v2;
} else if (region.degrees == 270) {
uvs[6] = region.u;
uvs[7] = region.v2;
uvs[0] = region.u;
uvs[1] = region.v;
uvs[2] = region.u2;
uvs[3] = region.v;
uvs[4] = region.u2;
uvs[5] = region.v2;
} else {
uvs[0] = region.u;
uvs[1] = region.v2;
uvs[2] = region.u;
uvs[3] = region.v;
uvs[4] = region.u2;
uvs[5] = region.v;
uvs[6] = region.u2;
uvs[7] = region.v2;
}
attachment.setRegion(region);
attachment.updateOffset()
}
slot.setAttachment(attachment);
}
makeRegionIno(frame: SpriteFrame, key: string): regionInfo {
let texture = frame.texture;
let rect = frame.rect;
let origSize = frame.originalSize;
let offset = frame.offset;
let rotate = frame.rotated;
let info: regionInfo = {
key: key,
rect: rect,
origSize: origSize,
offset: v2(
(origSize.width - rect.width) * 0.5 + offset.x,
(origSize.height - rect.height) * 0.5 + offset.y
),
degrees: rotate ? 270 : 0,
texture: texture,
}
return info
}