var Class = require('../../utils/Class'); var Features = require('../../device/Features'); var InputEvents = require('../events'); var NOOP = require('../../utils/Class'); var MouseManager = new Class({ initialize: function MouseManager(inputManager){ this.manager = inputManager; this.capture = true ; this.enabled = false ; this.target; this.locked = false ; this.onMouseMove = NOOP; this.onMouseDown = NOOP; this.onMouseUp = NOOP; this.onMouseDownWindow = NOOP; this.onMouseUpWindow = NOOP; this.onMouseOver = NOOP; this.onMouseOut = NOOP; this.pointerLockChange = NOOP; inputManager.events.once(InputEvents.MANAGER_BOOT, this.boot, this); } , boot: function (){ var config = this.manager.config; this.enabled = config.inputMouse; _AN_Write_target('target', this, false , config.inputMouseEventTarget); this.capture = config.inputMouseCapture; if (!(_AN_Read_target('target', this))) { _AN_Write_target('target', this, false , this.manager.game.canvas); } if (config.disableContextMenu) { this.disableContextMenu(); } if (this.enabled && (_AN_Read_target('target', this))) { this.startListeners(); } } , disableContextMenu: function (){ document.body.addEventListener('contextmenu', function (event){ event.preventDefault(); return false ; } ); return this; } , requestPointerLock: function (){ if (Features.pointerLock) { var element = _AN_Read_target('target', this); element.requestPointerLock = element.requestPointerLock || element.mozRequestPointerLock || element.webkitRequestPointerLock; element.requestPointerLock(); } } , releasePointerLock: function (){ if (Features.pointerLock) { document.exitPointerLock = document.exitPointerLock || document.mozExitPointerLock || document.webkitExitPointerLock; document.exitPointerLock(); } } , startListeners: function (){ var _this = this; var canvas = this.manager.canvas; var autoFocus = (window && window.focus && this.manager.game.config.autoFocus); this.onMouseMove = function (event){ if (event.defaultPrevented || !_this.enabled || !_this.manager) { return ; } _this.manager.queueMouseMove(event); if (_this.capture) { event.preventDefault(); } } ; this.onMouseDown = function (event){ if (autoFocus) { window.focus(); } if (event.defaultPrevented || !_this.enabled || !_this.manager) { return ; } _this.manager.queueMouseDown(event); if (_this.capture && _AN_Read_target('target', event) === canvas) { event.preventDefault(); } } ; this.onMouseDownWindow = function (event){ if (event.defaultPrevented || !_this.enabled || !_this.manager) { return ; } if (_AN_Read_target('target', event) !== canvas) { _this.manager.queueMouseDown(event); } } ; this.onMouseUp = function (event){ if (event.defaultPrevented || !_this.enabled || !_this.manager) { return ; } _this.manager.queueMouseUp(event); if (_this.capture && _AN_Read_target('target', event) === canvas) { event.preventDefault(); } } ; this.onMouseUpWindow = function (event){ if (event.defaultPrevented || !_this.enabled || !_this.manager) { return ; } if (_AN_Read_target('target', event) !== canvas) { _this.manager.queueMouseUp(event); } } ; this.onMouseOver = function (event){ if (event.defaultPrevented || !_this.enabled || !_this.manager) { return ; } _this.manager.setCanvasOver(event); } ; this.onMouseOut = function (event){ if (event.defaultPrevented || !_this.enabled || !_this.manager) { return ; } _this.manager.setCanvasOut(event); } ; var target = _AN_Read_target('target', this); if (!target) { return ; } var passive = { passive: true } ; var nonPassive = { passive: false } ; target.addEventListener('mousemove', this.onMouseMove, (this.capture)? nonPassive: passive); target.addEventListener('mousedown', this.onMouseDown, (this.capture)? nonPassive: passive); target.addEventListener('mouseup', this.onMouseUp, (this.capture)? nonPassive: passive); target.addEventListener('mouseover', this.onMouseOver, (this.capture)? nonPassive: passive); target.addEventListener('mouseout', this.onMouseOut, (this.capture)? nonPassive: passive); if (window && this.manager.game.config.inputWindowEvents) { window.addEventListener('mousedown', this.onMouseDownWindow, nonPassive); window.addEventListener('mouseup', this.onMouseUpWindow, nonPassive); } if (Features.pointerLock) { this.pointerLockChange = function (event){ var element = _AN_Read_target('target', _this); _this.locked = (document.pointerLockElement === element || document.mozPointerLockElement === element || document.webkitPointerLockElement === element)? true : false ; _this.manager.queue.push(event); } ; document.addEventListener('pointerlockchange', this.pointerLockChange, true ); document.addEventListener('mozpointerlockchange', this.pointerLockChange, true ); document.addEventListener('webkitpointerlockchange', this.pointerLockChange, true ); } this.enabled = true ; } , stopListeners: function (){ var target = _AN_Read_target('target', this); target.removeEventListener('mousemove', this.onMouseMove); target.removeEventListener('mousedown', this.onMouseDown); target.removeEventListener('mouseup', this.onMouseUp); target.removeEventListener('mouseover', this.onMouseOver); target.removeEventListener('mouseout', this.onMouseOut); if (window) { window.removeEventListener('mousedown', this.onMouseDownWindow); window.removeEventListener('mouseup', this.onMouseUpWindow); } if (Features.pointerLock) { document.removeEventListener('pointerlockchange', this.pointerLockChange, true ); document.removeEventListener('mozpointerlockchange', this.pointerLockChange, true ); document.removeEventListener('webkitpointerlockchange', this.pointerLockChange, true ); } } , destroy: function (){ this.stopListeners(); _AN_Write_target('target', this, false , null ); this.enabled = false ; this.manager = null ; } } ); module.exports = MouseManager;