Files
2024-07-20 15:46:46 +08:00

1925 lines
53 KiB
JavaScript

'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;
});