[0]适配版spine实现替换骨骼图片
首先原则是不想破坏官方提供的代码,这样更新引擎会非常麻烦。
但是,最终还是添加了引擎提供的代码。
用hook的方式,对class添加方法,修改引擎代码,进行渲染。
其实现效率不高,还没有找到缓存的方式。如果有更好的思路或者缓存方式,请私信我。
下面是hook代码的实现
附带添加了cocos creator在骨骼上添加节点的思路,完全是hook的方式,如果没有改骨骼图片的需求,直接使用即可。
但是,最终还是添加了引擎提供的代码。
用hook的方式,对class添加方法,修改引擎代码,进行渲染。
其实现效率不高,还没有找到缓存的方式。如果有更好的思路或者缓存方式,请私信我。
下面是hook代码的实现
Laya.SpineSkeleton.prototype.replaceSkin = function (slotName, texture) {下面是修改引擎代码的实现
if (!this.skeletonRenderer._diySkin){
this.skeletonRenderer._diySkin = {}
}
this.skeletonRenderer._diySkin[slotName] = {
texture: texture,
uv:{}
}
}
if (this._diySkin && this._diySkin[slot.data.name]) {
let _texture = this._diySkin[slot.data.name].texture;
let tuvs = [];
if (tuvs.length == 0) {
let _smallTexture = Laya.Texture.createFromTexture(texture, attachment.region.renderObject.x,
attachment.region.renderObject.y, attachment.region.renderObject.width, attachment.region.renderObject.height);
tuvs = Laya.UVTools.getRelativeUV(_smallTexture.uv, mUVs, tuvs);
tuvs = Laya.UVTools.getAbsoluteUV(_texture.uv, tuvs, tuvs);
}
mUVs = tuvs;
texture = _texture
}
spineSkeletonIns.graphics.drawTriangles(texture, 0, 0, mVertices, mUVs, new Uint16Array(triangles), Laya.Matrix.EMPTY, colors[3], color, blendMode, colorNum);
附带添加了cocos creator在骨骼上添加节点的思路,完全是hook的方式,如果没有改骨骼图片的需求,直接使用即可。
const oldUpdate = Laya.SpineSkeleton.prototype._update;
Laya.SpineSkeleton.prototype._update = function () {
if (!this.attachNode) {
this.attachNode = new Laya.Sprite()
this.attachNode.name = "root"
this.addChild(this.attachNode)
this.child4AttachNodeMap = {};
}
oldUpdate.apply(this, arguments);
for (let bone of this.skeleton.bones) {
let boneName = bone.data.name
if (boneName != "root") {
let child = this.attachNode.getChildByName(boneName)
if (!child) {
child = new Laya.Sprite()
child.name = boneName
this.attachNode.addChild(child)
}
child.x = bone.x
child.y = -bone.y
child.scaleX = bone.scaleX
child.scaleY = bone.scaleY
child.rotation = bone.rotation
if (this.child4AttachNodeMap[boneName]) {
for (let attachChild of this.child4AttachNodeMap[boneName]) {
if (!attachChild.destroyed) {
child.addChild(attachChild)
}
}
this.child4AttachNodeMap[boneName] = []
}
// child.graphics.drawRect(0,0,10,10,"#6a9c5a")
}
}
}
Laya.SpineSkeleton.prototype.addChild2AttachNodeByName = function (_name, _child) {
if (!this.child4AttachNodeMap[_name]) {
this.child4AttachNodeMap[_name] = []
}
this.child4AttachNodeMap[_name].push(_child)
}
没有找到相关结果
已邀请:
要回复问题请先登录
3 个回复
Laya_z
赞同来自:
139*****908
赞同来自:
186*****397
赞同来自:
不知应该插入到哪一段?