UNPKG

phaser4-rex-plugins

Version:
1,779 lines (1,429 loc) 69.3 kB
(function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.rexboxspinner = factory()); })(this, (function () { 'use strict'; const GetCalcMatrix = Phaser.GameObjects.GetCalcMatrix; var WebGLRenderer = function (renderer, src, drawingContext, parentMatrix) { src.updateData(); var camera = drawingContext.camera; camera.addToRenderList(src); var calcMatrix = GetCalcMatrix(src, camera, parentMatrix, !drawingContext.useCanvas).calc; var dx = src._displayOriginX; var dy = src._displayOriginY; var alpha = src.alpha; var submitter = src.customRenderNodes.Submitter || src.defaultRenderNodes.Submitter; var shapes = src.geom, shape; for (var i = 0, cnt = shapes.length; i < cnt; i++) { shape = shapes[i]; if (shape.visible) { shape.webglRender(drawingContext, submitter, calcMatrix, src, alpha, dx, dy); } } }; const SetTransform = Phaser.Renderer.Canvas.SetTransform; var CanvasRenderer = function (renderer, src, camera, parentMatrix) { src.updateData(); camera.addToRenderList(src); var ctx = renderer.currentContext; if (SetTransform(renderer, ctx, src, camera, parentMatrix)) { var dx = src._displayOriginX; var dy = src._displayOriginY; var shapes = src.geom, shape; for (var i = 0, cnt = shapes.length; i < cnt; i++) { shape = shapes[i]; if (shape.visible) { shape.canvasRender(ctx, dx, dy); } } // Restore the context saved in SetTransform ctx.restore(); } }; var Render = { renderWebGL: WebGLRenderer, renderCanvas: CanvasRenderer }; var Clear = function (obj) { if ((typeof (obj) !== 'object') || (obj === null)) { return obj; } if (Array.isArray(obj)) { obj.length = 0; } else { for (var key in obj) { delete obj[key]; } } return obj; }; const Shape = Phaser.GameObjects.Shape; const RemoveItem = Phaser.Utils.Array.Remove; class BaseShapes extends Shape { constructor(scene, x, y, width, height) { if (x === undefined) { x = 0; } if (y === undefined) { y = 0; } if (width === undefined) { width = 2; } if (height === undefined) { height = width; } super(scene, 'rexShapes', []); this._width = -1; this._height = -1; this.dirty = true; this.isSizeChanged = true; this.shapes = {}; this.setPosition(x, y); this.setSize(width, height); this.updateDisplayOrigin(); } get width() { return this._width; } set width(value) { this.setSize(value, this._height); } get height() { return this._height; } set height(value) { this.setSize(this._width, value); } setDirty(value) { if (value === undefined) { value = true; } this.dirty = value; return this; } setSize(width, height) { this.isSizeChanged = this.isSizeChanged || (this._width !== width) || (this._height !== height); this.dirty = this.dirty || this.isSizeChanged; this._width = width; this._height = height; this.updateDisplayOrigin(); var input = this.input; if (input && !input.customHitArea) { input.hitArea.width = width; input.hitArea.height = height; } return this; } resize(width, height) { this.setSize(width, height); return this; } get fillColor() { return this._fillColor; } set fillColor(value) { this.setFillStyle(value, this._fillAlpha); } get fillAlpha() { return this._fillAlpha; } set fillAlpha(value) { this.setFillStyle(this._fillColor, value); } setFillStyle(color, alpha) { if (alpha === undefined) { alpha = 1; } this.dirty = this.dirty || (this.fillColor !== color) || (this.fillAlpha !== alpha); this._fillColor = color; this._fillAlpha = alpha; return this; } get lineWidth() { return this._lineWidth; } set lineWidth(value) { this.setStrokeStyle(value, this._strokeColor, this._strokeAlpha); } get strokeColor() { return this._strokeColor; } set strokeColor(value) { this.setStrokeStyle(this._lineWidth, value, this._strokeAlpha); } get strokeAlpha() { return this._strokeAlpha; } set strokeAlpha(value) { this.setStrokeStyle(this._lineWidth, this._strokeColor, value); } setStrokeStyle(lineWidth, color, alpha) { if (alpha === undefined) { alpha = 1; } this.dirty = this.dirty || (this.lineWidth !== lineWidth) || (this.strokeColor !== color) || (this.strokeAlpha !== alpha); this._lineWidth = lineWidth; this._strokeColor = color; this._strokeAlpha = alpha; return this; } updateShapes() { } updateData() { if (!this.dirty) { return this; } this.updateShapes(); var shapes = this.geom; for (var i = 0, cnt = shapes.length; i < cnt; i++) { var shape = shapes[i]; if (shape.dirty) { shape.updateData(); } } this.isSizeChanged = false; this.dirty = false; return this; } clear() { this.geom.length = 0; Clear(this.shapes); this.dirty = true; return this; } getShape(name) { return this.shapes[name]; } getShapes() { return this.geom; } addShape(shape) { this.geom.push(shape); var name = shape.name; if (name) { this.shapes[name] = shape; } this.dirty = true; return this; } deleteShape(name) { var shape = this.getShape(name); if (shape) { delete this.shapes[name]; RemoveItem(this.geom, shape); } return this; } } Object.assign( BaseShapes.prototype, Render ); var EventEmitterMethods = { setEventEmitter(eventEmitter, EventEmitterClass) { if (EventEmitterClass === undefined) { EventEmitterClass = Phaser.Events.EventEmitter; // Use built-in EventEmitter class by default } this._privateEE = (eventEmitter === true) || (eventEmitter === undefined); this._eventEmitter = (this._privateEE) ? (new EventEmitterClass()) : eventEmitter; return this; }, destroyEventEmitter() { if (this._eventEmitter && this._privateEE) { this._eventEmitter.shutdown(); } return this; }, getEventEmitter() { return this._eventEmitter; }, on() { if (this._eventEmitter) { this._eventEmitter.on.apply(this._eventEmitter, arguments); } return this; }, once() { if (this._eventEmitter) { this._eventEmitter.once.apply(this._eventEmitter, arguments); } return this; }, off() { if (this._eventEmitter) { this._eventEmitter.off.apply(this._eventEmitter, arguments); } return this; }, emit(event) { if (this._eventEmitter && event) { this._eventEmitter.emit.apply(this._eventEmitter, arguments); } return this; }, addListener() { if (this._eventEmitter) { this._eventEmitter.addListener.apply(this._eventEmitter, arguments); } return this; }, removeListener() { if (this._eventEmitter) { this._eventEmitter.removeListener.apply(this._eventEmitter, arguments); } return this; }, removeAllListeners() { if (this._eventEmitter) { this._eventEmitter.removeAllListeners.apply(this._eventEmitter, arguments); } return this; }, listenerCount() { if (this._eventEmitter) { return this._eventEmitter.listenerCount.apply(this._eventEmitter, arguments); } return 0; }, listeners() { if (this._eventEmitter) { return this._eventEmitter.listeners.apply(this._eventEmitter, arguments); } return []; }, eventNames() { if (this._eventEmitter) { return this._eventEmitter.eventNames.apply(this._eventEmitter, arguments); } return []; }, }; const SceneClass = Phaser.Scene; var IsSceneObject = function (object) { return (object instanceof SceneClass); }; var GetSceneObject = function (object) { if ((object == null) || (typeof (object) !== 'object')) { return null; } else if (IsSceneObject(object)) { // object = scene return object; } else if (object.scene && IsSceneObject(object.scene)) { // object = game object return object.scene; } else if (object.parent && object.parent.scene && IsSceneObject(object.parent.scene)) { // parent = bob object return object.parent.scene; } else { return null; } }; const GameClass = Phaser.Game; var IsGame = function (object) { return (object instanceof GameClass); }; var GetGame = function (object) { if ((object == null) || (typeof (object) !== 'object')) { return null; } else if (IsGame(object)) { return object; } else if (IsGame(object.game)) { return object.game; } else if (IsSceneObject(object)) { // object = scene object return object.sys.game; } else if (IsSceneObject(object.scene)) { // object = game object return object.scene.sys.game; } }; const GetValue$7 = Phaser.Utils.Objects.GetValue; class ComponentBase { constructor(parent, config) { this.setParent(parent); // gameObject, scene, or game this.isShutdown = false; // Event emitter, default is private event emitter this.setEventEmitter(GetValue$7(config, 'eventEmitter', true)); // Register callback of parent destroy event, also see `shutdown` method if (this.parent) { if (this.parent === this.scene) { // parent is a scene this.scene.sys.events.once('shutdown', this.onEnvDestroy, this); } else if (this.parent === this.game) { // parent is game this.game.events.once('shutdown', this.onEnvDestroy, this); } else if (this.parent.once) { // parent is game object or something else this.parent.once('destroy', this.onParentDestroy, this); } // bob object does not have event emitter } } shutdown(fromScene) { // Already shutdown if (this.isShutdown) { return; } // parent might not be shutdown yet if (this.parent) { if (this.parent === this.scene) { // parent is a scene this.scene.sys.events.off('shutdown', this.onEnvDestroy, this); } else if (this.parent === this.game) { // parent is game this.game.events.off('shutdown', this.onEnvDestroy, this); } else if (this.parent.once) { // parent is game object or something else this.parent.off('destroy', this.onParentDestroy, this); } // bob object does not have event emitter } this.destroyEventEmitter(); this.parent = undefined; this.scene = undefined; this.game = undefined; this.isShutdown = true; } destroy(fromScene) { this.shutdown(fromScene); } onEnvDestroy() { this.destroy(true); } onParentDestroy(parent, fromScene) { this.destroy(fromScene); } setParent(parent) { this.parent = parent; // gameObject, scene, or game this.scene = GetSceneObject(parent); this.game = GetGame(parent); return this; } } Object.assign( ComponentBase.prototype, EventEmitterMethods ); const GetValue$6 = Phaser.Utils.Objects.GetValue; class TickTask extends ComponentBase { constructor(parent, config) { super(parent, config); this._isRunning = false; this.isPaused = false; this.tickingState = false; this.setTickingMode(GetValue$6(config, 'tickingMode', 1)); // boot() later } // override boot() { if ((this.tickingMode === 2) && (!this.tickingState)) { this.startTicking(); } } // override shutdown(fromScene) { // Already shutdown if (this.isShutdown) { return; } this.stop(); if (this.tickingState) { this.stopTicking(); } super.shutdown(fromScene); } setTickingMode(mode) { if (typeof (mode) === 'string') { mode = TICKINGMODE[mode]; } this.tickingMode = mode; } // override startTicking() { this.tickingState = true; } // override stopTicking() { this.tickingState = false; } get isRunning() { return this._isRunning; } set isRunning(value) { if (this._isRunning === value) { return; } this._isRunning = value; if ((this.tickingMode === 1) && (value != this.tickingState)) { if (value) { this.startTicking(); } else { this.stopTicking(); } } } start() { this.isPaused = false; this.isRunning = true; return this; } pause() { // Only can ba paused in running state if (this.isRunning) { this.isPaused = true; this.isRunning = false; } return this; } resume() { // Only can ba resumed in paused state (paused from running state) if (this.isPaused) { this.isPaused = false; this.isRunning = true; } return this; } stop() { this.isPaused = false; this.isRunning = false; return this; } complete() { this.isPaused = false; this.isRunning = false; this.emit('complete', this.parent, this); } } const TICKINGMODE = { 'no': 0, 'lazy': 1, 'always': 2 }; const GetValue$5 = Phaser.Utils.Objects.GetValue; class SceneUpdateTickTask extends TickTask { constructor(parent, config) { super(parent, config); // scene update : update, preupdate, postupdate, prerender, render // game update : step, poststep, // If this.scene is not available, use game's 'step' event var defaultEventName = (this.scene) ? 'update' : 'step'; this.tickEventName = GetValue$5(config, 'tickEventName', defaultEventName); this.isSceneTicker = !IsGameUpdateEvent(this.tickEventName); } startTicking() { super.startTicking(); if (this.isSceneTicker) { this.scene.sys.events.on(this.tickEventName, this.update, this); } else { this.game.events.on(this.tickEventName, this.update, this); } } stopTicking() { super.stopTicking(); if (this.isSceneTicker && this.scene) { // Scene might be destoryed this.scene.sys.events.off(this.tickEventName, this.update, this); } else if (this.game) { this.game.events.off(this.tickEventName, this.update, this); } } // update(time, delta) { // // } } var IsGameUpdateEvent = function (eventName) { return (eventName === 'step') || (eventName === 'poststep'); }; const GetValue$4 = Phaser.Utils.Objects.GetValue; const Clamp = Phaser.Math.Clamp; class Timer { constructor(config) { this.resetFromJSON(config); } resetFromJSON(o) { this.state = GetValue$4(o, 'state', IDLE); this.timeScale = GetValue$4(o, 'timeScale', 1); this.delay = GetValue$4(o, 'delay', 0); this.repeat = GetValue$4(o, 'repeat', 0); this.repeatCounter = GetValue$4(o, 'repeatCounter', 0); this.repeatDelay = GetValue$4(o, 'repeatDelay', 0); this.duration = GetValue$4(o, 'duration', 0); this.nowTime = GetValue$4(o, 'nowTime', 0); this.justRestart = GetValue$4(o, 'justRestart', false); } toJSON() { return { state: this.state, timeScale: this.timeScale, delay: this.delay, repeat: this.repeat, repeatCounter: this.repeatCounter, repeatDelay: this.repeatDelay, duration: this.duration, nowTime: this.nowTime, justRestart: this.justRestart, } } destroy() { } setTimeScale(timeScale) { this.timeScale = timeScale; return this; } setDelay(delay) { if (delay === undefined) { delay = 0; } this.delay = delay; return this; } setDuration(duration) { this.duration = duration; return this; } setRepeat(repeat) { this.repeat = repeat; return this; } setRepeatInfinity() { this.repeat = -1; return this; } setRepeatDelay(repeatDelay) { this.repeatDelay = repeatDelay; return this; } start() { this.nowTime = (this.delay > 0) ? -this.delay : 0; this.state = (this.nowTime >= 0) ? COUNTDOWN : DELAY; this.repeatCounter = 0; return this; } stop() { this.state = IDLE; return this; } update(time, delta) { if (this.state === IDLE || this.state === DONE || delta === 0 || this.timeScale === 0 ) { return; } this.nowTime += (delta * this.timeScale); this.justRestart = false; if (this.nowTime >= this.duration) { if ((this.repeat === -1) || (this.repeatCounter < this.repeat)) { this.repeatCounter++; this.justRestart = true; this.nowTime -= this.duration; if (this.repeatDelay > 0) { this.nowTime -= this.repeatDelay; this.state = REPEATDELAY; } } else { this.nowTime = this.duration; this.state = DONE; } } else if (this.nowTime >= 0) { this.state = COUNTDOWN; } } get t() { var t; switch (this.state) { case IDLE: case DELAY: case REPEATDELAY: t = 0; break; case COUNTDOWN: t = this.nowTime / this.duration; break; case DONE: t = 1; break; } return Clamp(t, 0, 1); } set t(value) { value = Clamp(value, -1, 1); if (value < 0) { this.state = DELAY; this.nowTime = -this.delay * value; } else { this.state = COUNTDOWN; this.nowTime = this.duration * value; if ((value === 1) && (this.repeat !== 0)) { this.repeatCounter++; } } } setT(t) { this.t = t; return this; } get isIdle() { return this.state === IDLE; } get isDelay() { return this.state === DELAY; } get isCountDown() { return this.state === COUNTDOWN; } get isRunning() { return this.state === DELAY || this.state === COUNTDOWN; } get isDone() { return this.state === DONE; } get isOddIteration() { return (this.repeatCounter & 1) === 1; } get isEvenIteration() { return (this.repeatCounter & 1) === 0; } } const IDLE = 0; const DELAY = 1; const COUNTDOWN = 2; const REPEATDELAY = 3; const DONE = -1; class TimerTickTask extends SceneUpdateTickTask { constructor(parent, config) { super(parent, config); this.timer = new Timer(); // boot() later } // override shutdown(fromScene) { // Already shutdown if (this.isShutdown) { return; } super.shutdown(fromScene); this.timer.destroy(); this.timer = undefined; } start() { this.timer.start(); super.start(); return this; } stop() { this.timer.stop(); super.stop(); return this; } complete() { this.timer.stop(); super.complete(); return this; } } const GetValue$3 = Phaser.Utils.Objects.GetValue; const GetAdvancedValue = Phaser.Utils.Objects.GetAdvancedValue; const GetEaseFunction = Phaser.Tweens.Builders.GetEaseFunction; class EaseValueTaskBase extends TimerTickTask { resetFromJSON(o) { this.timer.resetFromJSON(GetValue$3(o, 'timer')); this.setEnable(GetValue$3(o, 'enable', true)); this.setTarget(GetValue$3(o, 'target', this.parent)); this.setDelay(GetAdvancedValue(o, 'delay', 0)); this.setDuration(GetAdvancedValue(o, 'duration', 1000)); this.setEase(GetValue$3(o, 'ease', 'Linear')); this.setRepeat(GetValue$3(o, 'repeat', 0)); return this; } setEnable(e) { if (e == undefined) { e = true; } this.enable = e; return this; } setTarget(target) { if (target === undefined) { target = this.parent; } this.target = target; return this; } setDelay(time) { this.delay = time; // Assign `this.timer.setRepeat(repeat)` manually return this; } setDuration(time) { this.duration = time; return this; } setRepeat(repeat) { this.repeat = repeat; // Assign `this.timer.setRepeat(repeat)` manually return this; } setRepeatDelay(repeatDelay) { this.repeatDelay = repeatDelay; // Assign `this.timer.setRepeatDelay(repeatDelay)` manually return this; } setEase(ease) { if (ease === undefined) { ease = 'Linear'; } this.ease = ease; this.easeFn = GetEaseFunction(ease); return this; } // Override start() { // Ignore start if timer is running, i.e. in DELAY, o RUN state if (this.timer.isRunning) { return this; } super.start(); return this; } restart() { this.timer.stop(); this.start.apply(this, arguments); return this; } stop(toEnd) { if (toEnd === undefined) { toEnd = false; } super.stop(); if (toEnd) { this.timer.setT(1); this.updateTarget(this.target, this.timer); this.complete(); } return this; } update(time, delta) { if ( (!this.isRunning) || (!this.enable) || (this.parent.hasOwnProperty('active') && !this.parent.active) ) { return this; } var target = this.target, timer = this.timer; timer.update(time, delta); // isDelay, isCountDown, isDone if (!timer.isDelay) { this.updateTarget(target, timer); } this.emit('update', target, this); if (timer.isDone) { this.complete(); } return this; } // Override updateTarget(target, timer) { } } const GetValue$2 = Phaser.Utils.Objects.GetValue; const Linear$1 = Phaser.Math.Linear; class EaseValueTask extends EaseValueTaskBase { constructor(gameObject, config) { super(gameObject, config); // this.parent = gameObject; // this.timer this.resetFromJSON(); this.boot(); } start(config) { if (this.timer.isRunning) { return this; } var target = this.target; this.propertyKey = GetValue$2(config, 'key', 'value'); var currentValue = target[this.propertyKey]; this.fromValue = GetValue$2(config, 'from', currentValue); this.toValue = GetValue$2(config, 'to', currentValue); this.setEase(GetValue$2(config, 'ease', this.ease)); this.setDuration(GetValue$2(config, 'duration', this.duration)); this.setRepeat(GetValue$2(config, 'repeat', 0)); this.setDelay(GetValue$2(config, 'delay', 0)); this.setRepeatDelay(GetValue$2(config, 'repeatDelay', 0)); this.timer .setDuration(this.duration) .setRepeat(this.repeat) .setDelay(this.delay) .setRepeatDelay(this.repeatDelay); target[this.propertyKey] = this.fromValue; super.start(); return this; } updateTarget(target, timer) { var t = timer.t; t = this.easeFn(t); target[this.propertyKey] = Linear$1(this.fromValue, this.toValue, t); } } var Start = function (duration) { if (!this.easeValueTask) { this.easeValueTask = new EaseValueTask(this, { eventEmitter: null }); } if (duration !== undefined) { this.duration = duration; this.easeValueTask.stop(); // Will restart with new duration } // Won't restart if easeValueTask is running if (this.easeValueTask.isRunning) { return this; } // Start easeValueTask this.easeValueTask.restart({ key: 'value', from: 0, to: 1, duration: this.duration, ease: this.ease, repeat: -1, // -1: infinity delay: this.delay, repeatDelay: this.repeatDelay }); this.setDirty(); return this; }; var Stop = function () { if (!this.easeValueTask) { return this; } this.easeValueTask.stop(); this.setDirty(); return this; }; var Pause = function () { if (!this.easeValueTask) { return this; } this.easeValueTask.pause(); this.setDirty(); return this; }; var Resume = function () { if (!this.easeValueTask) { return this; } this.easeValueTask.pause(); this.setDirty(); return this; }; var EaseValueMethods = { start: Start, stop: Stop, pause: Pause, resume: Resume }; const GetValue$1 = Phaser.Utils.Objects.GetValue; class Base extends BaseShapes { constructor(scene, config) { var x = GetValue$1(config, 'x', 0); var y = GetValue$1(config, 'y', 0); var width = GetValue$1(config, 'width', 64); var height = GetValue$1(config, 'height', 64); super(scene, x, y, width, height); this.resetFromConfig(config, true); this.buildShapes(config); if (GetValue$1(config, 'start', true)) { this.start(); } } resetFromConfig(config, setDefaults) { if (setDefaults === undefined) { setDefaults = false; } var defaultValue; defaultValue = (setDefaults) ? 1000 : this.duration; this.setDuration(GetValue$1(config, 'duration', defaultValue)); defaultValue = (setDefaults) ? 'Linear' : this.ease; this.setEase(GetValue$1(config, 'ease', defaultValue)); defaultValue = (setDefaults) ? 0 : this.delay; this.setDelay(GetValue$1(config, 'delay', defaultValue)); defaultValue = (setDefaults) ? 0 : this.repeatDelay; this.setRepeatDelay(GetValue$1(config, 'repeatDelay', defaultValue)); defaultValue = (setDefaults) ? 0xffffff : this.color; this.setColor(GetValue$1(config, 'color', defaultValue)); defaultValue = (setDefaults) ? 0 : this.value; this.setValue(GetValue$1(config, 'value', defaultValue)); return this; } buildShapes() { } get centerX() { return this.width / 2; } get centerY() { return this.height / 2; } get radius() { return Math.min(this.centerX, this.centerY); } get color() { return this._color; } set color(value) { this.isColorChanged = this.isColorChanged || (this._color !== value); this.dirty = this.dirty || this.isColorChanged; this._color = value; this.setShapesColor(value); } setColor(color) { this.color = color; return this; } setShapesColor(color) { } get value() { return this._value; } set value(value) { value = Phaser.Math.Clamp(value, 0, 1); this.dirty = this.dirty || (this._value != value); this._value = value; } setValue(value) { this.value = value; return this; } setDuration(duration) { this.duration = duration; return this; } setDelay(delay) { this.delay = delay; return this; } setRepeatDelay(repeatDelay) { this.repeatDelay = repeatDelay; return this; } setEase(ease) { this.ease = ease; return this; } get isRunning() { return (this.tweenTask) ? this.tweenTask.isRunning : false; } } Object.assign( Base.prototype, EaseValueMethods ); var FillStyle = function (color, alpha) { if (color == null) { this.isFilled = false; } else { if (alpha === undefined) { alpha = 1; } this.isFilled = true; this.fillColor = color; this.fillAlpha = alpha; } return this; }; var LineStyle = function (lineWidth, color, alpha) { if ((lineWidth == null) || (color == null)) { this.isStroked = false; } else { if (alpha === undefined) { alpha = 1; } this.isStroked = true; this.lineWidth = lineWidth; this.strokeColor = color; this.strokeAlpha = alpha; } return this; }; var StyleMethods = { fillStyle: FillStyle, lineStyle: LineStyle }; var GetValue = function (source, key, defaultValue) { if (!source || typeof source === 'number') { return defaultValue; } if (typeof (key) === 'string') { if (source.hasOwnProperty(key)) { return source[key]; } if (key.indexOf('.') !== -1) { key = key.split('.'); } else { return defaultValue; } } var keys = key; var parent = source; var value = defaultValue; // Use for loop here so we can break early for (var i = 0; i < keys.length; i++) { key = keys[i]; if (parent.hasOwnProperty(key)) { // Yes it has a key property, let's carry on down value = parent[key]; parent = value; } else { // Can't go any further, so reset to default value = defaultValue; break; } } return value; }; var DataMethods = { enableData() { if (this.data === undefined) { this.data = {}; } return this; }, setData(key, value) { this.enableData(); if (arguments.length === 1) { var data = key; for (key in data) { this.data[key] = data[key]; } } else { this.data[key] = value; } return this; }, getData(key, defaultValue) { this.enableData(); return (key === undefined) ? this.data : GetValue(this.data, key, defaultValue); }, incData(key, inc, defaultValue) { if (defaultValue === undefined) { defaultValue = 0; } this.enableData(); this.setData(key, this.getData(key, defaultValue) + inc); return this; }, mulData(key, mul, defaultValue) { if (defaultValue === undefined) { defaultValue = 0; } this.enableData(); this.setData(key, this.getData(key, defaultValue) * mul); return this; }, clearData() { if (this.data) { Clear(this.data); } return this; }, }; class BaseGeom { constructor() { this.name = undefined; this.dirty = true; this.visible = true; this.data = undefined; this.isFilled = false; this.fillColor = undefined; this.fillAlpha = 1; this.isStroked = false; this.lineWidth = 1; this.strokeColor = undefined; this.strokeAlpha = 1; } setName(name) { this.name = name; return this; } setVisible(visible) { if (visible === undefined) { visible = true; } this.visible = visible; return this; } reset() { this .setVisible() .fillStyle() .lineStyle(); return this; } webglRender(drawingContext, submitter, gameObject, calcMatrix, alpha, dx, dy) { } canvasRender(ctx, dx, dy) { } updateData() { this.dirty = false; } } Object.assign( BaseGeom.prototype, StyleMethods, DataMethods ); /* shapeData: { fillColor, fillAlpha, pathData, pathIndexes // Earcut(pathData) } */ var Utils$1 = Phaser.Renderer.WebGL.Utils; var FillPathWebGL = function (drawingContext, submitter, calcMatrix, gameObject, shapeData, alpha, dx, dy) { // This is very similar to the FillPath RenderNode, but it already // has access to the Earcut indexes, so it doesn't need to calculate them. var fillTintColor = Utils$1.getTintAppendFloatAlpha(shapeData.fillColor, shapeData.fillAlpha * alpha); var path = shapeData.pathData; var pathIndexes = shapeData.pathIndexes; var length = path.length; var pathIndex, pointX, pointY, x, y; var vertices = Array(length * 2); var colors = Array(length); var verticesIndex = 0; var colorsIndex = 0; for (pathIndex = 0; pathIndex < length; pathIndex += 2) { pointX = path[pathIndex] - dx; pointY = path[pathIndex + 1] - dy; // Transform the point. x = calcMatrix.getX(pointX, pointY); y = calcMatrix.getY(pointX, pointY); vertices[verticesIndex++] = x; vertices[verticesIndex++] = y; colors[colorsIndex++] = fillTintColor; } submitter.batch( drawingContext, pathIndexes, vertices, colors ); }; /* shapeData: { strokeColor, strokeAlpha, pathData, lineWidth, closePath } */ var Utils = Phaser.Renderer.WebGL.Utils; var StrokePathWebGL = function (drawingContext, submitter, matrix, gameObject, shapeData, alpha, dx, dy) { var strokeTintColor = Utils.getTintAppendFloatAlpha(shapeData.strokeColor, shapeData.strokeAlpha * alpha); var path = shapeData.pathData; var pathLength = path.length - 1; var lineWidth = shapeData.lineWidth; var openPath = !shapeData.closePath; var strokePath = gameObject.customRenderNodes.StrokePath || gameObject.defaultRenderNodes.StrokePath; var pointPath = []; // Don't add the last point to open paths. if (openPath) { pathLength -= 2; } for (var i = 0; i < pathLength; i += 2) { var x = path[i] - dx; var y = path[i + 1] - dy; if (i > 0) { if (x === path[i - 2] && y === path[i - 1]) { // Duplicate point, skip it continue; } } pointPath.push({ x: x, y: y, width: lineWidth }); } strokePath.run( drawingContext, submitter, pointPath, lineWidth, openPath, matrix, strokeTintColor, strokeTintColor, strokeTintColor, strokeTintColor ); }; var FillStyleCanvas = function (ctx, src, altColor, altAlpha) { var fillColor = (altColor) ? altColor : src.fillColor; var fillAlpha = (altAlpha) ? altAlpha : src.fillAlpha; var red = ((fillColor & 0xFF0000) >>> 16); var green = ((fillColor & 0xFF00) >>> 8); var blue = (fillColor & 0xFF); ctx.fillStyle = 'rgba(' + red + ',' + green + ',' + blue + ',' + fillAlpha + ')'; }; var LineStyleCanvas = function (ctx, src, altColor, altAlpha) { var strokeColor = (altColor) ? altColor : src.strokeColor; var strokeAlpha = (altAlpha) ? altAlpha : src.strokeAlpha; var red = ((strokeColor & 0xFF0000) >>> 16); var green = ((strokeColor & 0xFF00) >>> 8); var blue = (strokeColor & 0xFF); ctx.strokeStyle = 'rgba(' + red + ',' + green + ',' + blue + ',' + strokeAlpha + ')'; ctx.lineWidth = src.lineWidth; }; const Earcut = Phaser.Geom.Polygon.Earcut; class PathBase extends BaseGeom { constructor() { super(); this.pathData = []; this.pathIndexes = []; this.closePath = false; } updateData() { this.pathIndexes = Earcut(this.pathData); super.updateData(); return this; } webglRender(drawingContext, submitter, calcMatrix, gameObject, alpha, dx, dy) { if (this.isFilled) { FillPathWebGL(drawingContext, submitter, calcMatrix, gameObject, this, alpha, dx, dy); } if (this.isStroked) { StrokePathWebGL(drawingContext, submitter, calcMatrix, gameObject, this, alpha, dx, dy); } } canvasRender(ctx, dx, dy) { var path = this.pathData; var pathLength = path.length - 1; var px1 = path[0] - dx; var py1 = path[1] - dy; ctx.beginPath(); ctx.moveTo(px1, py1); if (!this.closePath) { pathLength -= 2; } for (var i = 2; i < pathLength; i += 2) { var px2 = path[i] - dx; var py2 = path[i + 1] - dy; ctx.lineTo(px2, py2); } if (this.closePath) { ctx.closePath(); } if (this.isFilled) { FillStyleCanvas(ctx, this); ctx.fill(); } if (this.isStroked) { LineStyleCanvas(ctx, this); ctx.stroke(); } } } var StartAt = function (x, y, pathData) { pathData.length = 0; if (x != null) { pathData.push(x, y); } return pathData; }; var LineTo = function (x, y, pathData) { var cnt = pathData.length; if (cnt >= 2) { var lastX = pathData[cnt - 2]; var lastY = pathData[cnt - 1]; if ((x === lastX) && (y === lastY)) { return pathData; } } pathData.push(x, y); return pathData; }; const DegToRad$1 = Phaser.Math.DegToRad; var ArcTo = function (centerX, centerY, radiusX, radiusY, startAngle, endAngle, antiClockWise, iteration, pathData) { // startAngle, endAngle: 0 ~ 360 if (antiClockWise && (endAngle > startAngle)) { endAngle -= 360; } else if (!antiClockWise && (endAngle < startAngle)) { endAngle += 360; } var deltaAngle = endAngle - startAngle; var step = DegToRad$1(deltaAngle) / iteration; startAngle = DegToRad$1(startAngle); for (var i = 0; i <= iteration; i++) { var angle = startAngle + (step * i); var x = centerX + (radiusX * Math.cos(angle)); var y = centerY + (radiusY * Math.sin(angle)); LineTo(x, y, pathData); } return pathData; }; //import QuadraticBezierInterpolation from '../../utils/math/interpolation/QuadraticBezierInterpolation.js'; const QuadraticBezierInterpolation = Phaser.Math.Interpolation.QuadraticBezier; var QuadraticBezierTo = function (cx, cy, x, y, iterations, pathData) { var pathDataCnt = pathData.length; var p0x = pathData[pathDataCnt - 2]; var p0y = pathData[pathDataCnt - 1]; for (var i = 1, last = iterations - 1; i <= last; i++) { var t = i / last; pathData.push( QuadraticBezierInterpolation(t, p0x, cx, x), QuadraticBezierInterpolation(t, p0y, cy, y) ); } return pathData; }; // import CubicBezierInterpolation from '../../utils/math/interpolation/CubicBezierInterpolation.js'; const CubicBezierInterpolation = Phaser.Math.Interpolation.CubicBezier; var CubicBezierCurveTo = function (cx0, cy0, cx1, cy1, x, y, iterations, pathData) { var pathDataCnt = pathData.length; var p0x = pathData[pathDataCnt - 2]; var p0y = pathData[pathDataCnt - 1]; for (var i = 1, last = iterations - 1; i <= last; i++) { var t = i / last; pathData.push( CubicBezierInterpolation(t, p0x, cx0, cx1, x), CubicBezierInterpolation(t, p0y, cy0, cy1, y) ); } return pathData; }; //import CatmullRomInterpolation from '../../utils/math/interpolation/CatmullRomInterpolation.js'; const CatmullRomInterpolation = Phaser.Math.Interpolation.CatmullRom; var CatmullRomTo = function (points, iterations, pathData) { var pathDataCnt = pathData.length; var p0x = pathData[pathDataCnt - 2]; var p0y = pathData[pathDataCnt - 1]; var xList = [p0x]; var yList = [p0y]; for (var i = 0, cnt = points.length; i < cnt; i += 2) { xList.push(points[i]); yList.push(points[i + 1]); } for (var i = 1, last = iterations - 1; i <= last; i++) { var t = i / last; pathData.push( CatmullRomInterpolation(xList, t), CatmullRomInterpolation(yList, t) ); } return pathData; }; var DuplicateLast = function (pathData) { var len = pathData.length; if (len < 2) { return pathData; } var lastX = pathData[len - 2]; var lastY = pathData[len - 1]; pathData.push(lastX); pathData.push(lastY); return pathData; }; var AddPathMethods = { clear() { this.start(); return this; }, start() { this.startAt(); return