diff --git a/src/Input/InputHandler.ts b/src/Input/InputHandler.ts index 902d982..0064b81 100644 --- a/src/Input/InputHandler.ts +++ b/src/Input/InputHandler.ts @@ -10,8 +10,12 @@ export default class InputHandler{ canvas.onmousedown = (event) => this.handleMouseDown(event, canvas); canvas.onmouseup = (event) => this.handleMouseUp(event, canvas); + canvas.oncontextmenu = this.handleContextMenu; + canvas.onmousemove = (event) => this.handleMouseMove(event, canvas); document.onkeydown = this.handleKeyDown; document.onkeyup = this.handleKeyUp; + document.onblur = this.handleBlur; + document.oncontextmenu = this.handleBlur; } private handleMouseDown = (event: MouseEvent, canvas: HTMLCanvasElement): void => { @@ -26,6 +30,12 @@ export default class InputHandler{ this.eventQueue.addEvent(gameEvent); } + private handleMouseMove = (event: MouseEvent, canvas: HTMLCanvasElement): void => { + let pos = this.getMousePosition(event, canvas); + let gameEvent = new GameEvent("mouse_move", {position: pos}); + this.eventQueue.addEvent(gameEvent); + } + private handleKeyDown = (event: KeyboardEvent): void => { let key = this.getKey(event); let gameEvent = new GameEvent("key_down", {key: key}); @@ -38,6 +48,16 @@ export default class InputHandler{ this.eventQueue.addEvent(gameEvent); } + private handleBlur = (event: Event): void => { + let gameEvent = new GameEvent("canvas_blur", {}); + this.eventQueue.addEvent(gameEvent); + } + + private handleContextMenu = (event: Event): void => { + event.preventDefault(); + event.stopPropagation(); + } + private getKey(keyEvent: KeyboardEvent){ return keyEvent.key.toLowerCase(); } diff --git a/src/Input/InputReceiver.ts b/src/Input/InputReceiver.ts index 2a101b3..268fd09 100644 --- a/src/Input/InputReceiver.ts +++ b/src/Input/InputReceiver.ts @@ -10,6 +10,7 @@ export default class InputReceiver{ private mouseJustPressed: boolean; private keyJustPressed: Map; private keyPressed: Map; + private mousePosition: Vec2; private mousePressPosition: Vec2; private eventQueue: EventQueue; private receiver: Receiver; @@ -23,7 +24,7 @@ export default class InputReceiver{ this.mousePressPosition = null; this.eventQueue = EventQueue.getInstance(); - this.eventQueue.subscribe(this.receiver, ["mouse_down", "mouse_up", "key_down", "key_up"]); + this.eventQueue.subscribe(this.receiver, ["mouse_down", "mouse_up", "mouse_move", "key_down", "key_up", "canvas_blur"]); } static getInstance(): InputReceiver{ @@ -38,7 +39,7 @@ export default class InputReceiver{ this.mouseJustPressed = false; this.keyJustPressed.forEach((key: string) => this.keyJustPressed.set(key, false)); - while(this.receiver.hasNextEvent()){ + while(this.receiver.hasNextEvent()){ let event = this.receiver.getNextEvent(); if(event.type === "mouse_down"){ this.mouseJustPressed = true; @@ -50,6 +51,10 @@ export default class InputReceiver{ this.mousePressed = false; } + if(event.type === "mouse_move"){ + this.mousePosition = event.data.get("position"); + } + if(event.type === "key_down"){ let key = event.data.get("key") this.keyJustPressed.set(key, true); @@ -60,9 +65,18 @@ export default class InputReceiver{ let key = event.data.get("key") this.keyPressed.set(key, false); } + + if(event.type === "canvas_blur"){ + this.clearKeyPresses() + } } } + clearKeyPresses(): void { + this.keyJustPressed.forEach((key: string) => this.keyJustPressed.set(key, false)); + this.keyPressed.forEach((key: string) => this.keyPressed.set(key, false)); + } + isJustPressed(key: string): boolean { if(this.keyJustPressed.has(key)){ return this.keyJustPressed.get(key) @@ -87,6 +101,10 @@ export default class InputReceiver{ return this.mousePressed; } + getMousePosition(): Vec2 { + return this.mousePosition; + } + getMousePressPosition(): Vec2 { return this.mousePressPosition; }