phaser/src/input/touch/TouchManager.js

217 lines
5 KiB
JavaScript
Raw Normal View History

2018-02-12 16:01:20 +00:00
/**
* @author Richard Davey <rich@photonstorm.com>
* @copyright 2018 Photon Storm Ltd.
* @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
*/
var Class = require('../../utils/Class');
// https://developer.mozilla.org/en-US/docs/Web/API/Touch_events
// https://patrickhlauke.github.io/touch/tests/results/
// https://www.html5rocks.com/en/mobile/touch/
2018-03-19 21:12:11 +00:00
/**
* @callback TouchHandler
*
* @param {TouchEvent} event - [description]
*/
2018-02-07 15:27:21 +00:00
/**
* @classdesc
* [description]
*
* @class TouchManager
* @memberOf Phaser.Input.Touch
* @constructor
* @since 3.0.0
*
* @param {Phaser.Input.InputManager} inputManager - [description]
*/
var TouchManager = new Class({
initialize:
function TouchManager (inputManager)
{
2018-01-26 12:43:34 +00:00
/**
* [description]
*
2018-02-13 01:13:12 +00:00
* @name Phaser.Input.Touch.TouchManager#manager
* @type {Phaser.Input.InputManager}
2018-01-26 12:43:34 +00:00
* @since 3.0.0
*/
this.manager = inputManager;
2018-01-26 12:43:34 +00:00
/**
* If true the DOM events will have event.preventDefault applied to them, if false they will propagate fully.
*
2018-02-13 01:13:12 +00:00
* @name Phaser.Input.Touch.TouchManager#capture
* @type {boolean}
2018-01-26 12:43:34 +00:00
* @default true
* @since 3.0.0
*/
this.capture = true;
2018-01-26 12:43:34 +00:00
/**
* [description]
*
2018-02-13 01:13:12 +00:00
* @name Phaser.Input.Touch.TouchManager#enabled
* @type {boolean}
2018-01-26 12:43:34 +00:00
* @default false
* @since 3.0.0
*/
this.enabled = false;
2018-01-26 12:43:34 +00:00
/**
* [description]
*
2018-02-13 01:13:12 +00:00
* @name Phaser.Input.Touch.TouchManager#target
* @type {null}
2018-01-26 12:43:34 +00:00
* @since 3.0.0
*/
this.target;
2018-01-26 12:43:34 +00:00
/**
* [description]
*
2018-02-13 01:13:12 +00:00
* @name Phaser.Input.Touch.TouchManager#handler
* @type {?TouchHandler}
2018-01-26 12:43:34 +00:00
* @since 3.0.0
*/
this.handler;
inputManager.events.once('boot', this.boot, this);
},
2018-01-26 12:43:34 +00:00
/**
* [description]
*
* @method Phaser.Input.Touch.TouchManager#boot
* @since 3.0.0
*/
boot: function ()
{
var config = this.manager.config;
this.enabled = config.inputTouch;
this.target = config.inputTouchEventTarget;
this.capture = config.inputTouchCapture;
if (!this.target)
{
this.target = this.manager.game.canvas;
}
if (this.enabled)
{
this.startListeners();
}
},
onTouchStart: function (event)
{
if (event.defaultPrevented)
{
// Do nothing if event already handled
return;
}
this.manager.queue.push(this.manager.startPointer, this.manager, event);
if (this.capture)
{
event.preventDefault();
}
},
onTouchMove: function (event)
{
if (event.defaultPrevented)
{
// Do nothing if event already handled
return;
}
this.manager.queue.push(this.manager.updatePointer, this.manager, event);
if (this.capture)
{
event.preventDefault();
}
},
onTouchEnd: function (event)
{
if (event.defaultPrevented)
{
// Do nothing if event already handled
return;
}
this.manager.queue.push(this.manager.stopPointer, this.manager, event);
if (this.capture)
{
event.preventDefault();
}
},
2018-01-26 12:43:34 +00:00
/**
* [description]
*
* @method Phaser.Input.Touch.TouchManager#startListeners
* @since 3.0.0
*/
startListeners: function ()
{
var target = this.target;
var passive = { passive: true };
var nonPassive = { passive: false };
if (this.capture)
{
target.addEventListener('touchstart', this.onTouchStart.bind(this), nonPassive);
target.addEventListener('touchmove', this.onTouchMove.bind(this), nonPassive);
target.addEventListener('touchend', this.onTouchEnd.bind(this), nonPassive);
}
else
{
target.addEventListener('touchstart', this.onTouchStart.bind(this), passive);
target.addEventListener('touchmove', this.onTouchMove.bind(this), passive);
target.addEventListener('touchend', this.onTouchEnd.bind(this), passive);
}
},
2018-01-26 12:43:34 +00:00
/**
* [description]
*
* @method Phaser.Input.Touch.TouchManager#stopListeners
* @since 3.0.0
*/
stopListeners: function ()
{
var target = this.target;
target.removeEventListener('touchstart', this.onTouchStart);
target.removeEventListener('touchmove', this.onTouchMove);
target.removeEventListener('touchend', this.onTouchEnd);
},
/**
* [description]
*
* @method Phaser.Input.Touch.TouchManager#destroy
* @since 3.0.0
*/
destroy: function ()
{
this.stopListeners();
this.manager = null;
}
});
module.exports = TouchManager;