UNPKG

the-world-engine

Version:

three.js based, unity like game engine for browser

166 lines (165 loc) 4.49 kB
import { EventContainer } from "../collection/EventContainer"; export class InputHandler { ue; A; _e; we=new EventContainer; de=new EventContainer; Ee=new EventContainer; Me=new EventContainer; ye=new EventContainer; ge=new EventContainer; Ke=new EventContainer; Pe=new EventContainer; De=false; Te=null; Ue=null; be=null; constructor(e) { this.ue = new Map; this.A = false; this._e = e; } get map() { return this.ue; } dispose() { this.stopHandleEvents(); this.A = true; } startHandleEvents() { if (this.A) { throw new Error("InputHandler is disposed."); } window.addEventListener("keydown", this.ke); window.addEventListener("keyup", this.He); window.addEventListener("wheel", this.Le); this._e.addEventListener("mousedown", this.We); this._e.addEventListener("mouseup", this.Ie); this._e.addEventListener("mouseenter", this.Se); this._e.addEventListener("mouseleave", this.Xe); this._e.addEventListener("mousemove", this.Ye); this._e.addEventListener("touchstart", this.xe); this._e.addEventListener("touchend", this.Fe); this._e.addEventListener("touchmove", this.Oe); this._e.addEventListener("touchcancel", this.je); } stopHandleEvents() { if (this.Ue) this.Ie(this.Ue); if (this.be) this.Xe(this.be); this.ue.clear(); window.removeEventListener("keydown", this.ke); window.removeEventListener("keyup", this.He); window.removeEventListener("wheel", this.Le); this._e.removeEventListener("mousedown", this.We); this._e.removeEventListener("mouseup", this.Ie); this._e.removeEventListener("mouseenter", this.Se); this._e.removeEventListener("mouseleave", this.Xe); this._e.removeEventListener("mousemove", this.Ye); this._e.removeEventListener("touchstart", this.xe); this._e.removeEventListener("touchend", this.Fe); this._e.removeEventListener("touchmove", this.Oe); this._e.removeEventListener("touchcancel", this.je); } qe(e, t) { const i = new MouseEvent(e, { bubbles: true, cancelable: true, view: window, detail: 1, screenX: t.screenX, screenY: t.screenY, clientX: t.clientX, clientY: t.clientY, ctrlKey: false, altKey: false, shiftKey: false, metaKey: false, button: 0, relatedTarget: null }); t.target.dispatchEvent(i); } ke=e => { const t = e.key.length === 1 ? e.key.toLowerCase() : e.key; this.ue.set(t, true); this.we.invoke(e); }; He=e => { const t = e.key.length === 1 ? e.key.toLowerCase() : e.key; this.ue.set(t, false); this.de.invoke(e); }; Le=e => { this.Ee.invoke(e); }; We=e => { this.Ue = e; this.Me.invoke(e); }; Ie=e => { this.Ue = null; this.ye.invoke(e); }; Se=e => { this.be = e; this.ge.invoke(e); }; Xe=e => { this.be = null; this.Ke.invoke(e); }; Ye=e => { this.Ue = e; this.Pe.invoke(e); }; xe=e => { this.Te = () => { this.qe("mouseenter", e.touches[0]); this.qe("mousedown", e.touches[0]); }; }; Fe=e => { if (!this.De) return; this.De = false; this.qe("mouseup", e.changedTouches[0]); this.qe("mouseleave", e.changedTouches[0]); }; Oe=e => { if (this.Te) { this.Te(); this.Te = null; } this.qe("mousemove", e.touches[0]); this.De = true; }; je=e => { if (!this.De) return; this.De = false; this.qe("mouseleave", e.changedTouches[0]); }; get onKeyDown() { return this.we; } get onKeyUp() { return this.de; } get onWheel() { return this.Ee; } get onPointerDown() { return this.Me; } get onPointerUp() { return this.ye; } get onPointerEnter() { return this.ge; } get onPointerLeave() { return this.Ke; } get onPointerMove() { return this.Pe; } }