51 lines
1.8 KiB
JavaScript
51 lines
1.8 KiB
JavaScript
import { BaseInput } from './base-input';
|
|
export class Keyboard extends BaseInput {
|
|
constructor(element) {
|
|
super(element);
|
|
this.keysDown = new Map();
|
|
this.keysJustPressed = new Map();
|
|
this.keysJustReleased = new Map();
|
|
this.handleKeyDown = this.handleKeyDown.bind(this);
|
|
this.handleKeyUp = this.handleKeyUp.bind(this);
|
|
}
|
|
capture(preventDefault) {
|
|
this.active = true;
|
|
this.preventDefault = preventDefault;
|
|
this.element.addEventListener('keydown', this.handleKeyDown);
|
|
this.element.addEventListener('keyup', this.handleKeyUp);
|
|
}
|
|
release() {
|
|
this.active = false;
|
|
this.element.removeEventListener('keydown', this.handleKeyDown);
|
|
this.element.removeEventListener('keyup', this.handleKeyUp);
|
|
}
|
|
getState() {
|
|
const state = {
|
|
keysDown: new Map(this.keysDown),
|
|
keysJustPressed: new Map(this.keysJustPressed),
|
|
keysJustReleased: new Map(this.keysJustReleased)
|
|
};
|
|
this.keysJustPressed.clear();
|
|
this.keysJustReleased.clear();
|
|
return state;
|
|
}
|
|
handleKeyDown(event) {
|
|
if (this.active && this.preventDefault)
|
|
event.preventDefault();
|
|
if (this.keysDown.get(event.keyCode))
|
|
return;
|
|
this.keysDown.set(event.keyCode, true);
|
|
this.keysJustPressed.set(event.keyCode, true);
|
|
this.keysJustReleased.set(event.keyCode, false);
|
|
}
|
|
handleKeyUp(event) {
|
|
if (this.active && this.preventDefault)
|
|
event.preventDefault();
|
|
if (!this.keysDown.get(event.keyCode))
|
|
return;
|
|
this.keysDown.set(event.keyCode, false);
|
|
this.keysJustPressed.set(event.keyCode, false);
|
|
this.keysJustReleased.set(event.keyCode, true);
|
|
}
|
|
}
|