Engine.DrawableStatics = {}; Engine.DrawableStatics.SortMode = {"Index" : 0, "Z" : 1}; Engine.DrawableStatics.QueuedFrameEvents = []; Engine.DrawableStatics.PlayMode = {Forwards : 0, Backwards : 1}; Engine.Drawable = class extends PIXI.Sprite { constructor(graphicName) { super(); this.isDrawable = true; this.sequence = 0; this.frame = 0; this.numFrames = 0; this.playing = false; this.playMode = Engine.DrawableStatics.PlayMode.Forwards; this.frameTimer = 0; this.frameRate = 30; this.graphicData = new Engine.GraphicDef(); this.skeletalController = null; //this.filterList = null;//[]; this.multiFilters = null;//[]; this.greyscaleFilter == null; //this.isNinePlane = false; this.ninePlane = null; this.nineRectData = null; this.onStage = false; this.name = "Drawable"; this.rotationDegrees = 0; this.stopAtEnd = false; this.animationCompleted = new Action(); this.onGraphicLoaded = new Action(); this.onGraphicReady = new Action(); this.containerSortMode = Engine.DrawableStatics.SortMode.Index; this._graphics = null; this.events = new Engine.DrawableEvents(this); this.frameEvents = {}; this.graphicName = ""; if (graphicName) { if (isNumeric(graphicName)) { this.loadFromGraphicID(graphicName); } else { this.setGraphicDataByName(graphicName); } } this.canvas = null; this.z = 0; this.performanceTime = null; this.parent = null; this.cacheAsBitmap = false; this.bakeHandler = null; } // renderWebGL(renderer) // { // var before = performance.now(); // super.renderWebGL(renderer); // var after = performance.now(); // var val = Math.trunc((after - before) * 10); // //if (this.children.length > 0 && this.parent != null && this.parent.name == "Game UI Layer") // if (this.children.length > 0 && this.parent != null && this.parent.name == "Hero Box") // { // if (this.performanceTime == null) // { // this.performanceTime = new Engine.DrawableText(); // this.performanceTime.setOutline(); // } // this.removeChild(this.performanceTime); // this.addChild(this.performanceTime); // this.performanceTime.setText(val); // Debug.Log("" + this.constructor.name + ": " + val); // //this.performanceTime.x = (this.width - this.performanceTime.width) * 0.5; // //this.performanceTime.y = (this.height - this.performanceTime.height) * 0.5; // } // } // renderCanvas(renderer) // { // var before = performance.now(); // super.renderCanvas(renderer); // var after = performance.now(); // var val = Math.trunc((after - before) * 10); // if (this.children.length > 0) // { // this.removeChild(this.performanceTime); // this.addChild(this.performanceTime); // this.performanceTime.setText(val); // this.performanceTime.x = (this.width - this.performanceTime.width) * 0.5; // this.performanceTime.y = (this.height - this.performanceTime.height) * 0.5; // } // } // Stuff for UI baking addUIBakeHandler(showLog = false) { this.bakeHandler = new Engine.BakeHandler(this, showLog); } allowUIBake(bakeAllowed) { if (this.bakeHandler != null) this.bakeHandler.allowBake(bakeAllowed); } incrementUnbakeableComponents() { if (this.bakeHandler != null) { this.bakeHandler.changeUnbakeableChildren(1); } else if (this.parent != null && this.parent instanceof Engine.Drawable) { this.parent.incrementUnbakeableComponents(); } } decrementUnbakeableComponents() { if (this.bakeHandler != null) { this.bakeHandler.changeUnbakeableChildren(-1); } else if (this.parent != null && this.parent instanceof Engine.Drawable) { this.parent.decrementUnbakeableComponents(); } } // end UI Baking Kogic sortChildren(sortFunc) { var childs = this.children.concat(); childs.sort(sortFunc); for (var i = 0; i < childs.length; i++) { this.setChildIndex(childs[i], i); } } addChildAt(child, index) { if (index < 0) index = 0; if (index > this.children.length) index = this.children.length; super.addChildAt(child, index); } getChildIndex(child) { return this.children.indexOf(child); }; // get filters() // { // return this.filterList; // } // set filters(f) // { // if (this.filterList == null) this.filterList = []; // else this.filterList.length = 0; // for (var i = 0; i < f.length; i++) // { // if (!this.filterList.contains(f[i])) // { // this.filterList.push(f[i]); // } // } // if (!Engine.Drawable.fastRenderMode) // { // super.filters = f; // } // } get greyscale() { return this.filters != null && this.filters.contains(this.greyscaleFilter); } set greyscale(enabled) { if (!enabled && this.greyscaleFilter == null) return; // || this.filterList == null || !this.filterList.contains(this.greyscaleFilter))) return; if (enabled && !this.greyscale) { if (this.greyscaleFilter == null) { this.greyscaleFilter = new PIXI.filters.ColorMatrixFilter(); this.greyscaleFilter.desaturate(); } this.addLiveEffect(this.greyscaleFilter); // this.filterList.push(this.greyscaleFilter); // super.filters = this.filterList; } else if (!enabled && this.greyscale) { this.removeLiveEffect(this.greyscaleFilter); // this.filterList.remove(this.greyscaleFilter); // super.filters = this.filterList; } } set filterMatrix(value) { if (this.tintFilter == null) this.tintFilter = new PIXI.filters.ColorMatrixFilter(); this.tintFilter.matrix = value; this.addLiveEffect(this.tintFilter); } get filterMatrix() { if (!this.tintFilter) return [1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0]; return this.tintFilter.matrix; } set filterTint(value) { if (value.getHex) value = value.getHex(); if (this.tintFilter == null) this.tintFilter = new PIXI.filters.ColorMatrixFilter(); this.tintFilter.matrix[0] = ((value & 0xFF0000) >> 16) / 0xFF; this.tintFilter.matrix[6] = ((value & 0xFF00) >> 8) / 0xFF; this.tintFilter.matrix[12] = (value & 0xFF) / 0xFF; this.addLiveEffect(this.tintFilter); // if (!this.filterList.contains(this.tintFilter)) // { // this.filterList.push(this.tintFilter); // } // super.filters = this.filterList; } get filterTint() { if (!this.tintFilter) return Colors.white; return new Color(this.tintFilter.matrix[0], this.tintFilter.matrix[6], this.tintFilter.matrix[12]); } clearFilterTint() { if (this.tintFilter == null) return; // || !this.filterList.contains(this.tintFilter)) return; this.removeLiveEffect(this.tintFilter); // this.filterList.remove(this.tintFilter); // super.filters = this.filterList; } get numSequences() { if (this.graphicData) return this.graphicData.sequences.length; return 0; } getSequence() { return this.sequence; } get totalFrames() { return this.numFrames; } getSequenceLength(sequence) { if (this.graphicData && this.graphicData.sequences[sequence] !== undefined) { if (this.skeletalController != null) { // this seems silly if (this.graphicData.sequences[sequence].length > 0) { return this.graphicData.sequences[sequence][0].sequence.length; } } else { return this.graphicData.sequences[sequence].length; } } return 0; } get numChildren() { return this.children.length; } setGameObjectName(name) { this.name = name; } get mouseEnabled() { return this.events.mouseEnabled; } set mouseEnabled(value) { if (value) this.events.enableMouseEvents(); if (!value) this.events.disableMouseEvents(); } /** * Sets the current sprite to be a nine rect sprite. * Defines the inner nine rect box as left, top, right, and bottom as percents. */ setNineRect(left, top, right, bottom) { /*if (this.nineRectData != null) { if (left === undefined) return; if (left == this.nineRectData.left && top == this.nineRectData.top && right == this.nineRectData.right && bottom == this.nineRectData.bottom) return; }*/ if (left === undefined) { if (this.nineRectData != null) { left = this.nineRectData.left; top = this.nineRectData.top; right = this.nineRectData.right; bottom = this.nineRectData.bottom; } else { left = 0.4; //0.5; //0.4; top = 0.4; //0.5; //0.4; right = 0.6; //0.501; //0.6; bottom = 0.6; //0.501; //0.6; } } //this.isNinePlane = true; this.nineRectData = {left: left, top: top, right: right, bottom: bottom}; if (!this.loaded) this.texture = PIXI.Texture.WHITE; if (this.ninePlane == null) { //Create a nine slice plane to replace the current sprite. var frameWidth = this.texture.frame.width; var frameHeight = this.texture.frame.height; this.ninePlane = new PIXI.NineSlicePlane(this.texture, Math.round(frameWidth * left), Math.round(frameHeight * top), Math.round(frameWidth * (1 - right)), Math.round(frameHeight * (1 - bottom))); this.addChildAt(this.ninePlane, 0); this.texture = PIXI.Texture.EMPTY; } else { var frameWidth = this.ninePlane.texture.frame.width; var frameHeight = this.ninePlane.texture.frame.height; this.ninePlane.leftWidth = Math.round(frameWidth * left); this.ninePlane.topHeight = Math.round(frameHeight * top); this.ninePlane.rightWidth = Math.round(frameWidth * (1 - right)); this.ninePlane.bottomHeight = Math.round(frameHeight * (1 - bottom)); this.addChildAt(this.ninePlane, 0); } // better solution if (this.loaded) { this.setFrame(this.frame) } } get width() { if (this.ninePlane != null) return this.ninePlane.width * this.scale.x; return this.getLocalBounds().width * Math.abs(this.scale.x); //return super.width; } set width(value) { //value = Math.floor(value); //if (this.isNinePlane) //{ if (this.ninePlane != null) { this.ninePlane.width = value; } //} else { super.width = value; } } get height() { if (this.ninePlane != null) return this.ninePlane.height * this.scale.y; return this.getLocalBounds().height * Math.abs(this.scale.y); //return super.height; } set height(value) { //value = Math.floor(value); //if (this.isNinePlane) //{ if (this.ninePlane != null) { this.ninePlane.height = value; } //} else { super.height = value; } } get x() { return super.x; } set x(value) { super.x = Math.trunc(value); } get y() { return super.y; } set y(value) { super.y = Math.trunc(value); } get screenRect() { return this.getBounds(); } get screenX() { return this.localToGlobal(new Vector2()).x; } get screenY() { return this.localToGlobal(new Vector2()).y; } get rotation() { return this.rotationDegrees; } set rotation(value) { super.rotation = value * -(Math.PI / 180); this.rotationDegrees = value; } get tint() { if (this.ninePlane != null) { return this.ninePlane.tint; } return super.tint; } set tint(value) { if (value.getHex) value = value.getHex(); if (this.ninePlane != null) { this.ninePlane.tint = value; return; } super.tint = value; } // this doesnt apply to child drawables... yet get additive() { return this.blendMode; } set additive(value) { if (value) { this.blendMode = PIXI.BLEND_MODES.ADD; if (this.ninePlane != null) { this.ninePlane.blendMode = PIXI.BLEND_MODES.ADD; } } else { this.blendMode = PIXI.BLEND_MODES.NORMAL; if (this.ninePlane != null) { this.ninePlane.blendMode = PIXI.BLEND_MODES.NORMAL; } } } localToGlobal(pos) { if (pos === undefined){ Debug.Log("Undefined point passed into localToGlobal"); return new Vector2(0, 0); } var globalPos = this.toGlobal(new PIXI.Point(pos.x, pos.y)); return new Vector2(globalPos.x, globalPos.y); } localRectToGlobal(rect) { var topLeft = this.toGlobal(new PIXI.Point(rect.x, rect.y)); var bottomRight = this.toGlobal(new PIXI.Point(rect.x + rect.width, rect.y + rect.height)); return new PIXI.Rectangle(topLeft.x, topLeft.y, bottomRight.x - topLeft.x, bottomRight.y - topLeft.y); } globalToLocal(pos) { //var localPos = new Vector2(pos.x - bounds.x, pos.y - bounds.y); if (pos === undefined){ Debug.Log("Undefined point passed into globalToLocal"); return new Vector2(0, 0); } var localPos = this.toLocal(new PIXI.Point(pos.x, pos.y)); return new Vector2(localPos.x, localPos.y); } addChild(drawable) { if (drawable == null || drawable.parent == this){ return; } super.addChild(drawable); if (drawable.setChildrenOnStage) drawable.setChildrenOnStage(this.onStage); } removeChild(drawable) { if (drawable == null){ return; } super.removeChild(drawable); if (drawable.setChildrenOnStage) drawable.setChildrenOnStage(false); } setChildrenOnStage(onStage) { if (this.onStage != onStage) { //fire activated/deactivated if(this.onActivated) { this.onActivated(onStage); if (onStage) this.events.fireActivated(); if (!onStage) this.events.fireDeactivated(); } } this.onStage = onStage; for (var i = 0; i < this.children.length; i++) { if (this.children[i].setChildrenOnStage) { this.children[i].setChildrenOnStage(onStage, true); } } } setXYUnrounded(x, y) { super.x = x; super.y = y; } setSequence(seq, frame, force) { if (frame === undefined) frame = 0; if (force === undefined) force = false; if (!isFinite(seq)) { Debug.LogError("invalid sequence attempted "+seq); seq = 0; } if (this.graphicData == null || !this.graphicData.loaded) { this.sequence = seq; this.frame = frame; return; } seq = Math.max(0, Math.min(this.numSequences - 1, seq)); this.sequence = seq; this.numFrames = this.graphicData == null ? 0 : this.graphicData.getNumFramesInSeq(seq); var sequenceFrames = this.getSequenceLength(seq); if (frame < 0) frame += sequenceFrames; frame = Math.max(0, Math.min(sequenceFrames - 1, frame)); this.setFrame(frame); } gotoAndPlay(frame, playMode) { if (playMode === undefined) playMode = Engine.DrawableStatics.PlayMode.Forwards; this.setFrame(frame); this.play(); } gotoAndStop(frame) { this.playing = false; this.setFrame(frame); } stop() { this.playing = false; } play(playMode) { if (playMode === undefined) playMode = Engine.DrawableStatics.PlayMode.Forwards; this.playMode = playMode; this.playing = true; } looksLikeSequenceFrames() { if (this.graphicData == null || !this.graphicData.loaded) return false; if (this.numSequences < 2) return false; for (var i = 0; i < this.numSequences; i++) { if (this.getSequenceLength(i) > 1) return false; } return true; } looksLikeSingleSequence() { if (this.graphicData == null || !this.gradeData.loaded) return false; if (this.numSequences > 1) return false; if (this.getSequenceLength(0) <= 1) return false; return true; } setFrame(frame, isRenderFrame) { if (isRenderFrame === undefined) isRenderFrame = true; if (this.graphicData == null || !this.graphicData.loaded) { this.frame = frame; return; } this.frame = 0; if (this.numFrames > 0) { this.frame = (frame + this.numFrames) % this.numFrames; } if (isRenderFrame) { if (this.skeletalController != null) { this.skeletalController.setFrame(this.sequence, this.frame); } else if (this.ninePlane != null) { /*var newTexture = this.graphicData.getTexture(this.sequence, this.frame); if (newTexture.baseTexture != this.ninePlane.texture.baseTexture) { this.ninePlane.texture = newTexture; } this.ninePlane.texture.frame = newTexture.frame;*/ this.graphicData.matchSprite(this.ninePlane, this.sequence, this.frame); } else { this.graphicData.matchSprite(this, this.sequence, this.frame); } } } setTexturedRect(baseTexture, uvRect /*Rect*/, pixelRect /*Rect*/) { this.graphicData = null; this.playing = false; if (this.texture == null || this.texture == PIXI.Texture.EMPTY) { this.texture = new PIXI.Texture(baseTexture); } if (this.texture.baseTexture != baseTexture) { this.texture.baseTexture = baseTexture; } var pixiUVRect = uvRect; if (uvRect instanceof Rect) { uvRect = new PIXI.Rectangle(uvRect.xMin, uvRect.yMin, uvRect.width, uvRect.height); } this.texture.frame = new PIXI.Rectangle(uvRect.x * baseTexture.width, uvRect.y * baseTexture.height, uvRect.width * baseTexture.width, uvRect.height * baseTexture.height); this.texture.updateUvs(); this.anchor.x = -pixelRect.xMin / pixelRect.width; this.anchor.y = -pixelRect.yMin / pixelRect.height; this.width = pixelRect.width; this.height = pixelRect.height; } manualAnimationUpdate() { //DirtyTransform = true; this.updateAnimation(0, true); } updateAnimation(timeElapsed, isRenderFrame) { if (this.playing) { if (this.numFrames > 1) { this.frameTimer += timeElapsed; var timePerFrame = 1.0 / this.frameRate; while (this.frameTimer > timePerFrame) { this.setFrame(this.playMode == Engine.DrawableStatics.PlayMode.Forwards ? this.frame + 1 : this.frame - 1); var breakOnFrame = false; if (this.frameEvents[this.sequence] !== undefined && this.frameEvents[this.sequence][this.frame]) { var frameEvents = this.frameEvents[this.sequence][this.frame]; for(var event of frameEvents) this.queueFrameEvent(event); breakOnFrame = true; } if (this.stopAtEnd) { if ((this.playMode == Engine.DrawableStatics.PlayMode.Forwards && this.frame >= this.numFrames - 1) || (this.playMode == Engine.DrawableStatics.PlayMode.Backwards && this.frame <= 0)) { this.playing = false; Engine.DrawableStatics.QueuedFrameEvents.push(() => { this.animationCompleted.call(this); } ); breakOnFrame = true; } } this.frameTimer -= timePerFrame; if (breakOnFrame) break; } } if (this.graphicData && this.graphicData.loaded && this.numFrames == 1) this.playing = false; } } queueFrameEvent(frameEvent) { Engine.DrawableStatics.QueuedFrameEvents.push(() => { frameEvent(this); } ); } static doQueuedFrameEvents() { //Make any queued up frame events. for (var i = 0; i < Engine.DrawableStatics.QueuedFrameEvents.length; i++) { Engine.DrawableStatics.QueuedFrameEvents[i](); } Engine.DrawableStatics.QueuedFrameEvents.length = 0; } drawableUpdate(timeElapsed, paused, isRenderFrame) { if (this.multiFilters != null) { for (var mf of this.multiFilters) { mf.update(); } } if (!paused) { this.updateAnimation(timeElapsed, isRenderFrame); for (var i = 0; i < this.children.length; i++) { if (this.children[i].drawableUpdate) { this.children[i].drawableUpdate(timeElapsed); } } } if (this.containerSortMode == Engine.DrawableStatics.SortMode.Z) { this.children.sort((a, b) => { if(a.z === b.z) return 0; else return (a.z < b.z ? -1 : 1); }); } } clearFrameEvents(seq) { if (seq !== undefined) { delete this.frameEvents[seq]; } else { this.frameEvents = {}; } } setFrameEvent(seq, frame, action, add) { if (add == undefined) add = false; if (this.frameEvents[seq] === undefined) this.frameEvents[seq] = {}; if (this.frameEvents[seq][frame] === undefined) { this.frameEvents[seq][frame] = [action]; } else { if (add) { this.frameEvents[seq][frame].push(action); } else { this.frameEvents[seq][frame] = [action]; } } } removeFrameEvent(seq, frame, action) { if (this.frameEvents != null && this.frameEvents[seq] !== undefined && this.frameEvents[seq][frame] !== undefined) { //This is only going to work if you have kept a reference to your action for removal... if (action !== undefined) { var index = this.frameEvents[seq][frame].indexOf(action); if (index != -1) { this.frameEvents[seq][frame].splice(index, 1); } } else { // if no action is passed, just clear the frame... this.frameEvents[seq][frame] = []; } } } get loaded() { return (this.graphicData != null && this.graphicData.loadStatus == GraphicDefStatics.LoadState.Loaded); } loadFromGraphicName(graphicName, requestedWidth, requestedHeight) { this.graphicName = graphicName; this.setGraphicDataByName(graphicName, requestedWidth, requestedHeight); } loadFromGraphicID(graphicId, requestedWidth, requestedHeight) { var graphicName = Engine.GraphicFactoryInstance.getGraphicNameById(graphicId); this.setGraphicDataByName(graphicName, requestedWidth, requestedHeight); } setGraphicDataByName(graphicName, requestedWidth, requestedHeight) { this.graphicName = graphicName; if (requestedWidth === undefined) requestedWidth = -1; if (requestedHeight === undefined) requestedHeight = -1; var graphicData = null; if (requestedWidth > -1 && requestedWidth > -1) { graphicData = Engine.GraphicFactoryInstance.getGraphicDataByName(graphicName, requestedWidth, requestedHeight); } else { graphicData = Engine.GraphicFactoryInstance.getGraphicDataByName(graphicName); } if (!graphicData) { Debug.LogError("Error loading "+graphicName+" graphic not found!"); return; } this.setGraphicData(graphicData); } //for compatability. setGraphicDef(graphicDef){ this.setGraphicData(graphicDef); } setGraphicData(graphicData) { var t = this; if (this.graphicData == graphicData) { //Graphic already set to this graphic data, nothing to do here... if (this.graphicData != null && this.graphicData.loadStatus == GraphicDefStatics.LoadState.Loaded) this.onGraphicReady.call(this); return; } this.graphicName = graphicData == null ? "" : graphicData.name; if (graphicData == null) { //todo clear... this.clearSprite(); return; } this.clearSprite(); this.graphicData = graphicData; if (graphicData.loaded) { this.graphicDataLoaded(graphicData); } else if (graphicData.loadStatus == GraphicDefStatics.LoadState.None) { Engine.GraphicFactoryInstance.loadGraphicData(graphicData, function(){ t.graphicDataLoaded(graphicData); }); } } graphicDataLoaded(graphicData) { // is this hacky? // prevents loading multiple graphics, and the first one loading after the second one. // happens in the hero collection screen when scrolling with scroll bar. if (graphicData != this.graphicData) return; this.graphicName = graphicData.name; graphicData.setTextureMode(PIXI.SCALE_MODES.LINEAR); if (graphicData.type == "skeletal") { if (this.skeletalController == null) { this.skeletalController = new Engine.SkeletalAnimationControllerReplaceable(graphicData); this.addChild(this.skeletalController.group); } else { //CLEAR THE CONTROLLER AND MAKE A NEW ONE! this.skeletalController.destroy(); this.skeletalController = new Engine.SkeletalAnimationControllerReplaceable(graphicData); this.addChild(this.skeletalController.group); } } else if (this.skeletalController != null) { this.skeletalController.destroy(); this.skeletalController = null; } /*if (graphicData.type == "spritesheet") { //if this was previously used as a skeletal, but now being set as a spritesheet, clear the skeletal controller! if (this.skeletalController != null) { this.skeletalController.destroy(); this.skeletalController = null; } }*/ if (graphicData.type == "scene") { var clips = graphicData.clips; for (var i = 0; i < clips.length; i++) { var clip = clips[i]; var sprite = new Engine.Drawable(); sprite.setGraphicDataByName(clip.name); if (sprite.graphicData.id == -1) sprite.graphicData.parentSceneData = graphicData; sprite.x = clip.x; sprite.y = clip.y; sprite.scale.x = clip.sx; sprite.scale.y = clip.sy; sprite.rotation = clip.rot; sprite.name = clip.original_name; sprite.gotoAndPlay(0); this.addChild(sprite); } } else { this.setSequence(this.sequence, this.frame); // setframe gets called in setsequence //this.setFrame(this.frame); } //reset the nine rect data, because the texture size could have changed. if (this.ninePlane != null) this.setNineRect(); if (this.onGraphicLoaded != null) this.onGraphicLoaded.call(this); if (this.onGraphicReady != null) this.onGraphicReady.call(this); } clearSprite() { this.graphicData = null; this.graphicName = ""; if (this.skeletalController != null) { this.skeletalController.destroy(); this.skeletalController = null; } this.texture = PIXI.Texture.EMPTY; this.playing = false; } load(url) { } clear() { this.graphicData = null; this.removeAllChildren(); this.clearFrameEvents(); if (this.skeletalController != null) { this.skeletalController.destroy(); this.skeletalController = null; } this.texture = PIXI.Texture.EMPTY; this.playing = false; } contains(drawable) { return this.children.indexOf(drawable) != -1; } getAllChildren() { return this.children; } removeAllChildren() { while(this.children.length > 0) { this.removeChild(this.children[0]); } } childrenByPartialName(name) { var matchingChildren = []; for (var i = 0; i < this.children.length; i++) { if (this.children[i].name && this.children[i].name.indexOf(name) != -1) { matchingChildren.push(this.children[i]); } } return matchingChildren; } childByName(name) { for (var child of this.children) { if (child.name == name) return child; } return null; } get hasParent() { return this.parent != null; } removeFromParent() { if (this.parent != null) this.parent.removeChild(this); } drawPolygon(graphics, points, color /* = 0xFFFFFF*/, alpha /* = 1 */) { if (points.length < 3) return; if (color === undefined) color = 0xFFFFFF; if (alpha === undefined) alpha = 1; graphics.lineStyle(); graphics.beginFill(color, alpha); graphics.moveTo(points[0].x, points[0].y); for (var i = 1; i < points.length; i++) { graphics.lineTo(points[i].x, points[i].y); } graphics.endFill(); } setAsBox(graphic, width, height, color, alpha) { //width = Math.floor(width); //height = Math.floor(height); try { if (color.getHex) color = color.getHex(); graphic.clear(); graphic.beginFill(color, alpha); graphic.drawRect(0, 0, width, height); graphic.hitArea = graphic.getLocalBounds(); } catch(e) { Debug.Log("Set as box exception"); } } setAsBoxGradient(width, height, colorA, alphaA, colorB, alphaB, horizontal) { //width = Math.floor(width); //height = Math.floor(height); if (alphaA === undefined) alphaA = 1; if (colorB === undefined) colorB = colorA; if (alphaB === undefined) alphaB = alphaA; if (horizontal === undefined) horizontal = false; try { this.texture = this.gradientFill(width, height, colorA, alphaA, colorB, alphaB, horizontal); this.texture.update(); } catch(e) { Debug.Log("Set as box exception"); } } gradientFill(width, height, colorA, alphaA, colorB, alphaB, horizontal) { width = Math.floor(width); height = Math.floor(height); if (this.canvas == null) this.canvas = document.createElement('canvas'); this.canvas.width = width; this.canvas.height = height; var ctx = this.canvas.getContext('2d'); var gradient = ctx.createLinearGradient(0, 0, horizontal ? width : 0, horizontal ? 0 : height); gradient.addColorStop(horizontal ? 0 : 1, colorA.getAlphaStyle(alphaA)); gradient.addColorStop(horizontal ? 1 : 0, colorB.getAlphaStyle(alphaB)); ctx.fillStyle = gradient; ctx.fillRect(0, 0, width, height); return PIXI.Texture.from(this.canvas); } get graphics() { if (this._graphics == null) { this._graphics = new PIXI.Graphics(); this.addChildAt(this._graphics, 0); } return this._graphics; } addLiveEffect(filter) { if (this.filters == null) this.filters = []; if (filter instanceof Engine.MultiFilter) { if (this.multiFilters == null) this.multiFilters = []; if (!this.multiFilters.contains(filter)) { this.multiFilters.push(filter); var addedFilter = false; for (var f of filter.filters) { if (!this.filters.contains(f)) { this.filters.push(f); addedFilter = true; } } //if (addedFilter) super.filters = this.filterList; } return; } if (filter instanceof PIXI.Filter) { if (!this.filters.contains(filter)) { this.filters.push(filter); //super.filters = this.filters; } return; } } removeLiveEffect(filter) { if (filter instanceof Engine.MultiFilter && this.multiFilters != null && this.multiFilters.contains(filter)) { this.multiFilters.remove(filter); var filterRemoved = false; for (var f of filter.filters) { if (this.filters.contains(f)) { this.filters.remove(f); filterRemoved = true; } } //if (filterRemoved) super.filters = this.filterList; return; } if (filter instanceof PIXI.Filter && this.filters != null && this.filters.contains(filter)) { this.filters.remove(filter); //super.filters = this.filters; return; } } }