2013-08-08 18:16:47 +00:00
|
|
|
/// <reference path="../_definitions.ts" />
|
2013-04-13 03:25:03 +00:00
|
|
|
|
|
|
|
/**
|
2013-04-18 15:49:08 +00:00
|
|
|
* Phaser - Touch
|
|
|
|
*
|
2013-05-16 01:36:58 +00:00
|
|
|
* The Touch class handles touch interactions with the game and the resulting Pointer objects.
|
2013-04-18 15:49:08 +00:00
|
|
|
* http://www.w3.org/TR/touch-events/
|
|
|
|
* https://developer.mozilla.org/en-US/docs/DOM/TouchList
|
|
|
|
* http://www.html5rocks.com/en/mobile/touchandmouse/
|
|
|
|
* Note: Android 2.x only supports 1 touch event at once, no multi-touch
|
2013-04-18 13:16:18 +00:00
|
|
|
*/
|
2013-04-13 03:25:03 +00:00
|
|
|
|
2013-04-18 13:16:18 +00:00
|
|
|
module Phaser {
|
2013-04-13 03:25:03 +00:00
|
|
|
|
2013-04-18 13:16:18 +00:00
|
|
|
export class Touch {
|
2013-04-13 03:25:03 +00:00
|
|
|
|
2013-05-11 16:26:30 +00:00
|
|
|
/**
|
2013-04-18 13:16:18 +00:00
|
|
|
* Constructor
|
|
|
|
* @param {Game} game.
|
|
|
|
* @return {Touch} This object.
|
|
|
|
*/
|
|
|
|
constructor(game: Game) {
|
2013-04-13 03:25:03 +00:00
|
|
|
|
2013-08-05 02:43:20 +00:00
|
|
|
this.game = game;
|
|
|
|
this.callbackContext = this.game;
|
2013-04-13 03:25:03 +00:00
|
|
|
|
2013-04-18 13:16:18 +00:00
|
|
|
}
|
|
|
|
|
2013-05-11 16:26:30 +00:00
|
|
|
/**
|
2013-08-05 02:43:20 +00:00
|
|
|
* Local reference to game.
|
|
|
|
* @property game
|
2013-05-16 20:34:24 +00:00
|
|
|
* @type {Phaser.Game}
|
2013-04-18 13:16:18 +00:00
|
|
|
**/
|
2013-08-08 18:16:47 +00:00
|
|
|
public game: Phaser.Game;
|
2013-04-18 13:16:18 +00:00
|
|
|
|
2013-05-11 16:26:30 +00:00
|
|
|
/**
|
2013-05-16 01:36:58 +00:00
|
|
|
* You can disable all Input by setting disabled = true. While set all new input related events will be ignored.
|
2013-08-13 03:22:24 +00:00
|
|
|
* @type {bool}
|
2013-05-16 01:36:58 +00:00
|
|
|
*/
|
2013-08-13 03:22:24 +00:00
|
|
|
public disabled: bool = false;
|
2013-04-18 13:16:18 +00:00
|
|
|
|
2013-06-05 00:49:08 +00:00
|
|
|
/**
|
|
|
|
* Custom callback useful for hooking into a 3rd party library. Will be passed the touch event as the only parameter.
|
|
|
|
* Callbacks are fired even if this component is disabled and before the event propogation is disabled.
|
|
|
|
*/
|
|
|
|
public callbackContext;
|
|
|
|
public touchStartCallback = null;
|
|
|
|
public touchMoveCallback = null;
|
|
|
|
public touchEndCallback = null;
|
|
|
|
public touchEnterCallback = null;
|
|
|
|
public touchLeaveCallback = null;
|
|
|
|
public touchCancelCallback = null;
|
|
|
|
|
2013-08-05 02:43:20 +00:00
|
|
|
/**
|
|
|
|
* A reference to the event handlers to allow removeEventListener support
|
|
|
|
*/
|
|
|
|
public _onTouchStart;
|
|
|
|
public _onTouchMove;
|
|
|
|
public _onTouchEnd;
|
|
|
|
public _onTouchEnter;
|
|
|
|
public _onTouchLeave;
|
|
|
|
public _onTouchCancel;
|
|
|
|
public _documentTouchMove;
|
|
|
|
|
2013-05-11 16:26:30 +00:00
|
|
|
/**
|
2013-05-16 20:34:24 +00:00
|
|
|
* Starts the event listeners running
|
2013-05-11 16:26:30 +00:00
|
|
|
* @method start
|
2013-04-18 13:16:18 +00:00
|
|
|
*/
|
|
|
|
public start() {
|
|
|
|
|
2013-08-05 02:43:20 +00:00
|
|
|
if (this.game.device.touch)
|
2013-05-16 20:34:24 +00:00
|
|
|
{
|
2013-08-05 02:43:20 +00:00
|
|
|
this._onTouchStart = (event) => this.onTouchStart(event);
|
|
|
|
this._onTouchMove = (event) => this.onTouchMove(event);
|
|
|
|
this._onTouchEnd = (event) => this.onTouchEnd(event);
|
|
|
|
this._onTouchEnter = (event) => this.onTouchEnter(event);
|
|
|
|
this._onTouchLeave = (event) => this.onTouchLeave(event);
|
|
|
|
this._onTouchCancel = (event) => this.onTouchCancel(event);
|
|
|
|
this._documentTouchMove = (event) => this.consumeTouchMove(event);
|
|
|
|
|
|
|
|
this.game.stage.canvas.addEventListener('touchstart', this._onTouchStart, false);
|
|
|
|
this.game.stage.canvas.addEventListener('touchmove', this._onTouchMove, false);
|
|
|
|
this.game.stage.canvas.addEventListener('touchend', this._onTouchEnd, false);
|
|
|
|
this.game.stage.canvas.addEventListener('touchenter', this._onTouchEnter, false);
|
|
|
|
this.game.stage.canvas.addEventListener('touchleave', this._onTouchLeave, false);
|
|
|
|
this.game.stage.canvas.addEventListener('touchcancel', this._onTouchCancel, false);
|
|
|
|
|
|
|
|
document.addEventListener('touchmove', this._documentTouchMove, false);
|
2013-05-16 20:34:24 +00:00
|
|
|
}
|
2013-04-13 03:25:03 +00:00
|
|
|
|
2013-04-18 13:16:18 +00:00
|
|
|
}
|
2013-04-13 03:25:03 +00:00
|
|
|
|
2013-05-11 16:26:30 +00:00
|
|
|
/**
|
2013-04-18 13:16:18 +00:00
|
|
|
* Prevent iOS bounce-back (doesn't work?)
|
|
|
|
* @method consumeTouchMove
|
|
|
|
* @param {Any} event
|
|
|
|
**/
|
|
|
|
private consumeTouchMove(event) {
|
|
|
|
event.preventDefault();
|
|
|
|
}
|
2013-04-13 03:25:03 +00:00
|
|
|
|
2013-05-11 16:26:30 +00:00
|
|
|
/**
|
|
|
|
*
|
2013-04-18 13:16:18 +00:00
|
|
|
* @method onTouchStart
|
|
|
|
* @param {Any} event
|
|
|
|
**/
|
|
|
|
private onTouchStart(event) {
|
2013-04-13 03:25:03 +00:00
|
|
|
|
2013-06-05 00:49:08 +00:00
|
|
|
if (this.touchStartCallback)
|
|
|
|
{
|
|
|
|
this.touchStartCallback.call(this.callbackContext, event);
|
|
|
|
}
|
|
|
|
|
2013-08-05 02:43:20 +00:00
|
|
|
if (this.game.input.disabled || this.disabled)
|
2013-05-16 01:36:58 +00:00
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
2013-04-13 03:25:03 +00:00
|
|
|
|
2013-05-16 01:36:58 +00:00
|
|
|
event.preventDefault();
|
2013-04-18 13:16:18 +00:00
|
|
|
|
|
|
|
// event.targetTouches = list of all touches on the TARGET ELEMENT (i.e. game dom element)
|
|
|
|
// event.touches = list of all touches on the ENTIRE DOCUMENT, not just the target element
|
|
|
|
// event.changedTouches = the touches that CHANGED in this event, not the total number of them
|
|
|
|
for (var i = 0; i < event.changedTouches.length; i++)
|
2013-04-13 03:25:03 +00:00
|
|
|
{
|
2013-08-05 02:43:20 +00:00
|
|
|
this.game.input.startPointer(event.changedTouches[i]);
|
2013-04-13 03:25:03 +00:00
|
|
|
}
|
2013-04-18 13:16:18 +00:00
|
|
|
|
2013-04-13 03:25:03 +00:00
|
|
|
}
|
|
|
|
|
2013-05-11 16:26:30 +00:00
|
|
|
/**
|
2013-05-16 01:36:58 +00:00
|
|
|
* Touch cancel - touches that were disrupted (perhaps by moving into a plugin or browser chrome)
|
|
|
|
* Occurs for example on iOS when you put down 4 fingers and the app selector UI appears
|
2013-04-18 13:16:18 +00:00
|
|
|
* @method onTouchCancel
|
|
|
|
* @param {Any} event
|
|
|
|
**/
|
|
|
|
private onTouchCancel(event) {
|
|
|
|
|
2013-06-05 00:49:08 +00:00
|
|
|
if (this.touchCancelCallback)
|
|
|
|
{
|
|
|
|
this.touchCancelCallback.call(this.callbackContext, event);
|
|
|
|
}
|
|
|
|
|
2013-08-05 02:43:20 +00:00
|
|
|
if (this.game.input.disabled || this.disabled)
|
2013-05-16 01:36:58 +00:00
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2013-04-18 13:16:18 +00:00
|
|
|
event.preventDefault();
|
2013-04-13 03:25:03 +00:00
|
|
|
|
2013-04-18 13:16:18 +00:00
|
|
|
// Touch cancel - touches that were disrupted (perhaps by moving into a plugin or browser chrome)
|
|
|
|
// http://www.w3.org/TR/touch-events/#dfn-touchcancel
|
|
|
|
for (var i = 0; i < event.changedTouches.length; i++)
|
2013-04-13 03:25:03 +00:00
|
|
|
{
|
2013-08-05 02:43:20 +00:00
|
|
|
this.game.input.stopPointer(event.changedTouches[i]);
|
2013-04-13 03:25:03 +00:00
|
|
|
}
|
|
|
|
|
2013-04-18 13:16:18 +00:00
|
|
|
}
|
2013-04-13 03:25:03 +00:00
|
|
|
|
2013-05-11 16:26:30 +00:00
|
|
|
/**
|
2013-05-16 01:36:58 +00:00
|
|
|
* For touch enter and leave its a list of the touch points that have entered or left the target
|
2013-04-18 13:16:18 +00:00
|
|
|
* Doesn't appear to be supported by most browsers yet
|
|
|
|
* @method onTouchEnter
|
|
|
|
* @param {Any} event
|
|
|
|
**/
|
|
|
|
private onTouchEnter(event) {
|
2013-04-13 03:25:03 +00:00
|
|
|
|
2013-06-05 00:49:08 +00:00
|
|
|
if (this.touchEnterCallback)
|
|
|
|
{
|
|
|
|
this.touchEnterCallback.call(this.callbackContext, event);
|
|
|
|
}
|
|
|
|
|
2013-08-05 02:43:20 +00:00
|
|
|
if (this.game.input.disabled || this.disabled)
|
2013-05-16 01:36:58 +00:00
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
2013-04-13 03:25:03 +00:00
|
|
|
|
2013-05-16 01:36:58 +00:00
|
|
|
event.preventDefault();
|
2013-04-13 03:25:03 +00:00
|
|
|
|
2013-04-18 13:16:18 +00:00
|
|
|
for (var i = 0; i < event.changedTouches.length; i++)
|
2013-04-13 03:25:03 +00:00
|
|
|
{
|
2013-06-05 00:49:08 +00:00
|
|
|
//console.log('touch enter');
|
2013-04-13 03:25:03 +00:00
|
|
|
}
|
|
|
|
|
2013-04-18 13:16:18 +00:00
|
|
|
}
|
2013-04-13 03:25:03 +00:00
|
|
|
|
2013-05-11 16:26:30 +00:00
|
|
|
/**
|
2013-05-16 01:36:58 +00:00
|
|
|
* For touch enter and leave its a list of the touch points that have entered or left the target
|
2013-04-18 13:16:18 +00:00
|
|
|
* Doesn't appear to be supported by most browsers yet
|
|
|
|
* @method onTouchLeave
|
|
|
|
* @param {Any} event
|
|
|
|
**/
|
|
|
|
private onTouchLeave(event) {
|
2013-04-13 03:25:03 +00:00
|
|
|
|
2013-06-05 00:49:08 +00:00
|
|
|
if (this.touchLeaveCallback)
|
|
|
|
{
|
|
|
|
this.touchLeaveCallback.call(this.callbackContext, event);
|
|
|
|
}
|
|
|
|
|
2013-04-18 13:16:18 +00:00
|
|
|
event.preventDefault();
|
2013-04-13 03:25:03 +00:00
|
|
|
|
2013-04-18 13:16:18 +00:00
|
|
|
for (var i = 0; i < event.changedTouches.length; i++)
|
2013-04-13 03:25:03 +00:00
|
|
|
{
|
2013-06-05 00:49:08 +00:00
|
|
|
//console.log('touch leave');
|
2013-04-13 03:25:03 +00:00
|
|
|
}
|
2013-04-18 13:16:18 +00:00
|
|
|
|
2013-04-13 03:25:03 +00:00
|
|
|
}
|
|
|
|
|
2013-05-11 16:26:30 +00:00
|
|
|
/**
|
|
|
|
*
|
2013-04-18 13:16:18 +00:00
|
|
|
* @method onTouchMove
|
|
|
|
* @param {Any} event
|
|
|
|
**/
|
|
|
|
private onTouchMove(event) {
|
|
|
|
|
2013-06-05 00:49:08 +00:00
|
|
|
if (this.touchMoveCallback)
|
|
|
|
{
|
|
|
|
this.touchMoveCallback.call(this.callbackContext, event);
|
|
|
|
}
|
|
|
|
|
2013-04-18 13:16:18 +00:00
|
|
|
event.preventDefault();
|
2013-04-13 03:25:03 +00:00
|
|
|
|
2013-04-18 13:16:18 +00:00
|
|
|
for (var i = 0; i < event.changedTouches.length; i++)
|
2013-04-13 03:25:03 +00:00
|
|
|
{
|
2013-08-05 02:43:20 +00:00
|
|
|
this.game.input.updatePointer(event.changedTouches[i]);
|
2013-04-13 03:25:03 +00:00
|
|
|
}
|
|
|
|
|
2013-04-18 13:16:18 +00:00
|
|
|
}
|
2013-04-13 03:25:03 +00:00
|
|
|
|
2013-05-11 16:26:30 +00:00
|
|
|
/**
|
|
|
|
*
|
2013-04-18 13:16:18 +00:00
|
|
|
* @method onTouchEnd
|
|
|
|
* @param {Any} event
|
|
|
|
**/
|
|
|
|
private onTouchEnd(event) {
|
2013-04-13 03:25:03 +00:00
|
|
|
|
2013-06-05 00:49:08 +00:00
|
|
|
if (this.touchEndCallback)
|
|
|
|
{
|
|
|
|
this.touchEndCallback.call(this.callbackContext, event);
|
|
|
|
}
|
|
|
|
|
2013-04-18 13:16:18 +00:00
|
|
|
event.preventDefault();
|
2013-04-13 03:25:03 +00:00
|
|
|
|
2013-04-18 13:16:18 +00:00
|
|
|
// For touch end its a list of the touch points that have been removed from the surface
|
|
|
|
// https://developer.mozilla.org/en-US/docs/DOM/TouchList
|
2013-04-13 03:25:03 +00:00
|
|
|
|
2013-04-18 13:16:18 +00:00
|
|
|
// event.changedTouches = the touches that CHANGED in this event, not the total number of them
|
|
|
|
for (var i = 0; i < event.changedTouches.length; i++)
|
2013-04-13 03:25:03 +00:00
|
|
|
{
|
2013-08-05 02:43:20 +00:00
|
|
|
this.game.input.stopPointer(event.changedTouches[i]);
|
2013-04-13 03:25:03 +00:00
|
|
|
}
|
2013-04-18 13:16:18 +00:00
|
|
|
|
|
|
|
}
|
2013-04-13 03:25:03 +00:00
|
|
|
|
2013-05-11 16:26:30 +00:00
|
|
|
/**
|
2013-05-16 20:34:24 +00:00
|
|
|
* Stop the event listeners
|
2013-05-11 16:26:30 +00:00
|
|
|
* @method stop
|
2013-04-18 13:16:18 +00:00
|
|
|
*/
|
|
|
|
public stop() {
|
2013-04-13 03:25:03 +00:00
|
|
|
|
2013-08-05 02:43:20 +00:00
|
|
|
if (this.game.device.touch)
|
2013-05-16 20:34:24 +00:00
|
|
|
{
|
2013-08-05 02:43:20 +00:00
|
|
|
this.game.stage.canvas.removeEventListener('touchstart', this._onTouchStart);
|
|
|
|
this.game.stage.canvas.removeEventListener('touchmove', this._onTouchMove);
|
|
|
|
this.game.stage.canvas.removeEventListener('touchend', this._onTouchEnd);
|
|
|
|
this.game.stage.canvas.removeEventListener('touchenter', this._onTouchEnter);
|
|
|
|
this.game.stage.canvas.removeEventListener('touchleave', this._onTouchLeave);
|
|
|
|
this.game.stage.canvas.removeEventListener('touchcancel', this._onTouchCancel);
|
|
|
|
|
|
|
|
document.removeEventListener('touchmove', this._documentTouchMove);
|
2013-05-16 20:34:24 +00:00
|
|
|
}
|
2013-04-13 03:25:03 +00:00
|
|
|
|
2013-04-18 13:16:18 +00:00
|
|
|
}
|
2013-04-13 03:25:03 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
|
2013-04-18 13:16:18 +00:00
|
|
|
}
|