Engine.DialogBlockerInfo = class { constructor() { this.color = new Color(0, 0, 0); this.alpha = 0.5; } equals(blockerInfo) { return blockerInfo.color == this.color && blockerInfo.alpha == this.alpha; } } Engine.DialogBlocker = class extends Engine.Drawable { constructor() { super(); this.blockerInfo = null; this.used = false; this.isBlocker = true; this.mouseEnabled = true; // this.interactive = true; // this.interactiveChildren = true; } drawFullScreen() { this.draw(EngineSettings.screenWidth, EngineSettings.screenHeight); } draw(w, h) { this.setAsBox(this.graphics, w, h, this.blockerInfo.color, this.blockerInfo.alpha) //this.beginFill(this.blockerInfo.color, this.blockerInfo.alpha); //this.drawRect(0, 0, w, h); this.hitArea = this.getLocalBounds(); } } Engine.Dialog = class extends Engine.Drawable { constructor(parentClip) { super(); this.isDialog = true; this.dt = new Engine.DialogTransitionerSlide(this); this.shakeTween = new Engine.SimpleTween(); this.currentShakeOffset = 0; this.dialogY = 0; this.originalY = 0; this.blockerInfo = new Engine.DialogBlockerInfo(); this.alwaysOnBottom = false; this.parentClip = parentClip; this.active = false; this.dialogWidth = 0; this.dialogHeight = 0; this.playDialogSounds = true; this.hiding = false; this.onHideFinish = new Action(); this.clickBgToClose = false; this.hideClickRegion = null; } addParentLayerUnderAllOfSameType() { if (this.parentClip == null) return; var others = Engine.DialogManagerInstance.getAllActiveDialogs(this.constructor); var index = null; for (var d of others) { if (this.parentClip.contains(d)) { var cIndex = this.parentClip.getChildIndex(d); if (index == null || cIndex < index) { index = cIndex; } } } if (index != null) { this.parentClip.addChildAt(this, index); } else { this.parentClip.addChild(this); } } get isTransitioning() { return this.dt != null && this.dt.active; } get clickBackgroundToClose() { return this.clickBgToClose; } set clickBackgroundToClose(value) { if (this.clickBgToClose != value) { this.clickBgToClose = value; if (this.clickBgToClose) { if (this.hideClickRegion == null) { //this.hideClickRegion = new PIXI.Graphics(); //this.hideClickRegion.interactive = true; //this.hideClickRegionHandler = (event) => { this.hideClickRegionClicked(event); }; this.hideClickRegion = new Engine.Drawable(); this.hideClickRegion.mouseEnabled = true; } //this.hideClickRegion.on('pointerdown', this.hideClickRegionHandler); this.hideClickRegion.events.onMouseDown.addListener(this, this.hideClickRegionClicked); } else { if (this.hideClickRegion != null) { //this.hideClickRegion.off('pointerdown', this.hideClickRegionHandler); this.hideClickRegion.events.onMouseDown.removeListener(this, this.hideClickRegionClicked); } } } } hideClickRegionClicked() { this.hide(); } hide(instant) { if (instant === undefined) instant = false; //Already hiding? lets not hide again... if (this.hiding) return; if (this.hideClickRegion != null) this.removeChild(this.hideClickRegion); this.hiding = true; if (instant) { this.finishHide(); } else { this.dt.transitionOut(() => { this.finishHide(); }); } Engine.DialogManagerInstance.fireActiveDialogsChanged(); Engine.DialogManagerInstance.fireDialogTransitioned(this.constructor, Engine.DialogManagerStatics.TransitionType.Hidden); if (this.playDialogSounds) Engine.SoundPlayerInstance.playSound(65); } finishHide() { Engine.EnterFrameManagerInstance.remove(this); this.parentClip.removeChild(this); this.active = false; this.hiding = false; if (this.onHideFinish != null) this.onHideFinish.call(); } finishSlide() { if (this.clickBackgroundToClose) { this.addChildAt(this.hideClickRegion, 0); //this.hideClickRegion.clear(); //this.hideClickRegion.beginFill(0xFFFFFF, 0); //this.hideClickRegion.drawRect(0, 0, EngineSettings.screenWidth, EngineSettings.screenHeight); //this.hideClickRegion.hitArea = this.hideClickRegion.getBounds(); this.hideClickRegion.setAsBox(this.hideClickRegion.graphics, EngineSettings.screenWidth, EngineSettings.screenHeight, Colors.black, 0); this.hideClickRegion.x = -this.x; this.hideClickRegion.y = -this.y; } this.originalY = this.y; this.dialogY = this.originalY; Engine.DialogManagerInstance.fireDialogTransitioned(this.constructor, Engine.DialogManagerStatics.TransitionType.Shown); } dialogAvailableChanged() { Engine.DialogManagerInstance.fireDialogAvailableChanged(this); } update(timeElapsed) { } resolutionChanged(width, height) { var targetPosition = this.dt.getTargetPosition(); this.x = targetPosition.x; this.y = targetPosition.y; this.originalY = this.y; this.dialogY = this.originalY; } showDialog(instant = false, underAllSameType = false) { if (underAllSameType) { this.addParentLayerUnderAllOfSameType(); } else { this.parentClip.addChild(this); } this.active = true; this.dt.transitionIn(()=>{this.finishSlide();} ); Engine.DialogManagerInstance.addDialogToUpdate(this); Engine.DialogManagerInstance.fireActiveDialogsChanged(); Engine.DialogManagerInstance.fireDialogTransitioned(this.constructor, Engine.DialogManagerStatics.TransitionType.Shown); if (this.playDialogSounds) Engine.SoundPlayerInstance.playSound(66); } showInstant() { return false; } doStaticShake(strength , time /*float*/) { this.shakeTween.init((value) => this.shakeUpdate(value), this.staticShakeTween, 0, strength, time); this.shakeTween.onFinish = () => { this.y = this.dialogY = this.originalY; } } staticShakeTween(t /*float*/, b /*float*/, c /*float*/, d /*float*/) { return b + Math.sin(t * Math.PI * 13) * c; } shakeTweenUpdate(t /*float*/, b /*float*/, c /*float*/, d /*float*/) { t = t / d; return b + Math.sin(t * Math.PI * 13) * c * (1 - (t * 0.6)); } shakeUpdate(value /*float*/) { this.Y = this.dialogY + value; this.currentShakeOffset = value; } }