@spearwolf/twopoint5d
Version:
a library to create 2.5d realtime graphics and pixelart with three.js
136 lines • 4.34 kB
JavaScript
var _a;
import { emit, eventize } from '@spearwolf/eventize';
export class DisplayStateMachine {
static { this.NEW = 'new'; }
static { this.RUNNING = 'running'; }
static { this.PAUSED = 'paused'; }
static { this.Init = 'init'; }
static { this.Start = 'start'; }
static { this.Pause = 'pause'; }
static { this.Restart = 'restart'; }
#pausedByUser;
#documentIsVisible;
#elementIsInsideViewport;
constructor() {
this.state = _a.NEW;
this.#pausedByUser = false;
this.#documentIsVisible = true;
this.#elementIsInsideViewport = true;
this.#pausedByUserChanged = () => {
switch (this.state) {
case _a.RUNNING:
if (this.#pausedByUser) {
this.#pause();
}
break;
case _a.PAUSED:
if (!this.#pausedByUser) {
this.start();
}
break;
}
};
this.#documentIsVisibleChanged = () => {
switch (this.state) {
case _a.RUNNING:
case _a.PAUSED:
if (this.#documentIsVisible) {
this.start();
}
else {
this.#pause();
}
break;
}
};
this.#elementIsInsideViewportChanged = () => {
switch (this.state) {
case _a.RUNNING:
case _a.PAUSED:
if (this.#elementIsInsideViewport) {
this.start();
}
else {
this.#pause();
}
break;
}
};
this.#pause = () => {
if (this.state !== _a.PAUSED) {
this.state = _a.PAUSED;
emit(this, _a.Pause);
}
};
this.#initMustBeCalled = true;
this.#initOrRestart = () => {
if (this.#initMustBeCalled) {
this.#initMustBeCalled = false;
emit(this, _a.Init);
}
else {
emit(this, _a.Restart);
}
};
eventize(this);
}
get pausedByUser() {
return this.#pausedByUser;
}
set pausedByUser(pausedByUser) {
if (pausedByUser !== this.#pausedByUser) {
this.#pausedByUser = pausedByUser;
this.#pausedByUserChanged();
}
}
get documentIsVisible() {
return this.#documentIsVisible;
}
set documentIsVisible(documentIsVisible) {
if (documentIsVisible !== this.#documentIsVisible) {
this.#documentIsVisible = documentIsVisible;
this.#documentIsVisibleChanged();
}
}
get elementIsInsideViewport() {
return this.#elementIsInsideViewport;
}
set elementIsInsideViewport(elementIsInsideViewport) {
if (elementIsInsideViewport !== this.#elementIsInsideViewport) {
this.#elementIsInsideViewport = elementIsInsideViewport;
this.#elementIsInsideViewportChanged();
}
}
#pausedByUserChanged;
#documentIsVisibleChanged;
#elementIsInsideViewportChanged;
#pause;
#initMustBeCalled;
#initOrRestart;
start() {
if (this.state !== _a.RUNNING) {
const isPaused = this.#pausedByUser || !this.#documentIsVisible || !this.#elementIsInsideViewport;
switch (this.state) {
case _a.NEW:
if (!isPaused) {
this.#initOrRestart();
this.state = _a.RUNNING;
emit(this, _a.Start);
}
else {
this.#pause();
}
break;
case _a.PAUSED:
if (!isPaused) {
this.#initOrRestart();
this.state = _a.RUNNING;
emit(this, _a.Start);
}
break;
}
}
}
}
_a = DisplayStateMachine;
//# sourceMappingURL=DisplayStateMachine.js.map