'use strict'; var duilib; (function (duilib) { duilib.throttle = function (func, timeout, context) { var args; var timer; var previous; return function () { if (timer) clearTimeout(timer); if (previous == null) previous = performance.now(); args = arguments; var timestamp = performance.now() - previous; if (timestamp >= timeout) { timer = null; previous = null; func.apply(context, args); } else { timer = setTimeout(function () { timer = null; previous = null; func.apply(context, args); }, timeout - timestamp); } } }; duilib.observeSize = (function () { if (!self.ResizeObserver) return null; var observer = new ResizeObserver(function (entries) { var rect; var callback; for (var i = 0; i < entries.length; i++) { callback = observer.callbacks[entries[i].target.observeId]; if (callback == null) continue; rect = entries[i].contentRect; callback({ width: rect.width, height: rect.height }); } }); observer.observeId = 0; observer.callbacks = {}; return function (target, callback) { var obs = observer; target.observeId = obs.observeId++; obs.observe(target); obs.callbacks[target.observeId] = callback; } })(); duilib.lerp = function (min, max, fraction) { return (max - min) * fraction + min; }; duilib.ease = function (fraction) { if (!duilib.b3ease) duilib.b3ease = new duilib.CubicBezierEase(0.25, 0.1, 0.25, 1); return duilib.b3ease.ease(fraction); }, duilib.CubicBezierEase = (function () { function CubicBezierEase(p1x, p1y, p2x, p2y) { this.cX = 3 * p1x; this.bX = 3 * (p2x - p1x) - this.cX; this.aX = 1 - this.cX - this.bX; this.cY = 3 * p1y; this.bY = 3 * (p2y - p1y) - this.cY; this.aY = 1 - this.cY - this.bY; }; CubicBezierEase.prototype.getX = function (t) { return t * (this.cX + t * (this.bX + t * this.aX)); }; CubicBezierEase.prototype.getXDerivative = function (t) { return this.cX + t * (2 * this.bX + 3 * this.aX * t); }; CubicBezierEase.prototype.ease = function (x) { var prev, t = x; do { prev = t; t = t - ((this.getX(t) - x) / this.getXDerivative(t)); } while (Math.abs(t - prev) > 1e-4); return t * (this.cY + t * (this.bY + t * this.aY)); }; return CubicBezierEase; })(); duilib.TimeStep = (function () { function TimeStep(initParam) { this.start = initParam.start; this.current = initParam.start; this.end = initParam.end; this.time = 0; this.percent = 0; this.duration = initParam.duration; this.completed = false; }; TimeStep.prototype.update = function (delta) { this.time += delta; this.percent = duilib.ease(Math.min(this.time / this.duration, 1)); var start, end; var isArray = false; if (Array.isArray(this.start)) { isArray = true; start = this.start; } else { start = [this.start, 0]; } if (Array.isArray(this.end)) { isArray = true; end = this.end; } else { end = [this.end, 0]; } if (isArray) { this.current = [duilib.lerp(start[0], end[0], this.percent), duilib.lerp(start[1], end[1], this.percent)]; } else { this.current = duilib.lerp(start[0], end[0], this.percent); } if (this.time >= this.duration) this.completed = true; }; return TimeStep; })(); duilib.APNode = (function () { function APNode(initParam) { if (initParam == undefined) initParam = {}; this.id = undefined; // 内部属性,不可更改 this.x = initParam.x; this.y = initParam.y; this.height = initParam.height; this.width = initParam.width; this.angle = initParam.angle; this.scale = initParam.scale; this.opacity = initParam.opacity; this.clip = initParam.clip; this.hideSlots = initParam.hideSlots; this.clipSlots = initParam.clipSlots; this.disableMask = initParam.disableMask; this.renderX = undefined; // 内部属性,不可更改 this.renderY = undefined; // 内部属性,不可更改 this.renderAngle = undefined; // 内部属性,不可更改 this.renderScale = undefined; // 内部属性,不可更改 this.renderOpacity = undefined; // 内部属性,不可更改 this.renderClip = undefined; // 内部属性,不可更改 this.mvp = new spine.webgl.Matrix4(); // 内部属性,不可更改 this.skeleton = initParam.skeleton; // 内部属性,不可更改 this.name = initParam.name; // 内部属性,不可更改 this.action = initParam.action; // 内部属性,不可更改 this.loop = initParam.loop; this.loopCount = initParam.loopCount; this.speed = initParam.speed; this.onupdate = initParam.onupdate; this.oncomplete = initParam.oncomplete; this.completed = true; // 内部属性,不可更改 this.referNode = initParam.referNode; this.referFollow = initParam.referFollow; this.referBounds = undefined; // 内部属性,不可更改 this.timestepMap = {}; // 内部属性,不可更改 this.flipX = initParam.flipX; this.flipY = initParam.flipY; }; APNode.prototype.fadeTo = function (opacity, duration) { if (opacity != undefined) { this.updateTimeStep('opacity', (this.opacity == undefined ? 1 : this.opacity), opacity, duration); this.opacity = opacity; } return this; } APNode.prototype.moveTo = function (x, y, duration) { if (x != undefined) { this.updateTimeStep('x', (this.x == undefined ? [0, 0.5] : this.x), x, duration); this.x = x; } if (y != undefined) { this.updateTimeStep('y', (this.y == undefined ? [0, 0.5] : this.y), y, duration); this.y = y; } return this; }; APNode.prototype.scaleTo = function (scale, duration) { if (scale != undefined) { this.updateTimeStep('scale', (this.scale == undefined ? 1 : this.scale), scale, duration); this.scale = scale; } return this; }; APNode.prototype.rotateTo = function (angle, duration) { if (angle != undefined) { this.updateTimeStep('angle', (this.angle == undefined ? 0 : this.angle), angle, duration); this.angle = angle; } return this; }; APNode.prototype.update = function (e) { function calc(value, refer, dpr) { if (Array.isArray(value)) { return value[0] * dpr + value[1] * refer; } else { return value * dpr; } } var domX, domY, domDefaultX, domDefaultY; var dpr = e.dpr; var referSize = { width: e.canvas.width, height: e.canvas.height }; var domNode = this.referNode instanceof HTMLElement ? this.referNode : undefined; if (domNode) { if (this.referFollow || !this.referBounds) { var rect = domNode.getBoundingClientRect(); this.referBounds = { x: rect.left, y: decadeUI.get.bodySize().height - rect.bottom, width: rect.width, height: rect.height, }; } referSize.height = this.referBounds.height * dpr; referSize.width = this.referBounds.width * dpr; } var timestep, percent; var renderX, renderY, renderScale, renderScaleX, renderScaleY; var skeletonSize = this.skeleton.bounds.size; timestep = this.timestepMap.x; if (timestep != undefined && !timestep.completed) { timestep.update(e.delta); renderX = calc(timestep.current, referSize.width, dpr); } else if (this.x != undefined) { renderX = calc(this.x, referSize.width, dpr); } timestep = this.timestepMap.y; if (timestep != undefined && !timestep.completed) { timestep.update(e.delta); renderY = calc(timestep.current, referSize.height, dpr); } else if (this.y != undefined) { renderY = calc(this.y, referSize.height, dpr); } if (this.width != undefined) renderScaleX = calc(this.width, referSize.width, dpr) / skeletonSize.x; if (this.height != undefined) renderScaleY = calc(this.height, referSize.height, dpr) / skeletonSize.y; if (domNode) { if (renderX == undefined) { renderX = (this.referBounds.x + this.referBounds.width / 2) * dpr; } else { renderX += this.referBounds.x * dpr; } if (renderY == undefined) { renderY = (this.referBounds.y + this.referBounds.height / 2) * dpr;; } else { renderY += this.referBounds.y * dpr;; } } this.mvp.ortho2d(0, 0, e.canvas.width, e.canvas.height); if (renderX != void 0 && renderY == void 0) { this.mvp.translate(renderX, 0, 0); this.mvp.setY(0); } else if (renderX == void 0 && renderY != void 0) { this.mvp.translate(0, renderY, 0); this.mvp.setX(0); } else if (renderX != void 0 && renderY != void 0) { this.mvp.translate(renderX, renderY, 0); } else { this.mvp.setPos2D(0, 0); } timestep = this.timestepMap.scale; if (timestep != undefined && !timestep.completed) { timestep.update(e.delta); renderScale = timestep.current; } else { renderScale = (this.scale == undefined ? 1 : this.scale); } if (renderScaleX && !renderScaleY) { renderScale *= renderScaleX; } else if (!renderScaleX && renderScaleY) { renderScale *= renderScaleY; } else if (renderScaleX && renderScaleY) { renderScale *= Math.min(renderScaleX, renderScaleY); } else { renderScale *= dpr; } if (renderScale != 1) { this.mvp.scale(renderScale, renderScale, 0); } timestep = this.timestepMap.angle; if (timestep != undefined && !timestep.completed) { timestep.update(e.delta); this.renderAngle = timestep.current; } else { this.renderAngle = this.angle; } if (this.renderAngle) { this.mvp.rotate(this.renderAngle, 0, 0, 1); } timestep = this.timestepMap.opacity; if (timestep != undefined && !timestep.completed) { timestep.update(e.delta); this.renderOpacity = timestep.current; } else { this.renderOpacity = this.opacity; } this.renderX = renderX; this.renderY = renderY; this.renderScale = renderScale; if (this.clip) { this.renderClip = { x: calc(this.clip.x, e.canvas.width, dpr), y: calc(this.clip.y, e.canvas.height, dpr), width: calc(this.clip.width, e.canvas.width, dpr), height: calc(this.clip.height, e.canvas.height, dpr) }; } if (this.onupdate) this.onupdate(); }; APNode.prototype.setAction = function (action, transtion) { if (this.skeleton && this.skeleton.node == this) { if (this.skeleton.data.findAnimation(action) == null) return console.error('setAction: 未找到对应骨骼动作'); transtion = transtion == undefined ? 0.5 : transtion / 1000; var entry = this.skeleton.state.setAnimation(0, action, this.loop); entry.mixDuration = transtion; } else { console.error('setAction: 节点失去关联'); } }; APNode.prototype.resetAction = function (transtion) { if (this.skeleton && this.skeleton.node == this) { transtion = transtion == undefined ? 0.5 : transtion / 1000; var entry = this.skeleton.state.setAnimation(0, this.skeleton.defaultAction, this.loop); entry.mixDuration = transtion; } else { console.error('resetAction: 节点失去关联'); } }; APNode.prototype.complete = function () { if (!this.oncomplete) return; if (typeof this.oncomplete == 'string') { var code = this.oncomplete; var a = code.indexOf('{'); var b = code.lastIndexOf('}'); if (a == -1 || b == -1) { this.oncomplete = undefined; return console.error(this.name + ' 的oncomplete函数语法错误'); } this.oncomplete = new Function(code.substring(a + 1, b)); } if (typeof this.oncomplete == 'function') this.oncomplete(); }; APNode.prototype.updateTimeStep = function (key, start, end, duration) { if (duration == undefined || duration == 0) return; var timestep = this.timestepMap[key]; if (timestep) { timestep.start = timestep.completed ? start : timestep.current; timestep.end = end; timestep.time = 0; timestep.percent = 0; timestep.completed = false; timestep.duration = duration; } else { timestep = this.timestepMap[key] = new duilib.TimeStep({ start: start, end: end, duration: duration, }); } return timestep; } return APNode; })(); duilib.AnimationPlayer = (function () { function AnimationPlayer(pathPrefix, parentNode, elementId) { if (!window.spine) return console.error('spine 未定义.'); var canvas; if (parentNode === 'offscreen') { canvas = elementId this.offscreen = true; } else { canvas = document.createElement('canvas'); canvas.className = 'animation-player'; if (elementId != undefined) canvas.id = elementId; if (parentNode != undefined) parentNode.appendChild(canvas); } var config = { alpha: true }; var gl = canvas.getContext('webgl2', config); if (gl == undefined) { gl = canvas.getContext('webgl', config) || canvas.getContext('experimental-webgl', config); } else { gl.isWebgl2 = true; } if (gl) { this.spine = { shader: spine.webgl.Shader.newTwoColoredTextured(gl), batcher: new spine.webgl.PolygonBatcher(gl), skeletonRenderer: new spine.webgl.SkeletonRenderer(gl), assetManager: new spine.webgl.AssetManager(gl, pathPrefix), assets: {}, skeletons: [], } } else { this.spine = { assets: {} }; console.error('当前设备不支持 WebGL.'); } this.gl = gl; this.canvas = canvas; this.$canvas = canvas; this.frameTime = undefined; this.running = false; this.resized = false; this.dpr = 1; this.nodes = []; this.BUILT_ID = 0; this._dprAdaptive = false; Object.defineProperties(this, { dprAdaptive: { get: function () { return this._dprAdaptive; }, set: function (value) { if (this._dprAdaptive == value) return; this._dprAdaptive = value; this.resized = false; }, }, useMipMaps: { get: function () { if (!gl) return; return this.gl.useMipMaps; }, set: function (value) { if (!gl) return; this.gl.useMipMaps = value; }, } }); if (!this.offscreen) { this.canvas.width = canvas.clientWidth; this.canvas.height = canvas.clientHeight; } this.check = function () { if (!this.gl) { function empty() { }; var key; for (key in this.__proto__) { if (typeof this.__proto__[key] == 'function') { this.__proto__[key] = empty; } } for (key in this) { if (typeof this[key] == 'function' && key != 'check') { this[key] = empty; } } } }; this.check(); }; AnimationPlayer.prototype.createTextureRegion = function (image, name) { var page = new spine.TextureAtlasPage(); page.name = name; page.uWrap = spine.TextureWrap.ClampToEdge; page.vWrap = spine.TextureWrap.ClampToEdge; page.texture = this.spine.assetManager.textureLoader(image); page.texture.setWraps(page.uWrap, page.vWrap); page.width = page.texture.getImage().width; page.height = page.texture.getImage().height; var region = new spine.TextureAtlasRegion(); region.page = page; region.rotate = false; region.width = page.width; region.height = page.height; region.x = 0; region.y = 0; region.u = region.x / page.width; region.v = region.y / page.height; if (region.rotate) { region.u2 = (region.x + region.height) / page.width; region.v2 = (region.y + region.width) / page.height; } else { region.u2 = (region.x + region.width) / page.width; region.v2 = (region.y + region.height) / page.height; } region.originalWidth = page.width; region.originalHeight = page.height; region.index = -1; region.texture = page.texture; region.renderObject = region; return region; }; AnimationPlayer.prototype.hasSpine = function (filename) { return this.spine.assets[filename] != undefined; }; AnimationPlayer.prototype.loadSpine = function (filename, skelType, onload, onerror) { skelType = skelType == undefined ? 'skel' : skelType.toLowerCase(); var thisAnim = this; var reader = { name: filename, filename: filename, skelType: skelType, onsuccess: onload, onfailed: onerror, loaded: 0, errors: 0, toLoad: 2, onerror: function (path, msg) { var _this = reader; _this.toLoad--; _this.errors++; if (_this.toLoad == 0) { console.error('loadSpine: [' + _this.filename + '] 加载失败.'); if (_this.onfailed) _this.onfailed(); } }, onload: function (path, data) { var _this = reader; _this.toLoad--; _this.loaded++; if (_this.toLoad == 0) { if (_this.errors > 0) { console.error('loadSpine: [' + _this.filename + '] 加载失败.'); if (_this.onfailed) _this.onfailed(); } else { thisAnim.spine.assets[_this.filename] = { name: _this.filename, skelType: _this.skelType }; if (_this.onsuccess) _this.onsuccess(); } } }, ontextLoad: function (path, data) { var _this = reader; var imageName = null; var atlasReader = new spine.TextureAtlasReader(data); var prefix = ''; var a = _this.name.lastIndexOf('/'); var b = _this.name.lastIndexOf('\\'); if (a != -1 || b != -1) { if (a > b) prefix = _this.name.substring(0, a + 1); else prefix = _this.name.substring(0, b + 1); } while (true) { var line = atlasReader.readLine(); if (line == null) break; line = line.trim(); if (line.length == 0) { imageName = null; } else if (!imageName) { imageName = line; _this.toLoad++; thisAnim.spine.assetManager.loadTexture(prefix + imageName, _this.onload, _this.onerror); } else { continue; } } _this.onload(path, data); }, }; if (skelType == 'json') { thisAnim.spine.assetManager.loadText(filename + '.json', reader.onload, reader.onerror); } else { thisAnim.spine.assetManager.loadBinary(filename + '.skel', reader.onload, reader.onerror); } thisAnim.spine.assetManager.loadText(filename + '.atlas', reader.ontextLoad, reader.onerror); }; AnimationPlayer.prototype.prepSpine = function (filename, autoLoad) { var _this = this; var spineAssets = _this.spine.assets; if (!spineAssets[filename]) { if (autoLoad) { _this.loadSpine(filename, 'skel', function () { _this.prepSpine(filename); }); return 'loading'; } return console.error('prepSpine: [' + filename + '] 骨骼没有加载');; } var skeleton; var skeletons = _this.spine.skeletons; for (var i = 0; i < skeletons.length; i++) { skeleton = skeletons[i]; if (skeleton.name == filename && skeleton.completed) return skeleton; } var asset = spineAssets[filename]; var manager = _this.spine.assetManager; var skelRawData = asset.skelRawData; if (!skelRawData) { var prefix = ''; var a = filename.lastIndexOf('/'); var b = filename.lastIndexOf('\\'); if (a != -1 || b != -1) { if (a > b) prefix = filename.substring(0, a + 1); else prefix = filename.substring(0, b + 1); } var atlas = new spine.TextureAtlas(manager.get(filename + '.atlas'), function (path) { return manager.get(prefix + path); }); var atlasLoader = new spine.AtlasAttachmentLoader(atlas); if (asset.skelType.toLowerCase() == 'json') { skelRawData = new spine.SkeletonJson(atlasLoader); } else { skelRawData = new spine.SkeletonBinary(atlasLoader); } spineAssets[filename].skelRawData = skelRawData; spineAssets[filename].ready = true; } var data = skelRawData.readSkeletonData(manager.get(filename + '.' + asset.skelType)); skeleton = new spine.Skeleton(data); skeleton.name = filename; skeleton.completed = true; skeleton.setSkinByName('default'); skeleton.setToSetupPose(); skeleton.updateWorldTransform(); skeleton.state = new spine.AnimationState(new spine.AnimationStateData(skeleton.data)); skeleton.state.addListener({ complete: function (track) { var node = skeleton.node; if (node) { track.loop = (node.loop == undefined ? false : node.loop); if (track.loop && node.loopCount > 0) { node.loopCount--; if (node.loopCount == 0) track.loop = false; } skeleton.completed = node.completed = !track.loop; if (node.complete) node.complete(); } else { skeleton.completed = !track.loop; console.error('skeleton complete: 超出预期的错误'); } } }); skeleton.bounds = { offset: new spine.Vector2(), size: new spine.Vector2() }; skeleton.getBounds(skeleton.bounds.offset, skeleton.bounds.size, []); skeleton.defaultAction = data.animations[0].name; skeleton.node = undefined; skeletons.push(skeleton); return skeleton; }; AnimationPlayer.prototype.playSpine = function (sprite, position) { if (self.duicfg && !self.duicfg.gameAnimationEffect) return; if (sprite == undefined) return console.error('playSpine: parameter undefined'); if (typeof sprite == 'string') sprite = { name: sprite }; if (!this.hasSpine(sprite.name)) return console.error('playSpine: [' + sprite.name + '] 骨骼没有加载'); var skeletons = this.spine.skeletons; var skeleton; if (!(sprite instanceof duilib.APNode && sprite.skeleton.completed)) { for (var i = 0; i < skeletons.length; i++) { skeleton = skeletons[i]; if (skeleton.name == sprite.name && skeleton.completed) break; skeleton = null; }; if (!skeleton) skeleton = this.prepSpine(sprite.name); if (!(sprite instanceof duilib.APNode)) { var param = sprite; sprite = new duilib.APNode(sprite); sprite.id = param.id == undefined ? this.BUILT_ID++ : param.id; this.nodes.push(sprite); } sprite.skeleton = skeleton; skeleton.node = sprite; } sprite.completed = false; skeleton.completed = false; if (position != undefined) { sprite.x = position.x; sprite.y = position.y; sprite.height = position.height; sprite.width = position.width; sprite.scale = position.scale; sprite.angle = position.angle; sprite.referNode = position.parent; sprite.referFollow = position.follow; } var entry = skeleton.state.setAnimation(0, sprite.action ? sprite.action : skeleton.defaultAction, sprite.loop); entry.mixDuration = 0; if (this.requestId == undefined) { this.running = true; if (!this.offscreen) this.canvas.style.visibility = 'visible'; this.requestId = requestAnimationFrame(this.render.bind(this)); } sprite.referBounds = undefined; return sprite; }; AnimationPlayer.prototype.loopSpine = function (sprite, position) { if (typeof sprite == 'string') { sprite = { name: sprite, loop: true, } } else { sprite.loop = true; } return this.playSpine(sprite, position); }; AnimationPlayer.prototype.stopSpine = function (sprite) { var nodes = this.nodes; var id = sprite.id == undefined ? sprite : sprite.id; for (var i = 0; i < nodes.length; i++) { sprite = nodes[i]; if (sprite.id == id) { if (!sprite.completed) { sprite.completed = true; sprite.skeleton.state.setEmptyAnimation(0); } return sprite; } } return null; }; AnimationPlayer.prototype.stopSpineAll = function () { var sprite; var nodes = this.nodes; for (var i = 0; i < nodes.length; i++) { sprite = nodes[i]; if (!sprite.completed) { sprite.completed = true; sprite.skeleton.state.setEmptyAnimation(0); } } }; AnimationPlayer.prototype.getSpineActions = function (filename) { if (!this.hasSpine(filename)) return console.error('getSpineActions: [' + filename + '] 骨骼没有加载');; var skeleton; var skeletons = this.spine.skeletons; for (var i = 0; i < skeletons.length; i++) { skeleton = skeletons[i]; if (skeleton.name == filename) break; skeleton = undefined; } if (skeleton == undefined) skeleton = this.prepSpine(filename); var actions = skeleton.data.animations; var result = new Array(actions.length); for (var i = 0; i < actions.length; i++) result[i] = { name: actions[i].name, duration: actions[i].duration }; return result; }; AnimationPlayer.prototype.getSpineBounds = function (filename) { if (!this.hasSpine(filename)) return console.error('getSpineBounds: [' + filename + '] 骨骼没有加载');; if (!this.resized) { var dpr = 1; if (this.dprAdaptive == true) dpr = Math.max(window.devicePixelRatio * (window.documentZoom ? window.documentZoom : 1), 1); canvas.elementHeight = canvas.clientHeight; canvas.elementWidth = canvas.clientWidth; canvas.height = canvas.elementHeight * dpr; canvas.width = canvas.elementWidth * dpr; } var skeleton; var skeletons = this.spine.skeletons; for (var i = 0; i < skeletons.length; i++) { skeleton = skeletons[i]; if (skeleton.name == filename) break; skeleton = undefined; } if (skeleton == undefined) skeleton = this.prepSpine(filename); return skeleton.bounds; }; AnimationPlayer.prototype.render = function (timestamp) { var canvas = this.canvas; var offscreen = this.offscreen; var dpr = 1; if (this.dprAdaptive) { if (offscreen) dpr = this.dpr != undefined ? this.dpr : 1; else dpr = Math.max(window.devicePixelRatio * (window.documentZoom ? window.documentZoom : 1), 1); } var delta = timestamp - ((this.frameTime == undefined) ? timestamp : this.frameTime); this.frameTime = timestamp; var erase = true; var resize = !this.resized || canvas.width == 0 || canvas.height == 0; if (resize) { this.resized = true; if (!offscreen) { canvas.width = dpr * canvas.clientWidth; canvas.height = dpr * canvas.clientHeight; erase = false; } else { if (this.width) { canvas.width = dpr * this.width; erase = false; } if (this.height) { canvas.height = dpr * this.height; erase = false; } } } var ea = { dpr: dpr, delta: delta, canvas: canvas, frameTime: timestamp, }; var nodes = this.nodes; for (var i = 0; i < nodes.length; i++) { if (!nodes[i].completed) { nodes[i].update(ea); } else { nodes.remove(nodes[i]); i--; } } var gl = this.gl; gl.viewport(0, 0, canvas.width, canvas.height); if (erase) { gl.clearColor(0, 0, 0, 0); gl.clear(gl.COLOR_BUFFER_BIT); } if (nodes.length == 0) { this.frameTime = void 0; this.requestId = void 0; this.running = false; if (!offscreen) this.canvas.style.visibility = 'hidden'; return; } var sprite, state, skeleton; var shader = this.spine.shader; var batcher = this.spine.batcher; var renderer = this.spine.skeletonRenderer; gl.enable(gl.SCISSOR_TEST); gl.scissor(0, 0, canvas.width, canvas.height); if (this.bindShader == undefined) { this.bindShader = shader; shader.bind(); shader.setUniformi(spine.webgl.Shader.SAMPLER, 0); } var speed; for (var i = 0; i < nodes.length; i++) { sprite = nodes[i]; if (sprite.renderClip != undefined) { gl.clipping = sprite.renderClip; gl.scissor(gl.clipping.x, gl.clipping.y, gl.clipping.width, gl.clipping.height); } skeleton = sprite.skeleton; state = skeleton.state; speed = sprite.speed == undefined ? 1 : sprite.speed; skeleton.flipX = sprite.flipX; skeleton.flipY = sprite.flipY skeleton.opacity = (sprite.renderOpacity == undefined ? 1 : sprite.renderOpacity); state.hideSlots = sprite.hideSlots; state.update(delta / 1000 * speed); state.apply(skeleton); skeleton.updateWorldTransform(); shader.setUniform4x4f(spine.webgl.Shader.MVP_MATRIX, sprite.mvp.values); batcher.begin(shader); renderer.premultipliedAlpha = sprite.premultipliedAlpha; renderer.outcropMask = this.outcropMask; if (renderer.outcropMask) { renderer.outcropX = sprite.renderX; renderer.outcropY = sprite.renderY; renderer.outcropScale = sprite.renderScale; renderer.outcropAngle = sprite.renderAngle; renderer.clipSlots = sprite.clipSlots; } renderer.hideSlots = sprite.hideSlots; renderer.disableMask = sprite.disableMask; renderer.draw(batcher, skeleton); batcher.end(); if (gl.clipping) { gl.clipping = undefined; gl.scissor(0, 0, canvas.width, canvas.height); } } gl.disable(gl.SCISSOR_TEST); this.requestId = requestAnimationFrame(this.render.bind(this)); }; return AnimationPlayer; })(); duilib.AnimationPlayerPool = (function () { function AnimationPlayerPool(size, pathPrefix, thisName) { if (!self.spine) return console.error('spine 未定义.'); this.name = thisName; this.animations = new Array(size ? size : 1); for (var i = 0; i < this.animations.length; i++) this.animations[i] = new duilib.AnimationPlayer(pathPrefix); }; AnimationPlayerPool.prototype.loadSpine = function (filename, skelType, onload, onerror) { var thisAnim = this; thisAnim.animations[0].loadSpine(filename, skelType, function () { var ap; var aps = thisAnim.animations; for (var i = 1; i < aps.length; i++) { ap = aps[i]; if (window.requestIdleCallback) { requestIdleCallback(ap.prepSpine.bind(ap, this.name, true), { timeout: 200 }); } else { setTimeout(function (ap, name) { ap.prepSpine(name, true); }, 50, ap, this.name); } } if (onload) onload(); }, onerror); }; AnimationPlayerPool.prototype.playSpineTo = function (element, animation, position) { var animations = this.animations; if (position && position.parent) { position.parent = undefined; console.log('playSpineTo: position.parent 参数已忽略'); } if (element._ap && element._ap.canvas.parentNode == element) { element._ap.playSpine(animation, position); return; } for (var i = 0; i < animations.length; i++) { if (!animations[i].running) { if (animations[i].canvas.parentNode != element) { element._ap = animations[i]; element.appendChild(animations[i].canvas); } animations[i].playSpine(animation, position); return; } } console.error('spine:' + (this.name != null ? this.name : '' + '可用动画播放组件不足')); }; return AnimationPlayerPool; })(); duilib.BUILT_ID = 0; duilib.DynamicWorkers = new Array(2); duilib.DynamicPlayer = (function () { function DynamicPlayer(pathPrefix) { this.id = duilib.BUILT_ID++; this.dpr = 1; this.width = 120; this.height = 180; this.dprAdaptive = false; this.BUILT_ID = 0; var offscreen = self.OffscreenCanvas != undefined; if (offscreen) { offscreen = false; var workers = duilib.DynamicWorkers; for (var i = 0; i < workers.length; i++) { if (workers[i] == undefined) { workers[i] = new Worker(decadeUIPath + 'dynamicWorker.js'); workers[i].capacity = 0; } else if (workers[i].capacity >= 4) { continue; } this.renderer = workers[i]; this.canvas = document.createElement('canvas'); this.canvas.className = 'animation-player'; duilib.observeSize(this.canvas, duilib.throttle(function (newSize) { this.height = Math.round(newSize.height); this.width = Math.round(newSize.width); this.update(); }, 100, this)); var canvas = this.canvas.transferControlToOffscreen(); workers[i].postMessage({ message: 'CREATE', id: this.id, canvas: canvas, pathPrefix: pathPrefix, }, [canvas]); workers[i].capacity++; this.offscreen = offscreen = true; break; } } if (!offscreen) { var renderer = new duilib.AnimationPlayer(decadeUIPath + pathPrefix); this.canvas = renderer.canvas; this.renderer = renderer; dui.bodySensor.addListener(duilib.throttle(function () { this.renderer.resized = false; }, 100, this), true); } } DynamicPlayer.prototype.play = function (sprite) { var sprite = (typeof sprite == 'string') ? { name: sprite } : sprite; sprite.id = this.BUILT_ID++; sprite.loop = true; if (this.offscreen) { if (!this.initialized) { this.initialized = true; this.dpr = Math.max(window.devicePixelRatio * (window.documentZoom ? window.documentZoom : 1), 1); this.height = this.canvas.clientHeight; this.width = this.canvas.clientWidth; } if (typeof sprite.oncomplete == 'function') sprite.oncomplete = sprite.oncomplete.toString(); this.renderer.postMessage({ message: 'PLAY', id: this.id, dpr: this.dpr, dprAdaptive: this.dprAdaptive, outcropMask: this.outcropMask, useMipMaps: this.useMipMaps, width: this.width, height: this.height, sprite: sprite, }); } else { var dynamic = this.renderer; dynamic.useMipMaps = this.useMipMaps; dynamic.dprAdaptive = this.dprAdaptive; dynamic.outcropMask = this.outcropMask; var run = function () { var t = dynamic.playSpine(sprite); t.opacity = 0; t.fadeTo(1, 600); }; if (dynamic.hasSpine(sprite.name)) { run(); } else { dynamic.loadSpine(sprite.name, 'skel', run); } } return sprite; }; DynamicPlayer.prototype.stop = function (sprite) { if (this.offscreen) { this.renderer.postMessage({ message: 'STOP', id: this.id, sprite: sprite, }); return; } this.renderer.stopSpine(sprite); }; DynamicPlayer.prototype.stopAll = function () { if (this.offscreen) { this.renderer.postMessage({ message: 'STOPALL', id: this.id }); return; } this.renderer.stopSpineAll(); }; DynamicPlayer.prototype.update = function (force) { if (!this.offscreen) { this.renderer.resized = false; this.renderer.useMipMaps = this.useMipMaps; this.renderer.dprAdaptive = this.dprAdaptive; this.renderer.outcropMask = this.outcropMask; return; } this.dpr = Math.max(window.devicePixelRatio * (window.documentZoom ? window.documentZoom : 1), 1); if (force === false) return; this.renderer.postMessage({ message: 'UPDATE', id: this.id, dpr: this.dpr, dprAdaptive: this.dprAdaptive, outcropMask: this.outcropMask, useMipMaps: this.useMipMaps, width: this.width, height: this.height, }); } return DynamicPlayer; })(); })(duilib || (duilib = {})); var decadeModule; if (decadeModule) decadeModule.import(function (lib, game, ui, get, ai, _status) { decadeUI.animation = (function () { var animation = new decadeUI.AnimationPlayer(decadeUIPath + 'assets/animation/', document.body, 'decadeUI-canvas'); decadeUI.bodySensor.addListener(function () { animation.resized = false; }, true); animation.cap = new decadeUI.AnimationPlayerPool(4, decadeUIPath + 'assets/animation/', 'decadeUI.animation'); var fileList = [ { name: 'effect_youxikaishi' }, { name: 'effect_baguazhen' }, { name: 'effect_baiyinshizi' }, { name: 'effect_cixiongshuanggujian' }, { name: 'effect_fangtianhuaji' }, { name: 'effect_guanshifu' }, { name: 'effect_gudingdao' }, { name: 'effect_hanbingjian' }, { name: 'effect_qilingong' }, { name: 'effect_qinggangjian' }, { name: 'effect_qinglongyanyuedao' }, { name: 'effect_renwangdun' }, { name: 'effect_shoujidonghua' }, { name: 'effect_tengjiafangyu' }, { name: 'effect_tengjiaranshao' }, { name: 'effect_zhangbashemao' }, { name: 'effect_zhiliao' }, { name: 'effect_zhugeliannu' }, { name: 'effect_zhuqueyushan' }, { name: 'effect_jinhe' }, { name: 'effect_numa' }, { name: 'effect_nvzhuang' }, { name: 'effect_wufengjian' }, { name: 'effect_yajiaoqiang' }, { name: 'effect_yinfengjia' }, { name: 'effect_zheji' }, { name: 'effect_jisha1' }, { name: 'effect_zhenwang' }, { name: 'effect_lebusishu' }, { name: 'effect_bingliangcunduan' }, { name: 'effect_nanmanruqin' }, { name: 'effect_taoyuanjieyi' }, { name: 'effect_shandian' }, { name: 'effect_wanjianqifa_full' }, { name: 'effect_xianding', fileType: 'json' }, { name: 'effect_caochuanjiejian', follow: true }, { name: 'effect_guohechaiqiao', follow: true }, { name: 'effect_leisha', follow: true }, { name: 'effect_heisha', follow: true }, { name: 'effect_huosha', follow: true }, { name: 'effect_hongsha', follow: true }, { name: 'effect_huogong', follow: true }, { name: 'effect_panding', follow: true }, { name: 'effect_shan', follow: true }, { name: 'effect_tao', follow: true }, { name: 'effect_tiesuolianhuan', follow: true }, { name: 'effect_jiu', follow: true }, { name: 'effect_shunshouqianyang', follow: true }, { name: 'effect_shushangkaihua', follow: true }, { name: 'effect_wanjianqifa', follow: true }, { name: 'effect_wuzhongshengyou', follow: true }, { name: 'effect_wuxiekeji', follow: true }, { name: 'effect_wugufengdeng', follow: true }, { name: 'effect_yuanjiaojingong', follow: true }, { name: 'effect_zhijizhibi', follow: true }, { name: 'effect_zhulutianxia', follow: true }, ]; var fileNameList = fileList.concat(); var read = function () { if (fileNameList.length) { var file = fileNameList.shift(); if (file.follow) { // 这个是专门播放追踪卡牌的动画,调用方式 decadeUI.animation.cap.playSpineTo(element, animation, position); // 建议非追踪对象的特效不要滥用,因为每次导入1个骨骼会生成4个预制骨骼,资源占用较多 animation.cap.loadSpine(file.name, file.fileType, function () { read(); }); } else { // 这个是专门播放全屏位置的动画 animation.loadSpine(file.name, file.fileType, function () { read(); animation.prepSpine(this.name); }); } } }; read(); read(); var skillAnimation = (function () { var defines = { skill: { bagua_skill: { skill: 'bagua_skill', name: 'effect_baguazhen', scale: 0.6 }, baiyin_skill: { skill: 'baiyin_skill', name: 'effect_baiyinshizi', scale: 0.5 }, bazhen_bagua: { skill: 'bazhen_bagua', name: 'effect_baguazhen', scale: 0.6 }, cixiong_skill: { skill: 'cixiong_skill', name: 'effect_cixiongshuanggujian', scale: 0.5 }, fangtian_skill: { skill: 'fangtian_skill', name: 'effect_fangtianhuaji', scale: 0.7 }, guanshi_skill: { skill: 'guanshi_skill', name: 'effect_guanshifu', scale: 0.7 }, guding_skill: { skill: 'guding_skill', name: 'effect_gudingdao', scale: 0.6, x: [0, 0.4], y: [1, 0.25] }, hanbing_skill: { skill: 'hanbing_skill', name: 'effect_hanbingjian', scale: 0.5 }, linglong_bagua: { skill: 'linglong_bagua', name: 'effect_baguazhen', scale: 0.5 }, qilin_skill: { skill: 'qilin_skill', name: 'effect_qilingong', scale: 0.5 }, qinggang_skill: { skill: 'qinggang_skill', name: 'effect_qinggangjian', scale: 0.7 }, qinglong_skill: { skill: 'qinglong_skill', name: 'effect_qinglongyanyuedao', scale: 0.6 }, renwang_skill: { skill: 'renwang_skill', name: 'effect_renwangdun', scale: 0.5 }, tengjia1: { skill: 'tengjia1', name: 'effect_tengjiafangyu', scale: 0.6 }, tengjia2: { skill: 'tengjia2', name: 'effect_tengjiaranshao', scale: 0.6 }, tengjia3: { skill: 'tengjia3', name: 'effect_tengjiafangyu', scale: 0.6 }, zhangba_skill: { skill: 'zhangba_skill', name: 'effect_zhangbashemao', scale: 0.7 }, zhuge_skill: { skill: 'zhuge_skill', name: 'effect_zhugeliannu', scale: 0.5 }, zhuque_skill: { skill: 'zhuque_skill', name: 'effect_zhuqueyushan', scale: 0.6 }, jinhe_lose: { skill: 'jinhe_lose', name: 'effect_jinhe', scale: 0.4 }, numa: { skill: 'numa', name: 'effect_numa', scale: 0.4 }, nvzhuang: { skill: 'nvzhuang', name: 'effect_nvzhuang', scale: 0.5 }, wufengjian_skill: { skill: 'wufengjian_skill', name: 'effect_wufengjian', scale: 0.4 }, yajiaoqiang_skill: { skill: 'yajiaoqiang_skill', name: 'effect_yajiaoqiang', scale: 0.5 }, yinfengjia_skill: { skill: 'yinfengjia_skill', name: 'effect_yinfengjia', scale: 0.5 }, zheji: { skill: 'zheji', name: 'effect_zheji', scale: 0.35 }, lebu: { skill: 'lebu', name: 'effect_lebusishu', scale: 0.7 }, bingliang: { skill: 'bingliang', name: 'effect_bingliangcunduan', scale: 0.7 }, shandian: { skill: 'shandian', name: 'effect_shandian', scale: 0.7 }, }, card: { nanman: { card: 'nanman', name: 'effect_nanmanruqin', scale: 0.6, y: [0, 0.4] }, wanjian: { card: 'wanjian', name: 'effect_wanjianqifa_full', scale: 1.5 }, taoyuan: { card: 'taoyuan', name: 'effect_taoyuanjieyi' }, } } var cardAnimate = function (card) { var anim = defines.card[card.name]; if (!anim) return console.error('cardAnimate:' + card.name); animation.playSpine(anim.name, { x: anim.x, y: anim.y, scale: anim.scale }); }; for (var key in defines.card) { lib.animate.card[defines.card[key].card] = cardAnimate; } var skillAnimate = function (name) { var anim = defines.skill[name]; if (!anim) return console.error('skillAnimate:' + name); animation.playSpine(anim.name, { x: anim.x, y: anim.y, scale: anim.scale, parent: this }); }; for (var key in defines.skill) { lib.animate.skill[defines.skill[key].skill] = skillAnimate; } var trigger = { card: { nvzhuang: { onEquip: function () { if (player.sex == 'male' && player.countCards('he', function (cardx) { return cardx != card; })) { lib.animate.skill['nvzhuang'].call(player, 'nvzhuang'); player.chooseToDiscard(true, function (card) { return card != _status.event.card; }, 'he').set('card', card); } }, onLose: function () { if (player.sex != 'male') return; var next = game.createEvent('nvzhuang_lose'); event.next.remove(next); var evt = event.getParent(); if (evt.getlx === false) evt = evt.getParent(); evt.after.push(next); next.player = player; next.setContent(function () { if (player.countCards('he')) { lib.animate.skill['nvzhuang'].call(player, 'nvzhuang'); player.chooseToDiscard(true, 'he'); } }); } }, zheji: { onEquip: function () { lib.animate.skill['zheji'].call(player, 'zheji'); } }, numa: { onEquip: function () { lib.animate.skill['numa'].call(player, 'numa'); } }, lebu: { effect: function () { if (result.bool == false) { lib.animate.skill['lebu'].call(player, 'lebu'); player.skip('phaseUse'); } } }, bingliang: { effect: function () { if (result.bool == false) { if (get.is.changban()) { player.addTempSkill('bingliang_changban'); } else { lib.animate.skill['bingliang'].call(player, 'bingliang'); player.skip('phaseDraw'); } } } }, shandian: { effect: function () { if (result.bool == false) { lib.animate.skill['shandian'].call(player, 'shandian'); player.damage(3, 'thunder', 'nosource'); } else { player.addJudgeNext(card); } } }, }, }; for (var j in trigger.card) { if (lib.card[j]) { for (var k in trigger.card[j]) { lib.card[j][k] = trigger.card[j][k]; } } } })(); return animation; })(); decadeUI.backgroundAnimation = (function () { var animation = new decadeUI.AnimationPlayer(decadeUIPath + 'assets/dynamic/', document.body, 'decadeUI-canvas-background'); decadeUI.bodySensor.addListener(function () { animation.resized = false; }, true); animation.dprAdaptive = true; animation.definedAssets = { skin_xiaosha: { default: { name: 'skin_xiaosha_default', x: [0, 0.7], y: [0, 0.3], height: [0, 0.2], }, }, skin_daqiao: { 战场绝版: { name: 'skin_daqiao_ZhanChang', x: [0, 0.7], y: [75, 0.3], height: [0, 0.8], }, 清萧清丽: { name: 'skin_daqiao_QingXiaoQingLi', x: [0, 0.5], y: [0, 0.33], height: [0, 0.8], }, 衣垂绿川: { name: 'skin_daqiao_YiChuiLvChuan', action: 'DaiJi', x: [0, 0.5], y: [-100, 0.5], height: [0, 1.2], disableMask: true, } }, skin_caojie: { 凤历迎春: { name: 'skin_caojie_FengLiYingChun', y: [75, 0.3], height: [0, 1.5], }, 战场绝版: { name: 'skin_caojie_ZhanChang', x: [0, 0.7], y: [75, 0.3], height: [0, 0.8], }, }, skin_caoying: { 巾帼花舞: { name: 'fullskin_caoying_JinGuoHuaWu', x: [0, 0.4], y: [75, 0.3], height: [0, 0.9], }, }, skin_baosanniang: { 舞剑铸缘: { name: 'skin_baosanniang_WuJianZhuYuan', action: 'DaiJi', y: [75, 0.3], height: [0, 0.8], }, 漫花剑俏: { name: 'skin_baosanniang_ManHuaJianQiao', // x: [0, 0.7], y: [50, 0.3], height: [0, 0.8], }, }, skin_caiwenji: { 才颜双绝: { name: 'skin_caiwenji_CaiYanShuangJue', y: [-80, 0.5], height: [0, 0.8], }, }, skin_daqiaoxiaoqiao: { 战场绝版: { name: 'skin_daqiaoxiaoqiao_ZhanChang', //x: [0, 0.7], y: [75, 0.3], height: [0, 0.8], }, }, skin_diaochan: { 玉婵仙子: { name: 'skin_diaochan_YuChanXianZi', x: [0, 0.7], y: [75, 0.3], height: [0, 0.8], }, 战场绝版: { name: 'skin_diaochan_ZhanChang', y: [75, 0.3], height: [0, 1], }, }, skin_dongbai: { 娇俏伶俐: { name: 'skin_dongbai_JiaoQiaoLingLi', x: [0, 0.5], y: [0, 0.33], height: [0, 0.96], }, }, skin_fanyufeng: { 斟酒入情: { name: 'skin_fanyufeng_ZhenJiuRuQing', x: [0, 0.5], y: [0, 0.28], height: [0, 1], }, }, skin_fuhuanghou: { 万福千灯: { name: 'skin_fuhuanghou_WanFuQianDeng', //x: [0, 0.7], y: [75, 0.3], height: [0, 0.8], }, }, skin_guozhao: { 雍容尊雅: { name: 'skin_guozhao_YongRongZunYa', x: [0, 0.5], y: [0, 0.33], height: [0, 0.7], }, }, skin_hetaihou: { 鸩毒除患: { name: 'skin_hetaihou_ZhenDuChuHuan', y: [0, 0.33], height: [0, 0.65], }, 蛇蝎为心: { name: 'skin_hetaihou_SheXieWeiXin', action: 'DaiJi', y: [5, 0.33], height: [0, 0.76], hideSlots: 'jiubei', }, 耀紫迷幻: { name: 'skin_hetaihou_YaoZiMiHuan', y: [5, 0.33], height: [0, 0.76], }, }, skin_huaman: { 经典形象: { name: 'skin_huaman_default', x: [0, 0.7], y: [75, 0.3], height: [0, 0.8], }, 花俏蛮娇: { name: 'skin_huaman_HuaQiaoManJiao', x: [0, 0.7], y: [75, 0.3], height: [0, 0.8], } }, skin_lukang: { 毁堰破晋: { name: 'skin_lukang_HuiYanPoJin', x: [0, 0.7], y: [75, 0.3], height: [0, 0.8], }, }, skin_luxun: { 谋定天下: { name: 'skin_luxun_MouDingTianXia', x: [0, 0.7], y: [75, 0.3], height: [0, 0.8], }, }, skin_luxunlvmeng: { 清雨踏春: { name: 'skin_luxunlvmeng_QingYuTaChun', // x: [0, 0.7], y: [75, 0.3], height: [0, 0.8], }, }, skin_mayunlu: { 战场绝版: { name: 'skin_mayunlu_ZhanChang', x: [0, 0.6], y: [75, 0.3], height: [0, 0.8], }, }, skin_simashi: { 桀骜睥睨: { name: 'skin_simashi_JieAoPiNi', y: [75, 0.3], height: [0, 0.8], } }, skin_sundengzhoufei: { 鹊星夕情: { name: 'skin_sundengzhoufei_QueXingXiQing', // x: [0, 0.7], y: [75, 0.3], height: [0, 0.8], }, }, skin_sunluban: { 宵靥谜君: { name: 'skin_sunluban_XiaoYeMiJun', y: [75, 0.3], height: [0, 0.8], }, }, skin_sunluyu: { 娇俏伶俐: { name: 'skin_sunluyu_JiaoQiaoLingLi', y: [0, 0.3], height: [0, 0.9], }, }, skin_shuxiangxiang: { 花好月圆: { name: 'skin_shuxiangxiang_HuaHaoYueYuan', x: [0, 0.7], y: [75, 0.3], height: [0, 0.8], }, 花曳心牵: { name: 'skin_shuxiangxiang_HuaYeXinQian', x: [0, 0.5], y: [75, 0.3], height: [0, 0.8], }, }, skin_wangrong: { 云裳花容: { name: 'skin_wangrong_YunShangHuaRong', y: [75, 0.3], height: [0, 1], }, }, skin_wangyi: { 绝色异彩: { name: 'skin_wangyi_JueSeYiCai', x: [0, 0.7], y: [75, 0.3], height: [0, 0.8], }, 战场绝版: { name: 'skin_wangyi_ZhanChang', x: [0, 0.7], y: [75, 0.35], height: [0, 0.8], }, }, skin_wolongzhuge: { 隆中陇亩: { name: 'skin_wolongzhuge_LongZhongLongMu', // x: [0, 0.7], y: [75, 0.3], height: [0, 0.8], }, }, skin_wuxian: { 锦运福绵: { name: 'skin_wuxian_JinYunFuMian', y: [75, 0.3], height: [0, 0.8], }, 金玉满堂: { name: 'fullskin_wuxian_JinYuManTang', y: [0, 0.35], height: [0, 0.8], }, }, skin_xiahoushi: { 端华夏莲: { name: 'skin_xiahoushi_DuanHuaXiaLian', x: [0, 0.7], y: [75, 0.3], height: [0, 0.8], }, 战场绝版: { name: 'skin_xiahoushi_ZhanChang', y: [75, 0.3], height: [0, 0.8], }, }, skin_xiaoqiao: { 花好月圆: { name: 'skin_xiaoqiao_HuaHaoYueYuan', x: [0, 0.7], y: [75, 0.3], height: [0, 0.8], }, 采莲江南: { name: 'skin_xiaoqiao_CaiLianJiangNan', action: 'DaiJi', x: [0, 0.5], y: [-100, 0.5], height: [0, 1.2], } }, skin_xinxianying: { 英装素果: { name: 'skin_xinxianying_YingZhuangSuGuo', //x: [0, 0.7], y: [75, 0.26], //height: [0, 0.8], }, }, skin_xushi: { 拈花思君: { name: 'skin_xushi_NianHuaSiJun', x: [0, 0.7], y: [75, 0.3], height: [0, 0.8], }, 为夫弑敌: { name: 'skin_xushi_WeiFuShiDi', x: [0, 0.7], y: [75, 0.3], height: [0, 0.8], }, }, skin_zhangchangpu: { 钟桂香蒲: { name: 'skin_zhangchangpu_ZhongGuiXiangPu', x: [0, 0.7], y: [75, 0.3], height: [0, 0.8], }, }, skin_zhangchunhua: { 花好月圆: { name: 'skin_zhangchunhua_HuaHaoYueYuan', x: [0, 0.7], y: [75, 0.3], height: [0, 0.8], }, 战场绝版: { name: 'skin_zhangchunhua_ZhanChang', //x: [0, 0.7], y: [75, 0.3], height: [0, 0.8], }, }, skin_zhangqiying: { 岁稔年丰: { name: 'skin_zhangqiying_SuiRenNianFeng', y: [0, 0.33], height: [0, 0.8], }, 逐鹿天下: { name: 'skin_zhangqiying_ZhuLuTianXia', x: [0, 0.7], y: [75, 0.3], height: [0, 1], }, }, skin_zhangxingcai: { 凯旋星花: { name: 'skin_zhangxingcai_KaiXuanXingHua', x: [0, 0.45], y: [0, 0.33], height: [0, 0.8], }, }, skin_zhenji: { 才颜双绝: { name: 'skin_zhenji_CaiYanShuangJue', x: [0, 0.7], y: [75, 0.3], height: [0, 0.8], }, 洛神御水: { name: 'skin_zhenji_LuoShenYuShui', x: [0, 0.6], y: [75, 0.3], //height: [0, 0.8], }, }, skin_zhoufei: { 晴空暖鸢: { name: 'skin_zhoufei_QingKongNuanYuan', x: [0, 0.5], y: [0, 0.33], height: [0, 0.8], }, }, skin_zhugeguo: { 兰荷艾莲: { name: 'skin_zhugeguo_LanHeAiLian', x: [0, 0.7], y: [75, 0.3], height: [0, 0.8], }, 仙池起舞: { name: 'skin_zhugeguo_XianChiQiWU', action: 'DaiJi', x: [0, 0.48], y: [0, 0.35], height: [0, 1.5], }, 英装素果: { name: 'skin_zhugeguo_YingZhuangSuGuo', //x: [0, 0.7], y: [75, 0.3], //height: [0, 0.8], }, }, skin_zhugeliang: { 空城退敌: { name: 'skin_zhugeliang_KongChengTuiDi', x: [0, 0.7], y: [75, 0.3], height: [0, 0.8], }, }, skin_zhouyi: { 剑舞浏漓: { name: 'fullskin_zhouyi_JianWuLiuLi', y: [0, 0.5], height: [0, 1.2], }, }, }; animation.stop = animation.stopSpineAll; animation.play = function (name, skin) { var definedAssets = this.definedAssets; if (definedAssets[name] == void 0 || definedAssets[name][skin] == void 0) return console.log('没有预定义[asset:' + name + ', skin:' + skin + ']的动态背景.'); if (this.current && this.current.name == name) return; this.stopSpineAll(); var playAsset = definedAssets[name][skin]; if (!this.hasSpine(playAsset.name)) { var _this = this; _this.loadSpine(playAsset.name, 'skel', function () { if (_this.current && _this.current.name == playAsset.name) return; _this.current = _this.loopSpine(playAsset); }); } else { this.current = this.loopSpine(playAsset); } }; animation.check(); var background = duicfg.dynamicBackground if (background != void 0 && background != 'off') { var name = background.split('_'); var skin = name.splice(name.length - 1, 1)[0]; animation.play(name.join('_'), skin); } return animation; })(); // 下面是我自用的,可能会删掉 window.dcdAnim = decadeUI.animation; window.dcdBackAnim = decadeUI.backgroundAnimation; window.game = game; window.get = get; window.ui = ui; window._status = _status; });