UNPKG

pubtool4pixi

Version:

Usefultool for PIXI xes project

1,489 lines (1,458 loc) 83.3 kB
'use strict'; import { setTimeout, setInterval, clearInterval } from './Timmer' import bindPolarProperty from './polar' // import { Container, Sprite, Text } from 'pixi.js'; import $ from 'jquery'; import Observable from './Observable'; import zorderAbility from "./zorderAbility" const Container = PIXI.Container; const Sprite = PIXI.Sprite; const Text = PIXI.Text; function moveInterface(obj) { let fn = obj.scale.set; obj.scale.set = function (x, y) { fn.call(obj, x, y); graphics1.clear(); graphics1.drawRect(-0.5 * obj.width || -100, -0.5 * obj.height || -100, obj.width || 200, obj.height || 200); }; let graphics1 = new PIXI.Graphics(); graphics1.beginFill(0x000000, 0.2); graphics1.drawRect(-0.5 * obj.width || -100, -0.5 * obj.height || -100, obj.width || 200, obj.height || 200); graphics1.interactive = true; let graphics2 = new PIXI.Graphics(); graphics2.beginFill(0xff0000, 0.2); graphics2.drawRect(-10, -10, 20, 20); graphics2.position.set(0.5 * obj.width || -100, -0.5 * obj.height || -100); graphics2.interactive = true; graphics2.on("pointerdown", function (e) { this.basePosition = {}; this.basePosition.x = e.data.global.x; this.basePosition.y = e.data.global.y; }); graphics2.on("pointermove", function (e) { if (this.basePosition) { let dx = e.data.global.x - this.basePosition.x; let dy = e.data.global.y - this.basePosition.y; let p = obj.toLocal(e.data.global, stage); graphics2.position.set(p.x, p.y); this.parent.scale.set(this.parent.scale.x + dx * 0.001, this.parent.scale.y - dy * 0.001); } }); graphics2.on("pointerup", function (e) { console.log("scale:", this.parent.scale.x, ",", this.parent.scale.y); delete this.basePosition; }); graphics2.on("pointerout", function (e) { console.log("scale:", this.parent.scale.x, ",", this.parent.scale.y); delete this.basePosition; }); graphics1.on("pointerup", function () { this.allowMove = false; console.log("Position:", this.parent.x, ",", this.parent.y); }); obj.addChild(graphics1, graphics2); let startPoint; graphics1.on("pointerdown", function (e) { this.allowMove = true; startPoint = obj.toLocal(e.data.global, stage); }); graphics1.on("pointermove", function (e) { if (this.allowMove) { let p = obj.parent.toLocal(e.data.global, stage); this.parent.position.set(p.x - startPoint.x, p.y - startPoint.y); } }); graphics1.on("pointerup", function () { this.allowMove = false; console.log("Position:", this.parent.x, ",", this.parent.y); }); } function getPoint(p1, p2, a) { return { x: p1.x + a * (p2.x - p1.x), y: p1.y + a * (p2.y - p1.y) }; } function FN(aPoint, a) { let arrLine = []; for (let i = 1; i < aPoint.length; i++) { let p1 = aPoint[i - 1]; let p2 = aPoint[i] arrLine.push([p1, p2]); } let Point = []; for (let i = 0; i < arrLine.length; i++) { let p1 = arrLine[i][0]; let p2 = arrLine[i][1]; Point.push(getPoint(p1, p2, a)); } if (Point.length > 1) { return FN(Point, a); } return Point[0]; } function Fn1(star, end, aBezierPoint, TotalTime) { let arr = [{ x: 0, y: star }]; arr.push.apply(arr, aBezierPoint); arr.push({ x: TotalTime, y: end }); return function (time) { return FN(arr, time / TotalTime); }; } let AniFun = { linear: function (t, b, c, d) { return (c - b) / d * t + b; }, easeInQuad: function (t, b, c, d) { return c * (t /= d) * t + b; }, easeOutQuad: function (t, b, c, d) { return -c * (t /= d) * (t - 2) + b; }, easeInOutQuad: function (t, b, c, d) { if ((t /= d / 2) < 1) return c / 2 * t * t + b; return -c / 2 * ((--t) * (t - 2) - 1) + b; }, easeInCubic: function (t, b, c, d) { return c * (t /= d) * t * t + b; }, easeOutCubic: function (t, b, c, d) { return c * ((t = t / d - 1) * t * t + 1) + b; }, easeInOutCubic: function (t, b, c, d) { if ((t /= d / 2) < 1) return c / 2 * t * t * t + b; return c / 2 * ((t -= 2) * t * t + 2) + b; }, easeInQuart: function (t, b, c, d) { return c * (t /= d) * t * t * t + b; }, easeOutQuart: function (t, b, c, d) { return -c * ((t = t / d - 1) * t * t * t - 1) + b; }, easeInOutQuart: function (t, b, c, d) { if ((t /= d / 2) < 1) return c / 2 * t * t * t * t + b; return -c / 2 * ((t -= 2) * t * t * t - 2) + b; }, easeInQuint: function (t, b, c, d) { return c * (t /= d) * t * t * t * t + b; }, easeOutQuint: function (t, b, c, d) { return c * ((t = t / d - 1) * t * t * t * t + 1) + b; }, easeInOutQuint: function (t, b, c, d) { if ((t /= d / 2) < 1) return c / 2 * t * t * t * t * t + b; return c / 2 * ((t -= 2) * t * t * t * t + 2) + b; }, easeInSine: function (t, b, c, d) { return -c * Math.cos(t / d * (Math.PI / 2)) + c + b; }, easeOutSine: function (t, b, c, d) { return c * Math.sin(t / d * (Math.PI / 2)) + b; }, easeInOutSine: function (t, b, c, d) { return -c / 2 * (Math.cos(Math.PI * t / d) - 1) + b; }, easeInExpo: function (t, b, c, d) { return (t == 0) ? b : c * Math.pow(2, 10 * (t / d - 1)) + b; }, easeOutExpo: function (t, b, c, d) { return (t == d) ? b + c : c * (-Math.pow(2, -10 * t / d) + 1) + b; }, easeInOutExpo: function (t, b, c, d) { if (t == 0) return b; if (t == d) return b + c; if ((t /= d / 2) < 1) return c / 2 * Math.pow(2, 10 * (t - 1)) + b; return c / 2 * (-Math.pow(2, -10 * --t) + 2) + b; }, easeInCirc: function (t, b, c, d) { return -c * (Math.sqrt(1 - (t /= d) * t) - 1) + b; }, easeOutCirc: function (t, b, c, d) { return c * Math.sqrt(1 - (t = t / d - 1) * t) + b; }, easeInOutCirc: function (t, b, c, d) { if ((t /= d / 2) < 1) return -c / 2 * (Math.sqrt(1 - t * t) - 1) + b; return c / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1) + b; }, easeInElastic: function (t, b, c, d) { var s = 1.70158; var p = 0; var a = c; if (t == 0) return b; if ((t /= d) == 1) return b + c; if (!p) p = d * .3; if (a < Math.abs(c)) { a = c; var s = p / 4; } else var s = p / (2 * Math.PI) * Math.asin(c / a); return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b; }, easeOutElastic: function (t, b, c, d) { var s = 1.70158; var p = 0; var a = c; if (t == 0) return b; if ((t /= d) == 1) return b + c; if (!p) p = d * .3; if (a < Math.abs(c)) { a = c; var s = p / 4; } else var s = p / (2 * Math.PI) * Math.asin(c / a); return a * Math.pow(2, -10 * t) * Math.sin((t * d - s) * (2 * Math.PI) / p) + c + b; }, easeInOutElastic: function (t, b, c, d) { var s = 1.70158; var p = 0; var a = c; if (t == 0) return b; if ((t /= d / 2) == 2) return b + c; if (!p) p = d * (.3 * 1.5); if (a < Math.abs(c)) { a = c; var s = p / 4; } else var s = p / (2 * Math.PI) * Math.asin(c / a); if (t < 1) return -.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p)) + b; return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t * d - s) * (2 * Math.PI) / p) * .5 + c + b; }, easeInBack: function (t, b, c, d, s) { if (s == undefined) s = 1.70158; return c * (t /= d) * t * ((s + 1) * t - s) + b; }, easeOutBack: function (t, b, c, d, s) { if (s == undefined) s = 1.70158; return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b; }, easeInOutBack: function (t, b, c, d, s) { if (s == undefined) s = 1.70158; if ((t /= d / 2) < 1) return c / 2 * (t * t * (((s *= (1.525)) + 1) * t - s)) + b; return c / 2 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2) + b; }, easeInBounce: function (t, b, c, d) { return c - AniFun.easeOutBounce(d - t, 0, c, d) + b; }, easeOutBounce: function (t, b, c, d) { if ((t /= d) < (1 / 2.75)) { return c * (7.5625 * t * t) + b; } else if (t < (2 / 2.75)) { return c * (7.5625 * (t -= (1.5 / 2.75)) * t + .75) + b; } else if (t < (2.5 / 2.75)) { return c * (7.5625 * (t -= (2.25 / 2.75)) * t + .9375) + b; } else { return c * (7.5625 * (t -= (2.625 / 2.75)) * t + .984375) + b; } }, easeInOutBounce: function (t, b, c, d) { if (t < d / 2) return AniFun.easeInBounce(t * 2, 0, c, d) * .5 + b; return AniFun.easeOutBounce(t * 2 - d, 0, c, d) * .5 + c * .5 + b; } }; //t:时间、b:起始位置、c:结束位置、d:总时长 function getAniFun(name, b, c, d) { let dist = c - b; return function (t) { return b + AniFun[name](t, 0, dist, d); }; } function playSound(type, isLoop, opt) { try { if (type == "bg" || isLoop) { return PIXI.sound.play("audio_" + type, { loop: true }); } else { return PIXI.sound.play("audio_" + type, opt); } } catch (e) { try { return PIXI.sound.play("pub_" + type, opt); } catch (e) { } } } function stopPlay(type) { try { if (type == "bg") { PIXI.sound.stop("audio_" + type); } else { PIXI.sound.stop("audio_" + type); } } catch (e) { try { PIXI.sound.stop("pub_" + type); } catch (e) { } } } function getAni(name) { return new PIXI.spine.Spine(this.res["animation_" + name].spineData); } let AniObj = { getAni: getAni, getAniFun: getAniFun, playSound: playSound, stopPlay: stopPlay, getBezier: Fn1 }; function clickInterface() { let x = 0; let y = 0; let name = this.ClickSprite.name; let isPlaySound = !(this.ClickSprite.isPlaySound === false); let container = this; let sprite = new PIXI.Sprite(this.res[name].texture); let graphics1 = new PIXI.Graphics(); container.allowClick = () => { return true; }; graphics1.Sprite = sprite; graphics1.textureUnClick = this.res[name].texture; graphics1.textureClick = this.res[name + 'click'] && this.res[name + 'click'].texture || graphics1.textureUnClick; graphics1.textureOver = this.res[name + 'over'] && this.res[name + 'over'].texture || graphics1.textureUnClick; sprite.buttonMode = true; sprite.interactive = true; graphics1.on("pointerdown", function () { if (container.allowClick()) { this.Sprite.texture = this.textureClick; this._isClick = true; } }); graphics1.on("touchend", function () { this.Sprite.texture = this.textureUnClick; this._isClick = false; }); graphics1.on("mouseup", function () { this.Sprite.texture = this.textureUnClick; this._isClick = false; }); graphics1.on("pointermove", function (e) { if (!container.allowClick()) { return; } if (this._isClick && !graphics1.containsPoint(e.data.global)) { this.Sprite.texture = this.textureUnClick; this._isClick = false; } else if (this._isClick) { this.Sprite.texture = this.textureClick; } else if (!this._isClick && graphics1.containsPoint(e.data.global)) { this.Sprite.texture = this.textureOver } else { this.Sprite.texture = this.textureUnClick; } }); if (isPlaySound === true) { graphics1.on("pointertap", () => { this.playSound("click"); }); } sprite.anchor.set(0, 1); sprite.x = x; sprite.y = y + sprite.height; graphics1.beginFill(0x000000, 0); graphics1.drawRect(sprite.x, sprite.y - sprite.height, sprite.width, sprite.height); graphics1.alpha = 1; graphics1.interactive = true; graphics1.buttonMode = true; graphics1.on("pointertap", () => { this.fireEvent("onClick"); }); container.on = (event, fn, context) => { graphics1.on(event, fn, context); }; container.once = (event, fn, context) => { graphics1.once(event, fn, context); }; container.removeListener = (event, fn, context, once) => { graphics1.removeListener(event, fn, context, once); }; container._events = graphics1._events; container.range = graphics1; container.addChild(sprite, graphics1); container.Width = sprite.width; container.Height = sprite.height; container.resetTexture = function () { sprite.texture = graphics1.textureUnClick; graphics1._isClick = false; } return container; } /** * @class BaseContainer * @classdesc 组件基类. * @param {object} res 资源对象. * @param {boolean} isPolar 是否采用极坐标定位. * * @property {object} parentContainer 组件父容器 */ class BaseContainer extends Container { constructor(res, isPolar = false) { super(); Observable(this); zorderAbility(this); $.extend(true, this, AniObj); this.res = res; Object.defineProperty(this, "parentContainer", { get: () => { return this["_parentContainer"]; }, set: (para) => { this["_parentContainer"] = para; /** * Parent Change Event. * @memberOf BaseContainer * @event ParentChange */ this.fireEvent("ParentChange"); } }); this.addEvent("parentChange", () => { this.isAdd2Parent = false; }); if (isPolar) { bindPolarProperty(this, this); } this.addEvent("created", this.BindTool); } BindTool() { if (this.ClickSprite) { clickInterface.call(this); } if (this.TrackMode) { this.addEventOnce("onShow", () => { moveInterface(this); }); } } setParent(parent) { this.parentContainer = parent; } getSprite() { return this; } getParentContainer() { return this.parentContainer; } add2Parent(hasMask) { if (this.isAdd2Parent) { return; } this.isAdd2Parent = true; if (hasMask) { if (!this.mask) { this.mask = new PIXI.Sprite(this.res['mask'].texture); this.mask.interactive = true; } this.parentContainer && this.parentContainer.addChild(this.mask); } this.parentContainer && this.parentContainer.addChild(this.getSprite()); } remove2Parent() { if (!this.isAdd2Parent) { return; } this.isAdd2Parent = false; if (this.mask) { this.parentContainer && this.parentContainer.removeChild(this.mask); } this.parentContainer && this.parentContainer.removeChild(this.getSprite()); } /** * show function. * @function show * @memberOf BaseContainer * @param {boolean} Is the container displayed immediately */ show(isNow) { if (this.isSlow && !isNow) { /** * beforeShow Event. * @memberOf BaseContainer * @event beforeShow * @description Fired before the instance show */ this.fireEvent("beforeShow"); this.add2Parent(); this.alpha = 0; this.showItem(this.getSprite(), () => { /** * onShow Event. * @memberOf BaseContainer * @event onShow * @description Fired after the instance show */ this.fireEvent("onShow"); }); } else { this.fireEvent("beforeShow"); this.add2Parent(); this.alpha = 1; this.fireEvent("onShow"); } this._isShow = true; return this; } /** * hide function. * @function hide * @memberOf BaseContainer * @param {boolean} Is the container hided immediately */ hide(isNow) { if (this.isSlow && !isNow) { /** * beforeHide Event. * @memberOf BaseContainer * @event beforeHide * @description Fired before the instance hide */ this.fireEvent("beforeHide"); this.hideItem(this.getSprite(), () => { this.remove2Parent(); /** * onHide Event. * @memberOf BaseContainer * @event onHide * @description Fired after the instance hide */ this.fireEvent("onHide"); }); } else { this.fireEvent("beforeHide"); this.remove2Parent(); this.fireEvent("onHide"); } this._isShow = false; return this; } hideItem(item, cb) { let TotalTime = this.AniTime || 800; let fn = getAniFun("linear", item.alpha, 0, TotalTime); let time = new Date().getTime(); if (item.Iteminterval) { clearInterval(item.Iteminterval); } let interval = setInterval(() => { let dt = new Date().getTime() - time; item.alpha = fn(dt); if (dt >= TotalTime) { clearInterval(interval); item.alpha = 0; item.Iteminterval = null; cb && cb(); } }); item.Iteminterval = interval; } showItem(item, cb) { let TotalTime = this.AniTime || 800; let fn = getAniFun("linear", item.alpha, 1, TotalTime); let time = new Date().getTime(); if (item.Iteminterval) { clearInterval(item.Iteminterval); } let interval = setInterval(() => { let dt = new Date().getTime() - time; item.alpha = fn(dt); if (dt >= TotalTime) { item.alpha = 1; clearInterval(interval); item.Iteminterval = null; cb && cb(); } }); item.Iteminterval = interval; } /** * @function reset * @memberOf BaseContainer * @description remove all event and redo init function */ reset() { this.removeChildren(); this.removeAllListeners(); this.removeAllEvent(); this.init(); } /** * @function Destroy * @memberOf BaseContainer * @description Destroy the instance */ Destroy() { this.parent && this.parent.removeChild(this); this.destroy && this.destroy(); delete this._Easy.InstanceMap[this.id]; /** * Destroyed Event. * @memberOf BaseContainer * @event Destroyed * @description Fired when the instance destroyed */ this.fireEvent("Destroyed"); } } let oldSpine = PIXI.spine.Spine; let stateUpdate = function (delta) { delta *= this.timeScale; var tracks = this.tracks; for (var i = 0, n = tracks.length; i < n; i++) { var current = tracks[i]; if (current == null) continue; current.animationLast = current.nextAnimationLast; current.trackLast = current.nextTrackLast; var currentDelta = delta * current.timeScale; if (current.delay > 0) { current.delay -= currentDelta; if (current.delay > 0) continue; currentDelta = -current.delay; current.delay = 0; } var next = current.next; if (next != null) { var nextTime = current.trackLast - next.delay; if (nextTime >= 0) { next.delay = 0; next.trackTime = nextTime + delta * next.timeScale; current.trackTime += currentDelta; this.setCurrent(i, next, true); while (next.mixingFrom != null) { next.mixTime += currentDelta; next = next.mixingFrom; } continue; } } else if (current.trackLast >= current.trackEnd && current.mixingFrom == null) { tracks[i] = null; this.queue.end(current); this.disposeNext(current); continue; } if (current.mixingFrom != null && this.updateMixingFrom(current, delta)) { var from = current.mixingFrom; current.mixingFrom = null; while (from != null) { this.queue.end(from); from = from.mixingFrom; } } if (this.isStop) { if (this.stopTime !== undefined) { current.trackTime = this.stopTime; } continue; } current.trackTime += currentDelta; } this.queue.drain(); }; let stateReverseUpdate = function (delta) { if (this.isStop) { return; } delta *= this.timeScale; var tracks = this.tracks; for (var i = 0, n = tracks.length; i < n; i++) { var current = tracks[i]; if (current == null) continue; current.animationLast = current.nextAnimationLast; current.trackLast = current.nextTrackLast; var currentDelta = delta * current.timeScale; if (current.delay > 0) { current.delay -= currentDelta; if (current.delay > 0) continue; currentDelta = -current.delay; current.delay = 0; } var next = current.next; if (next != null) { var nextTime = current.trackLast - next.delay; if (nextTime >= 0) { next.delay = 0; next.trackTime = nextTime + delta * next.timeScale; current.trackTime += currentDelta; this.setCurrent(i, next, true); while (next.mixingFrom != null) { next.mixTime += currentDelta; next = next.mixingFrom; } continue; } } else if (current.trackLast >= current.trackEnd && current.mixingFrom == null) { tracks[i] = null; this.queue.end(current); this.disposeNext(current); continue; } if (current.mixingFrom != null && this.updateMixingFrom(current, delta)) { var from = current.mixingFrom; current.mixingFrom = null; while (from != null) { this.queue.end(from); from = from.mixingFrom; } } if (this.isStop) { if (this.stopTime) { current.trackTime = this.stopTime; } continue; } current.trackTime -= currentDelta; if (current.trackTime <= 0) { current.trackTime = 0; } } this.queue.drain(); }; function animation(item, bool, x, y, B, s) { this.state.setAnimation(0, item, bool); this.x = x; this.y = y; this.interactive = B; this.buttonMode = B; this.state.timeScale = Math.random() * 0.3 + 1.0; if (s) { this.width = this.width / s; this.height = this.height / s } return this } function addSpine(itemFS1, itemFS2, x, y, t, s, cb) { this.state.setAnimation(0, itemFS1, false); this.x = x; this.y = y; if (s) { this.width = this.width / s; this.height = this.height / s } setTimeout(() => { if (this.state) { this.state.setAnimation(0, itemFS2, true); cb && cb(); } }, this.skeleton.data.animations[t].duration * 1000); return this } let spineFn = { setAni: function (name) { this.continueAni(); this.state.update = stateUpdate; this.fireEvent("beforeAni"); let track = this.state.setAnimation(0, name, false); let interval = setInterval(() => { me.fireEvent("onAni", [track]); }); let me = this; let listeners = { complete: function (track, event) { clearInterval(interval); me.state.removeListener(listeners); setTimeout(()=>{ me.fireEvent("onAniEnd", [track]); }); } }; this.state.addListener(listeners); return track; }, setAniLoop: function (name) { this.continueAni(); this.state.update = stateUpdate; return this.state.setAnimation(0, name, true); }, setAniReverse: function (name) { this.continueAni(); this.state.update = stateReverseUpdate; this.fireEvent("beforeAni"); let track = this.state.setAnimation(0, name, false); let interval = setInterval(() => { me.fireEvent("onAni"); }); let me = this; let listeners = { complete: function (track, event) { clearInterval(interval); me.state.removeListener(listeners); me.fireEvent("onAniEnd", [track]); } }; this.state.addListener(listeners); return track; }, stopAt: function (time) { this.state.isStop = true; this.state.stopTime = time; this.state.update = stateUpdate; }, continueAni: function () { this.state.isStop = false; this.state.stopTime = 0; } }; PIXI.spine.Spine = function (SpineData) { let obj = new oldSpine(SpineData); Observable(obj); // for(let i in spineFn){ // obj[i] = spineFn[i]; // } obj.setAni = function (name) { this.state.continueAni(); this.state.update = stateUpdate; this.fireEvent("beforeAni"); let track = this.state.setAnimation(0, name, false); track.trackTime = 0; let duration = track.animation.duration; let interval = setInterval(() => { obj.fireEvent("onAni", [track]); if (!track.animation) { clearInterval(interval); track.animation = { duration: 9999 }; obj.fireEvent("onAniEnd", [track]); } if (duration - track.trackTime <= 0.01 || !obj.parent) { clearInterval(interval); obj.fireEvent("onAniEnd", [track]); } }); return track; }; obj.setAniLoop = (name) => { obj.state.continueAni(); obj.state.update = stateUpdate; return obj.state.setAnimation(0, name, true); }; obj.setAniReverse = (name) => { obj.state.continueAni(); obj.state.update = stateReverseUpdate; let track = obj.state.setAnimation(0, name, false); track.trackTime = track.animation.duration; let interval = setInterval(() => { obj.fireEvent("onAni", track); if (track.trackTime === 0) { clearInterval(interval); obj.fireEvent("onAniEnd", track); } }); }; obj.state.stopAt = (time) => { obj.state.isStop = true; obj.state.stopTime = time; obj.state.update = stateUpdate; }; obj.state.continueAni = () => { obj.state.isStop = false; obj.state.stopTime = 0; }; obj.animation = animation; obj.addspine = addSpine; $.extend(obj, spineFn); return obj; }; /** * @class Base * @classdesc Easy基础类. * @property {object} Map 组件模板映射表 * @property {object} InstanceMap 实例映射表 * @property {object} randomId 随机ID记录器 */ class Base { constructor() { this.Map = {}; this.InstanceMap = {}; this.randomId = 0; } /** * @function define * @memberOf Base * @description Define a model * @param {string} className model's name * @param {object} prop model's prop */ define(className, prop = {}) { if (this.Map[className]) { throw new TypeError("This class has been defined"); } this.Map[className] = prop; } /** * @function create * @memberOf Base * @description Create a instance from model * @param {string} className model's name * @param {object} extraProp instance's prop * @return {BaseContainer} Return a instance which designed by model */ create(className, extraProp = {}, isBase) { let prop = $.extend(true, {}, this.Map[className], extraProp); let instance; if (prop.extend && (prop.extend !== className)) { let extendClassName = prop.extend; delete prop.extend; instance = easy.create(extendClassName, prop,true); delete instance.id; } else { instance = new BaseContainer(res, prop.isPolar); } $.extend(true, instance, prop, extraProp, { _className: className }); instance._ClassName = className; this.Map[className].init&&this.Map[className].init.call(instance) // prop.init && prop.init.call(instance); if (!isBase) { if (!instance.id) { instance.id = className; if (this.InstanceMap[instance.id]) { instance.id = className + this.randomId; this.randomId++; } } else if (this.InstanceMap[instance.id]) { throw new Error(instance.id + " has already been declared"); } this.InstanceMap[instance.id] = instance; instance.fireEvent("created"); instance._Easy = this; } return instance; } /** * @function getCmp * @memberOf Base * @description get a created instance * @param {string} id className or ID * @return {BaseContainer} A instance */ getCmp(id) { return this.InstanceMap[id]; } getClickSprite(name, x = 0, y = 0, isPlaySound = true) { let container = new PIXI.Container(); let sprite = new PIXI.Sprite(this.res[name].texture); let graphics1 = new PIXI.Graphics(); graphics1.Sprite = sprite; graphics1.textureUnClick = this.res[name].texture; graphics1.textureClick = this.res[name + 'click'] && this.res[name + 'click'].texture || graphics1.textureUnClick; sprite.buttonMode = true; sprite.interactive = true; graphics1.on("pointerdown", function () { this.Sprite.texture = this.textureClick; this._isClick = true; }); graphics1.on("pointerup", function () { this.Sprite.texture = this.textureUnClick; this._isClick = false; }); graphics1.on("pointermove", function (e) { if (this._isClick && !graphics1.containsPoint(e.data.global)) { console.log("out"); this.Sprite.texture = this.textureUnClick; this._isClick = false; } else if (this._isClick) { this.Sprite.texture = this.textureClick; } }); if (isPlaySound === true) { graphics1.on("pointertap", () => { this.playSound("click"); }); } sprite.anchor.set(0, 1); sprite.x = x; sprite.y = y + sprite.height; graphics1.beginFill(0x000000, 0); graphics1.drawRect(sprite.x, sprite.y - sprite.height, sprite.width, sprite.height); graphics1.alpha = 1; graphics1.interactive = true; graphics1.buttonMode = true; container.on = (event, fn, context) => { graphics1.on(event, fn, context); }; container.once = (event, fn, context) => { graphics1.once(event, fn, context); }; container.removeListener = (event, fn, context, once) => { graphics1.removeListener(event, fn, context, once); }; container._events = graphics1._events; container.range = graphics1; container.addChild(sprite, graphics1); container.Width = sprite.width; container.Height = sprite.height; return container; } /** * @function removeAll * @memberOf Base * @description remove all instance except static instance */ removeAll() { for (let i in this.InstanceMap) { if (this.InstanceMap[i].isStatic) { continue; } this.InstanceMap[i].Destroy(); delete this.InstanceMap[i]; } } /** * @function removeAllAndStaitic * @memberOf Base * @description remove all instance */ removeAllAndStaitic() { for (let i in this.InstanceMap) { this.InstanceMap[i].Destroy(); delete this.InstanceMap[i]; } } /** * @function destroy * @memberOf Base * @description remove instance which has been given * @param {BaseContainer} instance the instance want to destroy; */ destroy(instance) { this.InstanceMap[instance.id].Destroy(); delete this.InstanceMap[instance.id]; } /** * @function moveInterface * @memberOf Base * @description create a movable display object * @param {PIXI.DisplayObject} */ moveInterface(obj) { moveInterface(obj); } /** * @function observable * @memberOf Base * @description create a observable object * @param {object} */ observable(obj) { Observable(obj); } /** * @function shakeContainer * @memberOf Base * @description a shake container animate * @param stage {object} 摇晃的容器 * @param Num {number} 摇晃次数默认3 * @param dist {number} 摇晃距离 * @param useTime {number} 单次摇晃时间 * @return {Promise} */ shakeContainer(stage, Num = 3, dist = 10, useTime = 100) { return new Promise((resolve) => { if (stage._shakeEvent) { stage._shakeEvent.cancel(); } stage._shakeEvent = {}; let fn = getAniFun("linear", 0, dist, useTime / 4); let positive = true; let isReverse = false; let time = new Date().getTime(); let count = 0; let base = stage.x; stage._shakeEvent.cancel = function () { clearInterval(this.twinkleInterval); stage.x = base; delete stage._shakeEvent; }; stage._shakeEvent.twinkleInterval = setInterval(() => { let dt = new Date().getTime() - time; if (dt > useTime / 4) { isReverse = !isReverse; count++; dt = dt % useTime / 4; positive = parseInt(count % 4 / 2) === 0; if (count > Num * 4 - 1) { stage._shakeEvent.cancel(); resolve(); return; } time = new Date().getTime(); } if (isReverse) { dt = useTime / 4 - dt; } if (positive) { stage.x = base + fn(dt); } else { stage.x = base - fn(dt); } }); }); }; } let easy = new Base(); easy.define("normalBtn", { }); easy.define("muteBtn", { init() { let btn = new PIXI.Sprite(this.res["pub_playsound"].texture); btn.position.set(1920 - 40 - btn.width, 40); btn.interactive = true; btn.buttonMode = true; this.isMute = false; let allowMove = true; btn.on("pointertap", () => { allowMove = false; if (this.isMute) { btn.texture = this.res["pub_playsound"].texture; PIXI.sound.unmuteAll(); } else { btn.texture = this.res["pub_muteclick"].texture; PIXI.sound.muteAll(); } this.isMute = !this.isMute; }); // btn.on("pointermove",(e)=>{ // if(btn.containsPoint(e.data.global)){ // if(!allowMove){ // return; // } // btn.texture = this.res["pub_muteover"].texture; // }else{ // allowMove = true; // if(this.isMute){ // btn.texture = this.res["pub_muteclick"].texture; // }else{ // btn.texture = this.res["pub_playsound"].texture; // } // } // }); // btn.on("pointerupoutside", ()=>{ // if(this.isMute){ // if(allowMove){ // btn.texture = this.res["pub_muteclick"].texture // }else{ // btn.texture = this.res["pub_playsound"].texture // } // }else{ // btn.texture = this.res["pub_playsound"].texture // } // }); // btn.on("pointercancel",()=>{ // if(this.isMute){ // if(allowMove){ // btn.texture = this.res["pub_muteclick"].texture // }else{ // btn.texture = this.res["pub_playsound"].texture // } // }else{ // btn.texture = this.res["pub_playsound"].texture // } // }); // btn.on("pointerup", ()=>{ // if(this.isMute){ // if(allowMove){ // btn.texture = this.res["pub_muteclick"].texture // }else{ // btn.texture = this.res["pub_playsound"].texture // } // }else{ // btn.texture = this.res["pub_playsound"].texture // } // }); this.addChild(btn); this.show(); } }); easy.define("container", {}); function getEasy() { let easy = new Base(); easy.define("normalBtn", {}); easy.define("muteBtn", { init() { let btn = new PIXI.Sprite(this.res["pub_playsound"].texture); btn.position.set(1920 - 40 - btn.width, 40); btn.interactive = true; btn.buttonMode = true; this.isMute = false; let allowMove = true; btn.on("pointertap", () => { allowMove = false; if (this.isMute) { btn.texture = this.res["pub_playsound"].texture; PIXI.sound.unmuteAll(); } else { btn.texture = this.res["pub_muteclick"].texture; PIXI.sound.muteAll(); } this.isMute = !this.isMute; }); btn.on("pointermove", (e) => { if (btn.containsPoint(e.data.global)) { if (!allowMove) { return; } btn.texture = this.res["pub_muteover"].texture; } else { allowMove = true; if (this.isMute) { btn.texture = this.res["pub_muteclick"].texture; } else { btn.texture = this.res["pub_playsound"].texture; } } }); btn.on("pointerupoutside", () => { if (this.isMute) { if (allowMove) { btn.texture = this.res["pub_muteclick"].texture } else { btn.texture = this.res["pub_playsound"].texture } } else { btn.texture = this.res["pub_playsound"].texture } }); btn.on("pointercancel", () => { if (this.isMute) { if (allowMove) { btn.texture = this.res["pub_muteclick"].texture } else { btn.texture = this.res["pub_playsound"].texture } } else { btn.texture = this.res["pub_playsound"].texture } }); btn.on("pointerup", () => { if (this.isMute) { if (allowMove) { btn.texture = this.res["pub_muteclick"].texture } else { btn.texture = this.res["pub_playsound"].texture } } else { btn.texture = this.res["pub_playsound"].texture } }); this.addChild(btn); this.show(); } }); easy.define("container", {}); return easy; } easy.getNewInstance = getEasy; let Easy = easy; /** * @class BigMath_StarScoreBoard * @extends BaseContainer * @classdesc 大数学通用过关结算星星动效 * @property {Number} topicNumber - 游戏题目总数 - 默认值:3 * @property {Number} marginDistance - 星星间隔值 - 默认值:80 * @property {Object} starBgLocation - 背景位置 - 默认值:{x:34,y:36} * @property {String} StarScoreBoard - 计分板 - 默认值:"image_StarScoreBoard" * @property {Object} starLocation - 第一颗星星位置 - 默认值:{x:63,y:55} * @property {String} bgIcon - 默认状态的星星 - 默认值:"image_starIdle" * @property {String} loseIcon - 失败状态的星星 - 默认值:"image_starLose" * @property {String} lightSpineName - 成功状态的星星动效名称 - 默认值:"animation_star" * @property {String} lightAniName - 成功状态的星星播放的动画名称 - 默认值:"star_in" * @property {String} starPathSpineName - 星星飞的路径动效名称 - 默认值:"animation_starflash" * @property {String} starPathAniName - 星星飞的路径播放的动画名称 - 默认值:"starflash_in" * @property {String} starSound - 星星组件的音频配置 - 默认值:"audio_starSound" * * @example * import {Easy} from "pubtool4pixi" * Easy.create("BigMath_StarScoreBoard",{ * topicNumber : 3, * marginDistance:80, * starBgLocation:{ * x:34,y:36 * }, *}).show(); * */ Easy.define("BigMath_StarScoreBoard", { topicNumber: 3, marginDistance: 80, starSound: "audio_starSound", bgIcon: "image_starIdle", lightSpineName: "animation_star", starPathSpineName: "animation_starflash", lightAniName: "star_in", starPathAniName: "starflash_in", loseIcon: "image_starLose", StarScoreBoard: "image_StarScoreBoard", starBgLocation: { x: 34, y: 36 }, starLocation: { x: 63, y: 55 }, init() { let topicNumber = this.topicNumber; this.starBg = new PIXI.Sprite(res[this.StarScoreBoard].texture); this.starBg.position.set(this.starBgLocation.x, this.starBgLocation.y); this.addChild(this.starBg); this.aStar = []; for (let i = 0; i < topicNumber; i++) { let star = Easy.create("BigMath_Star", { bgIcon: this.bgIcon, lightSpineName: this.lightSpineName, lightAniName: this.lightAniName, loseIcon: this.loseIcon, parentContainer: this, x: this.starLocation.x + i * this.marginDistance, y: this.starLocation.y }); star.show(); this.aStar.push(star); } }, /** * @function addWinStar * @memberOf BigMath_StarScoreBoard * @param {Number} presentTopicNumber 当前关卡的下标 * @description 添加成功星星 * @return {Promise} 星星与路径动效播放完成 * */ addWinStar(presentTopicNumber) { return new Promise((resolve) => { let starPath = this.starPath(); let sound = this.playAudio(); let light = this.aStar[presentTopicNumber].light(); Promise.all([sound, light, starPath]).then(() => { resolve(); }); }); }, /** * @function addLoseStar * @memberOf BigMath_StarScoreBoard * @param {Number} presentTopicNumber 当前关卡的下标 * @description 添加失败星星 * @return {Promise} 添加完成后 * */ addLoseStar(presentTopicNumber) { return new Promise((resolve) => { this.aStar[presentTopicNumber].dark().then(() => { resolve(); }); }); }, /** * @function reset * @memberOf BigMath_StarScoreBoard * @description 重置星星动效 * */ reset() { this.aStar.forEach(item => { item.reset(); }); }, /** * @function starPath * @memberOf BigMath_StarScoreBoard * @description 播放星星路径动效 * @return {Promise} 路径动效播放完成 * */ starPath() { return new Promise((resolve) => { let starPath = new PIXI.spine.Spine(this.res[this.starPathSpineName].spineData); starPath.setAni(this.starPathAniName); starPath.addEventOnce("onAniEnd", () => { resolve(); }); this.addChild(starPath); }); }, /** * @function playAudio * @memberOf BigMath_StarScoreBoard * @description 播放星星音频 * @return {Promise} 音频播放完成 * */ playAudio() { return new Promise((resolve) => { try { PIXI.sound.play(this.starSound, { complete: () => { resolve(); } }); } catch (e) { resolve(); } }); } }); Easy.define("BigMath_Star", { bgIcon: "image_starIdle", lightSpineName: "animation_star", lightAniName: "star_in", loseIcon: "image_starLose", init() { this.bg = new PIXI.Sprite(this.res[this.bgIcon].texture); this.addChild(this.bg); if (this.res[this.loseIcon]) { this.loseBg = new PIXI.Sprite(this.res[this.loseIcon].texture); } else { this.loseBg = new PIXI.Sprite(this.res[this.bgIcon].texture); } this.loseBg.position.set(-2.0801850104436426, -0.2934630807666849); this.addEventOnce("Destroyed", () => { this.bg = null; this.loseBg = null; this.lightStar = null; }); }, /** * @function light * @memberOf BigMath_Star * @description 关卡成功播放收集星星 * @return {Promise} 收集星星动效播放完 * */ light() { return new Promise((resolve) => { this.removeChildren(); this.getNewAni(); this.addChild(this.bg, this.lightStar); this.lightStar.setAni(this.lightAniName); this.lightStar.addEventOnce("onAniEnd", () => { resolve(); }); }); }, /** * @function dark * @memberOf BigMath_Star * @description 关卡失败添加失败星星切图 * @return {Promise} 添加完成 * */ dark() { return new Promise((resolve) => { this.addChild(this.loseBg); resolve(); }); }, /** * @function reset * @memberOf BigMath_Star * @description 关卡星星重置 * */ reset() { this.removeChildren(); this.addChild(this.bg); }, getNewAni() { this.lightStar && this.lightStar.destroy(); this.lightStar = new PIXI.spine.Spine(this.res[this.lightSpineName].spineData); this.lightStar.position.set(37.80634360986528, 37.550228996097076); } }); /** * @class BigMath_GuideHand * @extends BaseContainer * @classdesc 大数学通用引导手势 * @property {Object} origin - 拖拽引导手势起点 - 默认值:{x:500,y:960} * @property {Object} destination - 拖拽引导手势终点 - 默认值:{x:1400,y:500} * @property {Boolean} isDrag - 是否是拖拽手势 - 默认值:true 【不可更改】 * @property {String} spineName - 手势动效名称 - 默认值:"animation_hand_guide" * @property {String} clickAniName - 点击手势动画名称 - 默认值:"zhiyin" * @property {St