88 lines
3.2 KiB
JavaScript
88 lines
3.2 KiB
JavaScript
import { BaseInput } from './base-input';
|
|
export class Mouse extends BaseInput {
|
|
constructor(element) {
|
|
super(element);
|
|
this.mousePosition = new Position();
|
|
this.mouseDelta = new Delta();
|
|
this.mouseWheel = new Delta();
|
|
this.mouseButtons = new MouseButtons();
|
|
}
|
|
capture() {
|
|
this.handleMouseDown = this.handleMouseDown.bind(this);
|
|
this.handleMouseMove = this.handleMouseMove.bind(this);
|
|
this.handleMouseUp = this.handleMouseUp.bind(this);
|
|
this.handlePointerChange = this.handlePointerChange.bind(this);
|
|
this.active = true;
|
|
this.element.addEventListener('mousedown', this.handleMouseDown);
|
|
this.element.addEventListener('mousemove', this.handleMouseMove);
|
|
this.element.addEventListener('mouseup', this.handleMouseUp);
|
|
document.addEventListener('pointerlockchange', this.handlePointerChange);
|
|
}
|
|
release() {
|
|
this.active = false;
|
|
this.element.removeEventListener('mousedown', this.handleMouseDown);
|
|
this.element.removeEventListener('mousemove', this.handleMouseMove);
|
|
this.element.removeEventListener('mouseup', this.handleMouseUp);
|
|
}
|
|
getState() {
|
|
const { mouseButtons, mouseDelta, mousePosition, mouseWheel } = this;
|
|
const state = {
|
|
mouseButtons: {
|
|
keysDown: new Map(this.mouseButtons.keysDown),
|
|
keysJustPressed: new Map(this.mouseButtons.keysJustPressed),
|
|
keysJustReleased: new Map(this.mouseButtons.keysJustReleased)
|
|
},
|
|
mouseDelta,
|
|
mousePosition,
|
|
mouseWheel
|
|
};
|
|
this.mouseButtons.keysJustPressed.clear();
|
|
this.mouseButtons.keysJustReleased.clear();
|
|
this.mouseDelta.x = 0;
|
|
this.mouseDelta.y = 0;
|
|
return state;
|
|
}
|
|
handleMouseDown(event) {
|
|
if (this.active)
|
|
event.preventDefault();
|
|
this.mouseButtons.keysDown.set(event.button, true);
|
|
this.mouseButtons.keysJustPressed.set(event.button, true);
|
|
this.mouseButtons.keysJustReleased.set(event.button, false);
|
|
}
|
|
handleMouseMove(event) {
|
|
if (this.active)
|
|
event.preventDefault();
|
|
this.mousePosition.x = event.clientX;
|
|
this.mousePosition.y = event.clientY;
|
|
this.mouseDelta.x = event.movementX;
|
|
this.mouseDelta.y = event.movementY;
|
|
}
|
|
handleMouseUp(event) {
|
|
if (this.active)
|
|
event.preventDefault();
|
|
this.mouseButtons.keysJustReleased.set(event.button, true);
|
|
this.mouseButtons.keysDown.set(event.button, false);
|
|
this.mouseButtons.keysJustPressed.set(event.button, false);
|
|
}
|
|
handlePointerChange() {
|
|
if (document.pointerLockElement !== this.element) {
|
|
this.element.addEventListener('click', () => {
|
|
this.element.requestPointerLock();
|
|
}, {
|
|
once: true
|
|
});
|
|
}
|
|
}
|
|
}
|
|
export class Position {
|
|
}
|
|
export class MouseButtons {
|
|
constructor() {
|
|
this.keysDown = new Map();
|
|
this.keysJustPressed = new Map();
|
|
this.keysJustReleased = new Map();
|
|
}
|
|
}
|
|
export class Delta {
|
|
}
|