API Docs for: 0.1.0
Show:

File: src/zerk/class/game/engine/control/mouse.js

/**
 * Mouse interface
 * 
 * @class zerk.game.engine.control.mouse
 * @extends zerk.observable
 * @module zerk
 */
/*
 * TODO Use DOM interface instead of native code
 */
zerk.define({
	
	name: 'zerk.game.engine.control.mouse',
	extend: 'zerk.observable'
	
},{
	
	/**
	 * Horizontal cursor position
	 * 
	 * @property mouseX
	 * @type Integer
	 */
	mouseX: null,
	
	/**
	 * Vertical cursor position
	 * 
	 * @property mouseX
	 * @type Integer
	 */
	mouseY: null,
	
	/**
	 * State of the left mouse button
	 * 
	 * @property mouseLeftDown
	 * @type Boolean
	 */
	mouseLeftDown: false,
	
	/**
	 * State of the right mouse button
	 * 
	 * @property mouseRightDown
	 * @type Boolean
	 */
	mouseRightDown: false,
	
	/**
	 * Coordinates of the last mouse position
	 * 
	 * @property _lastMousePosition
	 * @type {Object}
	 * @protected
	 */
	_lastMousePosition: null,
	
	/**
	 * State of the mouse joint
	 * 
	 * @property _mouseJointActive
	 * @type Boolean
	 * @protected
	 */
	_mouseJointActive: false,
	
	/**
	 * Game engine
	 * 
	 * @property _engine
	 * @type zerk.game.engine
	 * @protected
	 */
	_engine: null,
	
	/**
	 * Back reference to control class
	 * 
	 * @property _control
	 * @type zerk.game.engine.control
	 * @protected
	 */
	_control: null,
	
	/**
	 * Class constructor
	 * 
	 * @method init
	 * @param {zerk.game.engine} engine
	 */
	init: function(engine,control) {
		
		zerk.parent('zerk.game.engine.control.mouse').init.apply(
			this,
			arguments
		);
		
		this._engine=engine;
		
		this._control=control;
		
		var me=this;
		
		var canvas=this._engine.dom.getCanvasGame();
		
		canvas.addEventListener(
			'mousedown',
			function(event) {
				
				return me._onMouseDown(event);
				
			}
		);
		
		canvas.addEventListener(
			'mouseup',
			function(event) {
				
				return me._onMouseUp(event);
				
			}
		);
		
		canvas.addEventListener(
			'mousemove',
			function(event) {
				
				return me._onMouseMove(event);
				
			}
		);
		
		canvas.addEventListener(
			'contextmenu',
			function(event) {
				
				return me._onContextMenu(event);
				
			},
			false
		);
		
		var doc=this._engine.dom.getDocument();
		
		this._engine.dom.registerEvent(
			doc,
			'mousewheel',
			function(event) {
				
				me._onMouseScroll(event);
				
			}
		);
		
		this._log('Mouse loaded');
		
	},
	
	/**
	 * Returns the position of the cursor by given mouse event
	 * 
	 * @method _getCursorPosition
	 * @param {event} event Native mouse event
	 * @return {Object} Coordinate object
	 * @protected
	 */
	_getCursorPosition: function(event) {
		
		var position=zerk.game.engine.dom.getCanvasGamePosition();
		
		return {
			x: event.clientX-position.left,
			y: event.clientY-position.top
		};
		
	},
	
	/**
	 * Context menu event handler
	 * 
	 * @method _onContextMenu
	 * @param {event} event Native event
	 * @return {Boolean} Returns false
	 * @protected
	 */
	_onContextMenu: function(event) {
		
		event.preventDefault();
		
		return false;
		
	},
	
	/**
	 * Mouse down event handler
	 * 
	 * @method _onMouseDown
	 * @param {event} event Native event
	 * @return {Boolean}
	 * @protected
	 */
	_onMouseDown: function(event) {
		
		if (event.button==0) {  
			
			this.mouseLeftDown=true;
			
			/*
			 * Trigger the mouse move event to interact 
			 * directly on click position
			 */
			this._onMouseMove(event);	
			
		} else if (event.button==2) {
			
			this.mouseRightDown=true;
			
		}
		
		/**
		 * Fires when a mouse button is pressed
		 * 
		 * @param {DOMEvent} event
		 * @event mousedown 
		 */
		this.fireEvent('mousedown',event);
		
		return false;
		
	},
	
	/**
	 * Mouse up event handler
	 * 
	 * @method _onMouseUp
	 * @param {event} event Native event
	 * @return {Boolean} Returns false
	 * @protected
	 */
	_onMouseUp: function(event) {
		
		if (event.button==0) {  
			
			this.mouseLeftDown=false;
			
		} else if (event.button==2) {
			
			this.mouseRightDown=false;	
			
		}
		
		/**
		 * Fires when a mouse button is released
		 * 
		 * @param {DOMEvent} event
		 * @event mouseup
		 */
		this.fireEvent('mouseup',event);
		
		return false;
		
	},
	
	/**
	 * Mouse move event handler
	 * 
	 * @method _onMouseMove
	 * @param {event} event Native event
	 * @protected
	 */
	_onMouseMove: function(event) {
		
		var position=this._getCursorPosition(event);
		
		if (this.mouseRightDown) {
			
			zerk.game.engine.viewport.setX(
				zerk.game.engine.viewport.getX()
				-position.x-this._lastMousePosition.x
			);
				
			zerk.game.engine.viewport.setY(
				zerk.game.engine.viewport.getY()
				-position.y-this._lastMousePosition.y
			);
			
		}
		
		this.mouseX=this._engine.helper.toMeter(zerk.game.engine.viewport.getX()
			+this._engine.viewport.fromScaleX(
				position.x-(this._engine.viewport.getWidth()/2))
			);
			
		this.mouseY=this._engine.helper.toMeter(zerk.game.engine.viewport.getY()
			+this._engine.viewport.fromScaleY(
				position.y-(this._engine.viewport.getHeight()/2))
			);
		
		this._lastMousePosition=this._getCursorPosition(event);
		
	},
	
	/**
	 * Mouse scroll event handler
	 * 
	 * @method _onMouseScroll
	 * @param {event} event Native event
	 * @protected
	 */
	_onMouseScroll: function(event) {
		
		event=((event) ? event : window.event);
		var delta=((event.detail) ? event.detail : event.wheelDelta*-1);
		
		if (this._engine.registry.getValue('control.mouse.enableWheelZoom')) {
			
			if (delta<0) {
				
				zerk.game.engine.viewport.zoomIn();
				
			} else {
				
				zerk.game.engine.viewport.zoomOut();
				
			}
			
		}
		
	},
	
	/**
	 * Local log method
	 * 
	 * @method _log
	 * @param {String} msg Log message
	 * @protected
	 */
	_log: function(msg) {
		
		// Redirect to global log
		this._engine.debug.log(
			msg,
			this._engine.debug.GROUP_CONTROL
		);
		
	}
	
});