59 lines
1.6 KiB
TypeScript
59 lines
1.6 KiB
TypeScript
import { Easing } from "../../types";
|
|
|
|
export class TalkIcon extends Phaser.GameObjects.Image {
|
|
private shown: boolean;
|
|
private showAnimationTween?: Phaser.Tweens.Tween;
|
|
|
|
private defaultPosition: { x: number; y: number };
|
|
private defaultScale: number;
|
|
|
|
constructor(scene: Phaser.Scene, x: number, y: number) {
|
|
super(scene, x, y, "iconTalk");
|
|
|
|
this.defaultPosition = { x, y };
|
|
this.defaultScale = 0.3;
|
|
|
|
this.shown = false;
|
|
this.setAlpha(0);
|
|
this.setScale(this.defaultScale);
|
|
|
|
this.scene.add.existing(this);
|
|
}
|
|
|
|
public show(show: boolean = true, forceClose: boolean = false): void {
|
|
if (this.shown === show && !forceClose) {
|
|
return;
|
|
}
|
|
this.showAnimation(show, forceClose);
|
|
}
|
|
|
|
private showAnimation(show: boolean = true, forceClose: boolean = false) {
|
|
if (forceClose && !show) {
|
|
this.showAnimationTween?.stop();
|
|
} else if (this.showAnimationTween?.isPlaying()) {
|
|
return;
|
|
}
|
|
this.shown = show;
|
|
if (show) {
|
|
this.y += 50;
|
|
this.scale = 0.05;
|
|
this.alpha = 0;
|
|
}
|
|
this.showAnimationTween = this.scene.tweens.add({
|
|
targets: [this],
|
|
duration: 350,
|
|
alpha: show ? 1 : 0,
|
|
y: this.defaultPosition.y,
|
|
scale: this.defaultScale,
|
|
ease: Easing.BackEaseOut,
|
|
onComplete: () => {
|
|
this.showAnimationTween = undefined;
|
|
},
|
|
});
|
|
}
|
|
|
|
public isShown(): boolean {
|
|
return this.shown;
|
|
}
|
|
}
|