the-world-engine
Version:
three.js based, unity like game engine for browser
166 lines (165 loc) • 4.49 kB
JavaScript
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;
}
}