Multi point input handler working

This commit is contained in:
Richard Davey 2013-06-02 14:19:12 +01:00
parent 49fe5ee65f
commit f9f17ad353
11 changed files with 1250 additions and 658 deletions

View file

@ -21,12 +21,8 @@ module Phaser.Components {
this.game = parent.game; this.game = parent.game;
this._sprite = parent; this._sprite = parent;
this.enabled = false; this.enabled = false;
this.checkBody = false;
this.useHandCursor = false;
} }
/** /**
@ -39,17 +35,7 @@ module Phaser.Components {
*/ */
private _sprite: Sprite; private _sprite: Sprite;
private dragOffsetX: number; private _pointerData;
private dragOffsetY: number;
private dragFromPoint: bool;
private dragPixelPerfect:bool = false;
private dragPixelPerfectAlpha:number;
private allowHorizontalDrag: bool = true;
private allowVerticalDrag: bool = true;
private snapOnDrag: bool = false;
private snapOnRelease: bool = false;
private snapX: number;
private snapY: number;
/** /**
* If enabled the Input component will be updated by the parent Sprite * If enabled the Input component will be updated by the parent Sprite
@ -58,10 +44,69 @@ module Phaser.Components {
public enabled: bool; public enabled: bool;
/** /**
* Is this sprite being dragged by the mouse or not? * The PriorityID controls which Sprite receives an Input event first if they should overlap.
* @default false */
*/ public priorityID:number = 0;
public isDragged: bool = false;
public start(priority:number = 0, checkBody?:bool = false, useHandCursor?:bool = false) {
// Turning on
if (this.enabled)
{
return;
}
else
{
// Register, etc
this.checkBody = checkBody;
this.useHandCursor = useHandCursor;
this._pointerData = [];
for (var i = 0; i < 10; i++)
{
this._pointerData.push({ id: i, x: 0, y: 0, isDown: false, isUp: false, isOver: false, isOut: false, timeOver: 0, timeOut: 0, timeDown: 0, timeUp: 0, downDuration: 0, isDragged: false });
}
this.snapOffset = new Point;
this.enabled = true;
this.game.input.addGameObject(this._sprite);
}
}
public stop() {
// Turning off
if (this.enabled == false)
{
return;
}
else
{
// De-register, etc
this.enabled = false;
this.game.input.removeGameObject(this._sprite);
}
}
private _dragPoint: Point;
public dragOffset: Point;
public dragFromCenter: bool;
public dragPixelPerfect:bool = false;
public dragPixelPerfectAlpha:number;
public allowHorizontalDrag: bool = true;
public allowVerticalDrag: bool = true;
public snapOnDrag: bool = false;
public snapOnRelease: bool = false;
public snapOffset: Point;
public snapX: number = 0;
public snapY: number = 0;
/** /**
* Is this sprite allowed to be dragged by the mouse? true = yes, false = no * Is this sprite allowed to be dragged by the mouse? true = yes, false = no
@ -70,13 +115,13 @@ module Phaser.Components {
public draggable: bool = false; public draggable: bool = false;
/** /**
* An FlxRect region of the game world within which the sprite is restricted during mouse drag * A region of the game world within which the sprite is restricted during drag
* @default null * @default null
*/ */
public boundsRect: Rectangle = null; public boundsRect: Rectangle = null;
/** /**
* An FlxSprite the bounds of which this sprite is restricted during mouse drag * An Sprite the bounds of which this sprite is restricted during drag
* @default null * @default null
*/ */
public boundsSprite: Sprite = null; public boundsSprite: Sprite = null;
@ -97,145 +142,203 @@ module Phaser.Components {
/** /**
* The x coordinate of the Input pointer, relative to the top-left of the parent Sprite. * The x coordinate of the Input pointer, relative to the top-left of the parent Sprite.
* This value is only set with the pointer is over this Sprite. * This value is only set when the pointer is over this Sprite.
* @type {number} * @type {number}
*/ */
public x: number = 0; public pointerX(pointer: number = 0): number {
return this._pointerData[pointer].x;
}
/** /**
* The y coordinate of the Input pointer, relative to the top-left of the parent Sprite * The y coordinate of the Input pointer, relative to the top-left of the parent Sprite
* This value is only set with the pointer is over this Sprite. * This value is only set when the pointer is over this Sprite.
* @type {number} * @type {number}
*/ */
public y: number = 0; public pointerY(pointer: number = 0): number {
return this._pointerData[pointer].y;
}
/** /**
* If the Pointer is touching the touchscreen, or the mouse button is held down, isDown is set to true * If the Pointer is touching the touchscreen, or the mouse button is held down, isDown is set to true
* @property isDown * @property isDown
* @type {Boolean} * @type {Boolean}
**/ **/
public isDown: bool = false; public pointerDown(pointer: number = 0): bool {
return this._pointerData[pointer].isDown;
}
/** /**
* If the Pointer is not touching the touchscreen, or the mouse button is up, isUp is set to true * If the Pointer is not touching the touchscreen, or the mouse button is up, isUp is set to true
* @property isUp * @property isUp
* @type {Boolean} * @type {Boolean}
**/ **/
public isUp: bool = true; public pointerUp(pointer: number = 0): bool {
return this._pointerData[pointer].isUp;
}
/** /**
* A timestamp representing when the Pointer first touched the touchscreen. * A timestamp representing when the Pointer first touched the touchscreen.
* @property timeDown * @property timeDown
* @type {Number} * @type {Number}
**/ **/
public timeOver: number = 0; public pointerTimeDown(pointer: number = 0): bool {
return this._pointerData[pointer].timeDown;
}
/** /**
* A timestamp representing when the Pointer left the touchscreen. * A timestamp representing when the Pointer left the touchscreen.
* @property timeUp * @property timeUp
* @type {Number} * @type {Number}
**/ **/
public timeOut: number = 0; public pointerTimeUp(pointer: number = 0): bool {
return this._pointerData[pointer].timeUp;
}
/** /**
* Is the Pointer over this Sprite * Is the Pointer over this Sprite
* @property isOver * @property isOver
* @type {Boolean} * @type {Boolean}
**/ **/
public isOver: bool = false; public pointerOver(pointer: number = 0): bool {
return this._pointerData[pointer].isOver;
}
/** /**
* Is the Pointer outside of this Sprite * Is the Pointer outside of this Sprite
* @property isOut * @property isOut
* @type {Boolean} * @type {Boolean}
**/ **/
public isOut: bool = true; public pointerOut(pointer: number = 0): bool {
return this._pointerData[pointer].isOut;
}
public oldX: number; /**
public oldY: number; * A timestamp representing when the Pointer first touched the touchscreen.
* @property timeDown
* @type {Number}
**/
public pointerTimeOver(pointer: number = 0): bool {
return this._pointerData[pointer].timeOver;
}
/**
* A timestamp representing when the Pointer left the touchscreen.
* @property timeUp
* @type {Number}
**/
public pointerTimeOut(pointer: number = 0): bool {
return this._pointerData[pointer].timeOut;
}
/**
* Is this sprite being dragged by the mouse or not?
* @default false
*/
public pointerDragged(pointer: number = 0): bool {
return this._pointerData[pointer].isDragged;
}
/** /**
* Update * Update
*/ */
public update() { public update(pointer: Phaser.Pointer) {
if (this.enabled == false) if (this.enabled == false)
{ {
return; return;
} }
if (this.draggable && this.isDragged) // If was previously touched by this Pointer, check if still is
{ if (this._pointerData[pointer.id].isDown && pointer.isUp)
this.updateDrag();
}
if (this.game.input.x != this.oldX || this.game.input.y != this.oldY)
{ {
this.oldX = this.game.input.x; this._releasedHandler(pointer);
this.oldY = this.game.input.y;
if (RectangleUtils.contains(this._sprite.frameBounds, this.game.input.x, this.game.input.y))
{
this.x = this.game.input.x - this._sprite.x;
this.y = this.game.input.y - this._sprite.y;
if (this.isOver == false)
{
this.isOver = true;
this.isOut = false;
this.timeOver = this.game.time.now;
if (this.useHandCursor)
{
this._sprite.game.stage.canvas.style.cursor = "pointer";
}
this._sprite.events.onInputOver.dispatch(this._sprite, this.x, this.y, this.timeOver);
}
}
else
{
if (this.isOver)
{
this.isOver = false;
this.isOut = true;
this.timeOut = this.game.time.now;
if (this.useHandCursor)
{
this._sprite.game.stage.canvas.style.cursor = "default";
}
this._sprite.events.onInputOut.dispatch(this._sprite, this.timeOut);
}
}
} }
// click handler to add to stack for sorting if (this.draggable && this._pointerData[pointer.id].isDragged)
{
this.updateDrag(pointer);
//return;
}
if (RectangleUtils.contains(this._sprite.frameBounds, pointer.x, pointer.y))
{
// { id: i, x: 0, y: 0, isDown: false, isUp: false, isOver: false, isOut: false, timeOver: 0, timeOut: 0, isDragged: false }
this._pointerData[pointer.id].x = pointer.x - this._sprite.x;
this._pointerData[pointer.id].y = pointer.y - this._sprite.y;
if (this._pointerData[pointer.id].isOver == false)
{
this._pointerData[pointer.id].isOver = true;
this._pointerData[pointer.id].isOut = false;
this._pointerData[pointer.id].timeOver = this.game.time.now;
if (this.useHandCursor && this._pointerData[pointer.id].isDragged == false)
{
this.game.stage.canvas.style.cursor = "pointer";
}
this._sprite.events.onInputOver.dispatch(this._sprite, pointer);
}
}
else
{
if (this._pointerData[pointer.id].isOver)
{
this._pointerData[pointer.id].isOver = false;
this._pointerData[pointer.id].isOut = true;
this._pointerData[pointer.id].timeOut = this.game.time.now;
if (this.useHandCursor && this._pointerData[pointer.id].isDragged == false)
{
this.game.stage.canvas.style.cursor = "default";
}
this._sprite.events.onInputOut.dispatch(this._sprite, pointer);
}
}
}
public _touchedHandler(pointer: Pointer) {
this._pointerData[pointer.id].isDown = true;
this._pointerData[pointer.id].isUp = false;
this._pointerData[pointer.id].timeDown = this.game.time.now;
this._sprite.events.onInputDown.dispatch(this._sprite, pointer);
}
public _releasedHandler(pointer: Pointer) {
this._pointerData[pointer.id].isDown = false;
this._pointerData[pointer.id].isUp = true;
this._pointerData[pointer.id].timeUp = this.game.time.now;
//this._pointerData[pointer.id].downDuration = this._pointerData[pointer.id].timeUp - this._pointerData[pointer.id].timeDown;
this._sprite.events.onInputDown.dispatch(this._sprite, pointer);
} }
/** /**
* Updates the Mouse Drag on this Sprite. * Updates the Pointer drag on this Sprite.
*/ */
private updateDrag():void private updateDrag(pointer: Pointer):void
{ {
if (this.isUp) if (pointer.isUp)
{ {
this.stopDrag(); this.stopDrag(pointer);
return; return;
} }
// something wrong here, should use _dragPoint as well I think somehow
if (this.allowHorizontalDrag) if (this.allowHorizontalDrag)
{ {
this._sprite.x = this.game.input.x - this.dragOffsetX; this._sprite.x = pointer.x - this.dragOffset.x;
} }
if (this.allowVerticalDrag) if (this.allowVerticalDrag)
{ {
this._sprite.y = this.game.input.y - this.dragOffsetY; this._sprite.y = pointer.y - this.dragOffset.y;
} }
if (this.boundsRect) if (this.boundsRect)
@ -260,8 +363,8 @@ module Phaser.Components {
* @param delay The time below which the pointer is considered as just over. * @param delay The time below which the pointer is considered as just over.
* @returns {boolean} * @returns {boolean}
*/ */
public justOver(delay?: number = 500): bool { public justOver(pointer: number = 0, delay?: number = 500): bool {
return (this.isOver && this.duration < delay); return (this._pointerData[pointer].isOver && this.overDuration(pointer) < delay);
} }
/** /**
@ -269,19 +372,52 @@ module Phaser.Components {
* @param delay The time below which the pointer is considered as just out. * @param delay The time below which the pointer is considered as just out.
* @returns {boolean} * @returns {boolean}
*/ */
public justOut(delay?: number = 500): bool { public justOut(pointer: number = 0, delay?: number = 500): bool {
return (this.isOut && (this.game.time.now - this.timeOut < delay)); return (this._pointerData[pointer].isOut && (this.game.time.now - this._pointerData[pointer].timeOut < delay));
}
/**
* Returns true if the pointer has entered the Sprite within the specified delay time (defaults to 500ms, half a second)
* @param delay The time below which the pointer is considered as just over.
* @returns {boolean}
*/
public justPressed(pointer: number = 0, delay?: number = 500): bool {
return (this._pointerData[pointer].isDown && this.downDuration(pointer) < delay);
}
/**
* Returns true if the pointer has left the Sprite within the specified delay time (defaults to 500ms, half a second)
* @param delay The time below which the pointer is considered as just out.
* @returns {boolean}
*/
public justReleased(pointer: number = 0, delay?: number = 500): bool {
return (this._pointerData[pointer].isUp && (this.game.time.now - this._pointerData[pointer].timeUp < delay));
} }
/** /**
* If the pointer is currently over this Sprite this returns how long it has been there for in milliseconds. * If the pointer is currently over this Sprite this returns how long it has been there for in milliseconds.
* @returns {number} The number of milliseconds the pointer has been over the Sprite, or -1 if not over. * @returns {number} The number of milliseconds the pointer has been over the Sprite, or -1 if not over.
*/ */
public get duration(): number { public overDuration(pointer: number = 0): number {
if (this.isOver) if (this._pointerData[pointer].isOver)
{ {
return this.game.time.now - this.timeOver; return this.game.time.now - this._pointerData[pointer].timeOver;
}
return -1;
}
/**
* If the pointer is currently over this Sprite this returns how long it has been there for in milliseconds.
* @returns {number} The number of milliseconds the pointer has been pressed down on the Sprite, or -1 if not over.
*/
public downDuration(pointer: number = 0): number {
if (this._pointerData[pointer].isDown)
{
return this.game.time.now - this._pointerData[pointer].timeDown;
} }
return -1; return -1;
@ -291,7 +427,7 @@ module Phaser.Components {
/** /**
* Make this Sprite draggable by the mouse. You can also optionally set mouseStartDragCallback and mouseStopDragCallback * Make this Sprite draggable by the mouse. You can also optionally set mouseStartDragCallback and mouseStopDragCallback
* *
* @param lockCenter If false the Sprite will drag from where you click it. If true it will center itself to the tip of the mouse pointer. * @param lockCenter If false the Sprite will drag from where you click it minus the dragOffset. If true it will center itself to the tip of the mouse pointer.
* @param pixelPerfect If true it will use a pixel perfect test to see if you clicked the Sprite. False uses the bounding box. * @param pixelPerfect If true it will use a pixel perfect test to see if you clicked the Sprite. False uses the bounding box.
* @param alphaThreshold If using pixel perfect collision this specifies the alpha level from 0 to 255 above which a collision is processed (default 255) * @param alphaThreshold If using pixel perfect collision this specifies the alpha level from 0 to 255 above which a collision is processed (default 255)
* @param boundsRect If you want to restrict the drag of this sprite to a specific FlxRect, pass the FlxRect here, otherwise it's free to drag anywhere * @param boundsRect If you want to restrict the drag of this sprite to a specific FlxRect, pass the FlxRect here, otherwise it's free to drag anywhere
@ -299,9 +435,12 @@ module Phaser.Components {
*/ */
public enableDrag(lockCenter:bool = false, pixelPerfect:bool = false, alphaThreshold:number = 255, boundsRect:Rectangle = null, boundsSprite:Sprite = null):void public enableDrag(lockCenter:bool = false, pixelPerfect:bool = false, alphaThreshold:number = 255, boundsRect:Rectangle = null, boundsSprite:Sprite = null):void
{ {
this._dragPoint = new Point;
this.draggable = true; this.draggable = true;
this.dragFromPoint = lockCenter; this.dragOffset = new Point;
this.dragFromCenter = lockCenter;
this.dragPixelPerfect = pixelPerfect; this.dragPixelPerfect = pixelPerfect;
this.dragPixelPerfectAlpha = alphaThreshold; this.dragPixelPerfectAlpha = alphaThreshold;
@ -321,19 +460,51 @@ module Phaser.Components {
*/ */
public disableDrag():void public disableDrag():void
{ {
if (this.isDragged) if (this._pointerData)
{ {
//FlxMouseControl.dragTarget = null; for (var i = 0; i < 10; i++)
//FlxMouseControl.isDragging = false; {
} this._pointerData[i].isDragged = false;
}
this.isDragged = false; }
this.draggable = false; this.draggable = false;
//mouseStartDragCallback = null; //mouseStartDragCallback = null;
//mouseStopDragCallback = null; //mouseStopDragCallback = null;
} }
/**
* Called by Pointer when drag starts on this Sprite. Should not usually be called directly.
*/
public startDrag(pointer: Pointer):void
{
this._pointerData[pointer.id].isDragged = true;
if (this.dragFromCenter)
{
// Move the sprite to the middle of the pointer
this.dragOffset.setTo(this._sprite.frameBounds.halfWidth, this._sprite.frameBounds.halfHeight);
}
this._dragPoint.setTo(pointer.x - this._sprite.x - this.dragOffset.x, pointer.y - this._sprite.y - this.dragOffset.y);
}
/**
* Called by Pointer when drag is stopped on this Sprite. Should not usually be called directly.
*/
public stopDrag(pointer: Pointer):void
{
this._pointerData[pointer.id].isDragged = false;
if (this.snapOnRelease)
{
this._sprite.x = Math.floor(this._sprite.x / this.snapX) * this.snapX;
this._sprite.y = Math.floor(this._sprite.y / this.snapY) * this.snapY;
}
}
/** /**
* Restricts this sprite to drag movement only on the given axis. Note: If both are set to false the sprite will never move! * Restricts this sprite to drag movement only on the given axis. Note: If both are set to false the sprite will never move!
* *
@ -371,26 +542,6 @@ module Phaser.Components {
this.snapOnDrag = false; this.snapOnDrag = false;
this.snapOnRelease = false; this.snapOnRelease = false;
} }
/**
* Called by FlxMouseControl when Mouse Drag starts on this Sprite. Should not usually be called directly.
*/
public startDrag():void
{
this.isDragged = true;
if (this.dragFromPoint == false)
{
this.dragOffsetX = this.game.input.x - this._sprite.x;
this.dragOffsetY = this.game.input.y - this._sprite.y;
}
else
{
// Move the sprite to the middle of the mouse
this.dragOffsetX = this._sprite.frameBounds.halfWidth;
this.dragOffsetY = this._sprite.frameBounds.halfHeight;
}
}
/** /**
* Bounds Rect check for the sprite drag * Bounds Rect check for the sprite drag
@ -439,20 +590,6 @@ module Phaser.Components {
this._sprite.y = (this.boundsSprite.y + this.boundsSprite.height) - this._sprite.height; this._sprite.y = (this.boundsSprite.y + this.boundsSprite.height) - this._sprite.height;
} }
} }
/**
* Called by FlxMouseControl when Mouse Drag is stopped on this Sprite. Should not usually be called directly.
*/
public stopDrag():void
{
this.isDragged = false;
if (this.snapOnRelease)
{
this._sprite.x = Math.floor(this._sprite.x / this.snapX) * this.snapX;
this._sprite.y = Math.floor(this._sprite.y / this.snapY) * this.snapY;
}
}
/** /**
* Render debug infos. (including name, bounds info, position and some other properties) * Render debug infos. (including name, bounds info, position and some other properties)
@ -465,9 +602,10 @@ module Phaser.Components {
this._sprite.texture.context.font = '14px Courier'; this._sprite.texture.context.font = '14px Courier';
this._sprite.texture.context.fillStyle = color; this._sprite.texture.context.fillStyle = color;
this._sprite.texture.context.fillText('Sprite Input: (' + this._sprite.frameBounds.width + ' x ' + this._sprite.frameBounds.height + ')', x, y); this._sprite.texture.context.fillText('Sprite Input: (' + this._sprite.frameBounds.width + ' x ' + this._sprite.frameBounds.height + ')', x, y);
this._sprite.texture.context.fillText('x: ' + this.x.toFixed(1) + ' y: ' + this.y.toFixed(1), x, y + 14); this._sprite.texture.context.fillText('x: ' + this.pointerX().toFixed(1) + ' y: ' + this.pointerY().toFixed(1), x, y + 14);
this._sprite.texture.context.fillText('over: ' + this.isOver + ' duration: ' + this.duration.toFixed(0), x, y + 28); this._sprite.texture.context.fillText('over: ' + this.pointerOver() + ' duration: ' + this.overDuration().toFixed(0), x, y + 28);
this._sprite.texture.context.fillText('just over: ' + this.justOver() + ' just out: ' + this.justOut(), x, y + 42); this._sprite.texture.context.fillText('down: ' + this.pointerDown() + ' duration: ' + this.downDuration().toFixed(0), x, y + 42);
this._sprite.texture.context.fillText('just over: ' + this.justOver() + ' just out: ' + this.justOut(), x, y + 56);
} }

View file

@ -303,8 +303,6 @@ module Phaser {
} }
*/ */
this.input.update();
if (this.modified == true && this.scale.equals(1) && this.skew.equals(0) && this.angle == 0 && this.angleOffset == 0 && this.texture.flippedX == false && this.texture.flippedY == false) if (this.modified == true && this.scale.equals(1) && this.skew.equals(0) && this.angle == 0 && this.angleOffset == 0 && this.texture.flippedX == false && this.texture.flippedY == false)
{ {
this.modified = false; this.modified = false;

View file

@ -446,14 +446,36 @@ module Phaser {
this.mspointer.start(); this.mspointer.start();
this.gestures.start(); this.gestures.start();
this.mousePointer.active = true;
} }
public inputObjects = [];
public totalTrackedObjects: number = 0;
// Add Input Enabled array + add/remove methods and then iterate and update them during the main update
// Clear down this array on State swap??? Maybe removed from it when Sprite is destroyed
public addGameObject(object) {
// Lots more checks here
this.inputObjects.push(object);
this.totalTrackedObjects++;
}
public removeGameObject(object) {
// TODO
}
/** /**
* Updates the Input Manager. Called by the core Game loop. * Updates the Input Manager. Called by the core Game loop.
* @method update * @method update
**/ **/
public update() { public update() {
// Swap for velocity vector - and add it to Pointer?
this.speed.x = this.position.x - this._oldPosition.x; this.speed.x = this.position.x - this._oldPosition.x;
this.speed.y = this.position.y - this._oldPosition.y; this.speed.y = this.position.y - this._oldPosition.y;

View file

@ -24,7 +24,6 @@ module Phaser {
**/ **/
private _game: Game; private _game: Game;
public static LEFT_BUTTON: number = 0; public static LEFT_BUTTON: number = 0;
public static MIDDLE_BUTTON: number = 1; public static MIDDLE_BUTTON: number = 1;
public static RIGHT_BUTTON: number = 2; public static RIGHT_BUTTON: number = 2;

View file

@ -18,7 +18,7 @@ module Phaser {
*/ */
constructor(game: Game, id: number) { constructor(game: Game, id: number) {
this._game = game; this.game = game;
this.id = id; this.id = id;
this.active = false; this.active = false;
@ -35,11 +35,11 @@ module Phaser {
/** /**
* Local private reference to game. * Local private reference to game.
* @property _game * @property game
* @type {Phaser.Game} * @type {Phaser.Game}
* @private * @private
**/ **/
private _game: Game; public game: Game;
/** /**
* Local private variable to store the status of dispatching a hold event * Local private variable to store the status of dispatching a hold event
@ -248,15 +248,24 @@ module Phaser {
return -1; return -1;
} }
return this._game.time.now - this.timeDown; return this.game.time.now - this.timeDown;
} }
// Sprite Drag Related
/**
* The Game Object this Pointer is currently dragging.
* @property draggedObject
* @type {Any}
**/
public draggedObject;
/** /**
* Gets the X value of this Pointer in world coordinate space * Gets the X value of this Pointer in world coordinate space
* @param {Camera} [camera] * @param {Camera} [camera]
*/ */
public getWorldX(camera?: Camera = this._game.camera) { public getWorldX(camera?: Camera = this.game.camera) {
return camera.worldView.x + this.x; return camera.worldView.x + this.x;
@ -266,7 +275,7 @@ module Phaser {
* Gets the Y value of this Pointer in world coordinate space * Gets the Y value of this Pointer in world coordinate space
* @param {Camera} [camera] * @param {Camera} [camera]
*/ */
public getWorldY(camera?: Camera = this._game.camera) { public getWorldY(camera?: Camera = this.game.camera) {
return camera.worldView.y + this.y; return camera.worldView.y + this.y;
@ -288,9 +297,9 @@ module Phaser {
} }
// Fix to stop rogue browser plugins from blocking the visibility state event // Fix to stop rogue browser plugins from blocking the visibility state event
if (this._game.paused == true) if (this.game.paused == true)
{ {
this._game.stage.resumeGame(); this.game.stage.resumeGame();
return this; return this;
} }
@ -304,21 +313,21 @@ module Phaser {
this.withinGame = true; this.withinGame = true;
this.isDown = true; this.isDown = true;
this.isUp = false; this.isUp = false;
this.timeDown = this._game.time.now; this.timeDown = this.game.time.now;
this._holdSent = false; this._holdSent = false;
if (this._game.input.multiInputOverride == Input.MOUSE_OVERRIDES_TOUCH || this._game.input.multiInputOverride == Input.MOUSE_TOUCH_COMBINE || (this._game.input.multiInputOverride == Input.TOUCH_OVERRIDES_MOUSE && this._game.input.currentPointers == 0)) if (this.game.input.multiInputOverride == Input.MOUSE_OVERRIDES_TOUCH || this.game.input.multiInputOverride == Input.MOUSE_TOUCH_COMBINE || (this.game.input.multiInputOverride == Input.TOUCH_OVERRIDES_MOUSE && this.game.input.currentPointers == 0))
{ {
this._game.input.x = this.x * this._game.input.scaleX; this.game.input.x = this.x * this.game.input.scaleX;
this._game.input.y = this.y * this._game.input.scaleY; this.game.input.y = this.y * this.game.input.scaleY;
this._game.input.onDown.dispatch(this); this.game.input.onDown.dispatch(this);
} }
this.totalTouches++; this.totalTouches++;
if (this.isMouse == false) if (this.isMouse == false)
{ {
this._game.input.currentPointers++; this.game.input.currentPointers++;
} }
return this; return this;
@ -329,28 +338,58 @@ module Phaser {
if (this.active) if (this.active)
{ {
if (this._holdSent == false && this.duration >= this._game.input.holdRate) if (this._holdSent == false && this.duration >= this.game.input.holdRate)
{ {
if (this._game.input.multiInputOverride == Input.MOUSE_OVERRIDES_TOUCH || this._game.input.multiInputOverride == Input.MOUSE_TOUCH_COMBINE || (this._game.input.multiInputOverride == Input.TOUCH_OVERRIDES_MOUSE && this._game.input.currentPointers == 0)) if (this.game.input.multiInputOverride == Input.MOUSE_OVERRIDES_TOUCH || this.game.input.multiInputOverride == Input.MOUSE_TOUCH_COMBINE || (this.game.input.multiInputOverride == Input.TOUCH_OVERRIDES_MOUSE && this.game.input.currentPointers == 0))
{ {
this._game.input.onHold.dispatch(this); this.game.input.onHold.dispatch(this);
} }
this._holdSent = true; this._holdSent = true;
} }
// Update the droppings history // Update the droppings history
if (this._game.input.recordPointerHistory && this._game.time.now >= this._nextDrop) if (this.game.input.recordPointerHistory && this.game.time.now >= this._nextDrop)
{ {
this._nextDrop = this._game.time.now + this._game.input.recordRate; this._nextDrop = this.game.time.now + this.game.input.recordRate;
this._history.push({ x: this.position.x, y: this.position.y }); this._history.push({ x: this.position.x, y: this.position.y });
if (this._history.length > this._game.input.recordLimit) if (this._history.length > this.game.input.recordLimit)
{ {
this._history.shift(); this._history.shift();
} }
} }
// Iterate through the tracked objects
// Build our temporary click stack
var _highestPriority = 0;
for (var i = 0; i < this.game.input.totalTrackedObjects; i++)
{
if (this.game.input.inputObjects[i].input.enabled)
{
this.game.input.inputObjects[i].input.update(this);
if (this.game.input.inputObjects[i].input.priorityID > _highestPriority)
{
_highestPriority = this.game.input.inputObjects[i].input.priorityID;
}
}
}
if (this.isDown)
{
// Now update all objects with the highest priority ID (can be more than 1)
for (var i = 0; i < this.game.input.totalTrackedObjects; i++)
{
if (this.game.input.inputObjects[i].input.priorityID == _highestPriority)
{
this.game.input.inputObjects[i].input._touchedHandler(this);
}
}
}
} }
} }
@ -374,20 +413,20 @@ module Phaser {
this.screenX = event.screenX; this.screenX = event.screenX;
this.screenY = event.screenY; this.screenY = event.screenY;
this.x = this.pageX - this._game.stage.offset.x; this.x = this.pageX - this.game.stage.offset.x;
this.y = this.pageY - this._game.stage.offset.y; this.y = this.pageY - this.game.stage.offset.y;
this.position.setTo(this.x, this.y); this.position.setTo(this.x, this.y);
this.circle.x = this.x; this.circle.x = this.x;
this.circle.y = this.y; this.circle.y = this.y;
if (this._game.input.multiInputOverride == Input.MOUSE_OVERRIDES_TOUCH || this._game.input.multiInputOverride == Input.MOUSE_TOUCH_COMBINE || (this._game.input.multiInputOverride == Input.TOUCH_OVERRIDES_MOUSE && this._game.input.currentPointers == 0)) if (this.game.input.multiInputOverride == Input.MOUSE_OVERRIDES_TOUCH || this.game.input.multiInputOverride == Input.MOUSE_TOUCH_COMBINE || (this.game.input.multiInputOverride == Input.TOUCH_OVERRIDES_MOUSE && this.game.input.currentPointers == 0))
{ {
this._game.input.x = this.x * this._game.input.scaleX; this.game.input.x = this.x * this.game.input.scaleX;
this._game.input.y = this.y * this._game.input.scaleY; this.game.input.y = this.y * this.game.input.scaleY;
this._game.input.position.setTo(this._game.input.x, this._game.input.y); this.game.input.position.setTo(this.game.input.x, this.game.input.y);
this._game.input.circle.x = this._game.input.x; this.game.input.circle.x = this.game.input.x;
this._game.input.circle.y = this._game.input.y; this.game.input.circle.y = this.game.input.y;
} }
return this; return this;
@ -413,25 +452,25 @@ module Phaser {
*/ */
public stop(event): Pointer { public stop(event): Pointer {
this.timeUp = this._game.time.now; this.timeUp = this.game.time.now;
if (this._game.input.multiInputOverride == Input.MOUSE_OVERRIDES_TOUCH || this._game.input.multiInputOverride == Input.MOUSE_TOUCH_COMBINE || (this._game.input.multiInputOverride == Input.TOUCH_OVERRIDES_MOUSE && this._game.input.currentPointers == 0)) if (this.game.input.multiInputOverride == Input.MOUSE_OVERRIDES_TOUCH || this.game.input.multiInputOverride == Input.MOUSE_TOUCH_COMBINE || (this.game.input.multiInputOverride == Input.TOUCH_OVERRIDES_MOUSE && this.game.input.currentPointers == 0))
{ {
this._game.input.onUp.dispatch(this); this.game.input.onUp.dispatch(this);
// Was it a tap? // Was it a tap?
if (this.duration >= 0 && this.duration <= this._game.input.tapRate) if (this.duration >= 0 && this.duration <= this.game.input.tapRate)
{ {
// Was it a double-tap? // Was it a double-tap?
if (this.timeUp - this.previousTapTime < this._game.input.doubleTapRate) if (this.timeUp - this.previousTapTime < this.game.input.doubleTapRate)
{ {
// Yes, let's dispatch the signal then with the 2nd parameter set to true // Yes, let's dispatch the signal then with the 2nd parameter set to true
this._game.input.onTap.dispatch(this, true); this.game.input.onTap.dispatch(this, true);
} }
else else
{ {
// Wasn't a double-tap, so dispatch a single tap signal // Wasn't a double-tap, so dispatch a single tap signal
this._game.input.onTap.dispatch(this, false); this.game.input.onTap.dispatch(this, false);
} }
this.previousTapTime = this.timeUp; this.previousTapTime = this.timeUp;
@ -439,14 +478,19 @@ module Phaser {
} }
this.active = false; // Mouse is always active
if (this.id > 0)
{
this.active = false;
}
this.withinGame = false; this.withinGame = false;
this.isDown = false; this.isDown = false;
this.isUp = true; this.isUp = true;
if (this.isMouse == false) if (this.isMouse == false)
{ {
this._game.input.currentPointers--; this.game.input.currentPointers--;
} }
return this; return this;
@ -459,9 +503,9 @@ module Phaser {
* @param {Number} [duration]. * @param {Number} [duration].
* @return {Boolean} * @return {Boolean}
*/ */
public justPressed(duration?: number = this._game.input.justPressedRate): bool { public justPressed(duration?: number = this.game.input.justPressedRate): bool {
if (this.isDown === true && (this.timeDown + duration) > this._game.time.now) if (this.isDown === true && (this.timeDown + duration) > this.game.time.now)
{ {
return true; return true;
} }
@ -478,9 +522,9 @@ module Phaser {
* @param {Number} [duration]. * @param {Number} [duration].
* @return {Boolean} * @return {Boolean}
*/ */
public justReleased(duration?: number = this._game.input.justReleasedRate): bool { public justReleased(duration?: number = this.game.input.justReleasedRate): bool {
if (this.isUp === true && (this.timeUp + duration) > this._game.time.now) if (this.isUp === true && (this.timeUp + duration) > this.game.time.now)
{ {
return true; return true;
} }
@ -518,37 +562,37 @@ module Phaser {
return; return;
} }
this._game.stage.context.beginPath(); this.game.stage.context.beginPath();
this._game.stage.context.arc(this.x, this.y, this.circle.radius, 0, Math.PI * 2); this.game.stage.context.arc(this.x, this.y, this.circle.radius, 0, Math.PI * 2);
if (this.active) if (this.active)
{ {
this._game.stage.context.fillStyle = 'rgba(0,255,0,0.5)'; this.game.stage.context.fillStyle = 'rgba(0,255,0,0.5)';
this._game.stage.context.strokeStyle = 'rgb(0,255,0)'; this.game.stage.context.strokeStyle = 'rgb(0,255,0)';
} }
else else
{ {
this._game.stage.context.fillStyle = 'rgba(255,0,0,0.5)'; this.game.stage.context.fillStyle = 'rgba(255,0,0,0.5)';
this._game.stage.context.strokeStyle = 'rgb(100,0,0)'; this.game.stage.context.strokeStyle = 'rgb(100,0,0)';
} }
this._game.stage.context.fill(); this.game.stage.context.fill();
this._game.stage.context.closePath(); this.game.stage.context.closePath();
// Render the points // Render the points
this._game.stage.context.beginPath(); this.game.stage.context.beginPath();
this._game.stage.context.moveTo(this.positionDown.x, this.positionDown.y); this.game.stage.context.moveTo(this.positionDown.x, this.positionDown.y);
this._game.stage.context.lineTo(this.position.x, this.position.y); this.game.stage.context.lineTo(this.position.x, this.position.y);
this._game.stage.context.lineWidth = 2; this.game.stage.context.lineWidth = 2;
this._game.stage.context.stroke(); this.game.stage.context.stroke();
this._game.stage.context.closePath(); this.game.stage.context.closePath();
// Render the text // Render the text
this._game.stage.context.fillStyle = 'rgb(255,255,255)'; this.game.stage.context.fillStyle = 'rgb(255,255,255)';
this._game.stage.context.font = 'Arial 16px'; this.game.stage.context.font = 'Arial 16px';
this._game.stage.context.fillText('ID: ' + this.id + " Active: " + this.active, this.x, this.y - 100); this.game.stage.context.fillText('ID: ' + this.id + " Active: " + this.active, this.x, this.y - 100);
this._game.stage.context.fillText('Screen X: ' + this.x + " Screen Y: " + this.y, this.x, this.y - 80); this.game.stage.context.fillText('Screen X: ' + this.x + " Screen Y: " + this.y, this.x, this.y - 80);
this._game.stage.context.fillText('Duration: ' + this.duration + " ms", this.x, this.y - 60); this.game.stage.context.fillText('Duration: ' + this.duration + " ms", this.x, this.y - 60);
} }

View file

@ -36,8 +36,8 @@ TODO:
* Polygon geom primitive * Polygon geom primitive
* If the Camera is larger than the Stage size then the rotation offset isn't correct * If the Camera is larger than the Stage size then the rotation offset isn't correct
* Texture Repeat doesn't scroll, because it's part of the camera not the world, need to think about this more * Texture Repeat doesn't scroll, because it's part of the camera not the world, need to think about this more
* Hook-up more events
* Bug: Sprite x/y gets shifted if dynamic from the original value * Bug: Sprite x/y gets shifted if dynamic from the original value
* Input CSS cursor those little 4-way arrows on drag?
V1.0.0 V1.0.0
@ -68,7 +68,8 @@ V1.0.0
* Added Group.addNewSprite(x,y,key) for quick addition of new Sprites to a Group * Added Group.addNewSprite(x,y,key) for quick addition of new Sprites to a Group
* Fixed Group.sort so the sortHandler is called correctly * Fixed Group.sort so the sortHandler is called correctly
* Added Group.swap(a,b) to swap the z-index of 2 objects with optional rendering update boolean * Added Group.swap(a,b) to swap the z-index of 2 objects with optional rendering update boolean
* Sprites dispatch killed/revived and added to and removed from Group events.
* Added Input drag, bounds, sprite bounds and snapping support.
V0.9.6 V0.9.6

View file

@ -10,9 +10,7 @@
function create() { function create() {
sprite = game.add.sprite(200, 200, 'sprite'); sprite = game.add.sprite(200, 200, 'sprite');
// Enable Input detection // Enable Input detection
sprite.input.enabled = true; sprite.input.start(0, false, true);
// Change the mouse pointer to a hand when over this sprite
sprite.input.useHandCursor = true;
} }
function render() { function render() {
game.input.renderDebugInfo(32, 32); game.input.renderDebugInfo(32, 32);

View file

@ -19,10 +19,7 @@
sprite = game.add.sprite(200, 200, 'sprite'); sprite = game.add.sprite(200, 200, 'sprite');
// Enable Input detection // Enable Input detection
sprite.input.enabled = true; sprite.input.start(0, false, true);
// Change the mouse pointer to a hand when over this sprite
sprite.input.useHandCursor = true;
} }

View file

@ -5579,136 +5579,245 @@ var Phaser;
* @param parent The Sprite using this Input component * @param parent The Sprite using this Input component
*/ */
function Input(parent) { function Input(parent) {
/**
* The PriorityID controls which Sprite receives an Input event first if they should overlap.
*/
this.priorityID = 0;
this.dragPixelPerfect = false; this.dragPixelPerfect = false;
this.allowHorizontalDrag = true; this.allowHorizontalDrag = true;
this.allowVerticalDrag = true; this.allowVerticalDrag = true;
this.snapOnDrag = false; this.snapOnDrag = false;
this.snapOnRelease = false; this.snapOnRelease = false;
/** this.snapX = 0;
* Is this sprite being dragged by the mouse or not? this.snapY = 0;
* @default false
*/
this.isDragged = false;
/** /**
* Is this sprite allowed to be dragged by the mouse? true = yes, false = no * Is this sprite allowed to be dragged by the mouse? true = yes, false = no
* @default false * @default false
*/ */
this.draggable = false; this.draggable = false;
/** /**
* An FlxRect region of the game world within which the sprite is restricted during mouse drag * A region of the game world within which the sprite is restricted during drag
* @default null * @default null
*/ */
this.boundsRect = null; this.boundsRect = null;
/** /**
* An FlxSprite the bounds of which this sprite is restricted during mouse drag * An Sprite the bounds of which this sprite is restricted during drag
* @default null * @default null
*/ */
this.boundsSprite = null; this.boundsSprite = null;
/**
* The x coordinate of the Input pointer, relative to the top-left of the parent Sprite.
* This value is only set with the pointer is over this Sprite.
* @type {number}
*/
this.x = 0;
/**
* The y coordinate of the Input pointer, relative to the top-left of the parent Sprite
* This value is only set with the pointer is over this Sprite.
* @type {number}
*/
this.y = 0;
/**
* If the Pointer is touching the touchscreen, or the mouse button is held down, isDown is set to true
* @property isDown
* @type {Boolean}
**/
this.isDown = false;
/**
* If the Pointer is not touching the touchscreen, or the mouse button is up, isUp is set to true
* @property isUp
* @type {Boolean}
**/
this.isUp = true;
/**
* A timestamp representing when the Pointer first touched the touchscreen.
* @property timeDown
* @type {Number}
**/
this.timeOver = 0;
/**
* A timestamp representing when the Pointer left the touchscreen.
* @property timeUp
* @type {Number}
**/
this.timeOut = 0;
/**
* Is the Pointer over this Sprite
* @property isOver
* @type {Boolean}
**/
this.isOver = false;
/**
* Is the Pointer outside of this Sprite
* @property isOut
* @type {Boolean}
**/
this.isOut = true;
this.game = parent.game; this.game = parent.game;
this._sprite = parent; this._sprite = parent;
this.enabled = false; this.enabled = false;
this.checkBody = false;
this.useHandCursor = false;
} }
Input.prototype.start = function (priority, checkBody, useHandCursor) {
if (typeof priority === "undefined") { priority = 0; }
if (typeof checkBody === "undefined") { checkBody = false; }
if (typeof useHandCursor === "undefined") { useHandCursor = false; }
// Turning on
if(this.enabled) {
return;
} else {
// Register, etc
this.checkBody = checkBody;
this.useHandCursor = useHandCursor;
this._pointerData = [];
for(var i = 0; i < 10; i++) {
this._pointerData.push({
id: i,
x: 0,
y: 0,
isDown: false,
isUp: false,
isOver: false,
isOut: false,
timeOver: 0,
timeOut: 0,
timeDown: 0,
timeUp: 0,
downDuration: 0,
isDragged: false
});
}
this.snapOffset = new Phaser.Point();
this.enabled = true;
this.game.input.addGameObject(this._sprite);
}
};
Input.prototype.stop = function () {
// Turning off
if(this.enabled == false) {
return;
} else {
// De-register, etc
this.enabled = false;
this.game.input.removeGameObject(this._sprite);
}
};
Input.prototype.pointerX = /**
* The x coordinate of the Input pointer, relative to the top-left of the parent Sprite.
* This value is only set when the pointer is over this Sprite.
* @type {number}
*/
function (pointer) {
if (typeof pointer === "undefined") { pointer = 0; }
return this._pointerData[pointer].x;
};
Input.prototype.pointerY = /**
* The y coordinate of the Input pointer, relative to the top-left of the parent Sprite
* This value is only set when the pointer is over this Sprite.
* @type {number}
*/
function (pointer) {
if (typeof pointer === "undefined") { pointer = 0; }
return this._pointerData[pointer].y;
};
Input.prototype.pointerDown = /**
* If the Pointer is touching the touchscreen, or the mouse button is held down, isDown is set to true
* @property isDown
* @type {Boolean}
**/
function (pointer) {
if (typeof pointer === "undefined") { pointer = 0; }
return this._pointerData[pointer].isDown;
};
Input.prototype.pointerUp = /**
* If the Pointer is not touching the touchscreen, or the mouse button is up, isUp is set to true
* @property isUp
* @type {Boolean}
**/
function (pointer) {
if (typeof pointer === "undefined") { pointer = 0; }
return this._pointerData[pointer].isUp;
};
Input.prototype.pointerTimeDown = /**
* A timestamp representing when the Pointer first touched the touchscreen.
* @property timeDown
* @type {Number}
**/
function (pointer) {
if (typeof pointer === "undefined") { pointer = 0; }
return this._pointerData[pointer].timeDown;
};
Input.prototype.pointerTimeUp = /**
* A timestamp representing when the Pointer left the touchscreen.
* @property timeUp
* @type {Number}
**/
function (pointer) {
if (typeof pointer === "undefined") { pointer = 0; }
return this._pointerData[pointer].timeUp;
};
Input.prototype.pointerOver = /**
* Is the Pointer over this Sprite
* @property isOver
* @type {Boolean}
**/
function (pointer) {
if (typeof pointer === "undefined") { pointer = 0; }
return this._pointerData[pointer].isOver;
};
Input.prototype.pointerOut = /**
* Is the Pointer outside of this Sprite
* @property isOut
* @type {Boolean}
**/
function (pointer) {
if (typeof pointer === "undefined") { pointer = 0; }
return this._pointerData[pointer].isOut;
};
Input.prototype.pointerTimeOver = /**
* A timestamp representing when the Pointer first touched the touchscreen.
* @property timeDown
* @type {Number}
**/
function (pointer) {
if (typeof pointer === "undefined") { pointer = 0; }
return this._pointerData[pointer].timeOver;
};
Input.prototype.pointerTimeOut = /**
* A timestamp representing when the Pointer left the touchscreen.
* @property timeUp
* @type {Number}
**/
function (pointer) {
if (typeof pointer === "undefined") { pointer = 0; }
return this._pointerData[pointer].timeOut;
};
Input.prototype.pointerDragged = /**
* Is this sprite being dragged by the mouse or not?
* @default false
*/
function (pointer) {
if (typeof pointer === "undefined") { pointer = 0; }
return this._pointerData[pointer].isDragged;
};
Input.prototype.update = /** Input.prototype.update = /**
* Update * Update
*/ */
function () { function (pointer) {
if(this.enabled == false) { if(this.enabled == false) {
return; return;
} }
if(this.draggable && this.isDragged) { // If was previously touched by this Pointer, check if still is
this.updateDrag(); if(this._pointerData[pointer.id].isDown && pointer.isUp) {
this._releasedHandler(pointer);
} }
if(this.game.input.x != this.oldX || this.game.input.y != this.oldY) { if(this.draggable && this._pointerData[pointer.id].isDragged) {
this.oldX = this.game.input.x; this.updateDrag(pointer);
this.oldY = this.game.input.y; //return;
if(Phaser.RectangleUtils.contains(this._sprite.frameBounds, this.game.input.x, this.game.input.y)) { }
this.x = this.game.input.x - this._sprite.x; if(Phaser.RectangleUtils.contains(this._sprite.frameBounds, pointer.x, pointer.y)) {
this.y = this.game.input.y - this._sprite.y; // { id: i, x: 0, y: 0, isDown: false, isUp: false, isOver: false, isOut: false, timeOver: 0, timeOut: 0, isDragged: false }
if(this.isOver == false) { this._pointerData[pointer.id].x = pointer.x - this._sprite.x;
this.isOver = true; this._pointerData[pointer.id].y = pointer.y - this._sprite.y;
this.isOut = false; if(this._pointerData[pointer.id].isOver == false) {
this.timeOver = this.game.time.now; this._pointerData[pointer.id].isOver = true;
if(this.useHandCursor) { this._pointerData[pointer.id].isOut = false;
this._sprite.game.stage.canvas.style.cursor = "pointer"; this._pointerData[pointer.id].timeOver = this.game.time.now;
} if(this.useHandCursor && this._pointerData[pointer.id].isDragged == false) {
this._sprite.events.onInputOver.dispatch(this._sprite, this.x, this.y, this.timeOver); this.game.stage.canvas.style.cursor = "pointer";
} }
} else { this._sprite.events.onInputOver.dispatch(this._sprite, pointer);
if(this.isOver) { }
this.isOver = false; } else {
this.isOut = true; if(this._pointerData[pointer.id].isOver) {
this.timeOut = this.game.time.now; this._pointerData[pointer.id].isOver = false;
if(this.useHandCursor) { this._pointerData[pointer.id].isOut = true;
this._sprite.game.stage.canvas.style.cursor = "default"; this._pointerData[pointer.id].timeOut = this.game.time.now;
} if(this.useHandCursor && this._pointerData[pointer.id].isDragged == false) {
this._sprite.events.onInputOut.dispatch(this._sprite, this.timeOut); this.game.stage.canvas.style.cursor = "default";
} }
this._sprite.events.onInputOut.dispatch(this._sprite, pointer);
} }
} }
}; };
Input.prototype._touchedHandler = function (pointer) {
this._pointerData[pointer.id].isDown = true;
this._pointerData[pointer.id].isUp = false;
this._pointerData[pointer.id].timeDown = this.game.time.now;
this._sprite.events.onInputDown.dispatch(this._sprite, pointer);
};
Input.prototype._releasedHandler = function (pointer) {
this._pointerData[pointer.id].isDown = false;
this._pointerData[pointer.id].isUp = true;
this._pointerData[pointer.id].timeUp = this.game.time.now;
//this._pointerData[pointer.id].downDuration = this._pointerData[pointer.id].timeUp - this._pointerData[pointer.id].timeDown;
this._sprite.events.onInputDown.dispatch(this._sprite, pointer);
};
Input.prototype.updateDrag = /** Input.prototype.updateDrag = /**
* Updates the Mouse Drag on this Sprite. * Updates the Pointer drag on this Sprite.
*/ */
function () { function (pointer) {
if(this.isUp) { if(pointer.isUp) {
this.stopDrag(); this.stopDrag(pointer);
return; return;
} }
// something wrong here, should use _dragPoint as well I think somehow
if(this.allowHorizontalDrag) { if(this.allowHorizontalDrag) {
this._sprite.x = this.game.input.x - this.dragOffsetX; this._sprite.x = pointer.x - this.dragOffset.x;
} }
if(this.allowVerticalDrag) { if(this.allowVerticalDrag) {
this._sprite.y = this.game.input.y - this.dragOffsetY; this._sprite.y = pointer.y - this.dragOffset.y;
} }
if(this.boundsRect) { if(this.boundsRect) {
this.checkBoundsRect(); this.checkBoundsRect();
@ -5726,37 +5835,67 @@ var Phaser;
* @param delay The time below which the pointer is considered as just over. * @param delay The time below which the pointer is considered as just over.
* @returns {boolean} * @returns {boolean}
*/ */
function (delay) { function (pointer, delay) {
if (typeof pointer === "undefined") { pointer = 0; }
if (typeof delay === "undefined") { delay = 500; } if (typeof delay === "undefined") { delay = 500; }
return (this.isOver && this.duration < delay); return (this._pointerData[pointer].isOver && this.overDuration(pointer) < delay);
}; };
Input.prototype.justOut = /** Input.prototype.justOut = /**
* Returns true if the pointer has left the Sprite within the specified delay time (defaults to 500ms, half a second) * Returns true if the pointer has left the Sprite within the specified delay time (defaults to 500ms, half a second)
* @param delay The time below which the pointer is considered as just out. * @param delay The time below which the pointer is considered as just out.
* @returns {boolean} * @returns {boolean}
*/ */
function (delay) { function (pointer, delay) {
if (typeof pointer === "undefined") { pointer = 0; }
if (typeof delay === "undefined") { delay = 500; } if (typeof delay === "undefined") { delay = 500; }
return (this.isOut && (this.game.time.now - this.timeOut < delay)); return (this._pointerData[pointer].isOut && (this.game.time.now - this._pointerData[pointer].timeOut < delay));
};
Input.prototype.justPressed = /**
* Returns true if the pointer has entered the Sprite within the specified delay time (defaults to 500ms, half a second)
* @param delay The time below which the pointer is considered as just over.
* @returns {boolean}
*/
function (pointer, delay) {
if (typeof pointer === "undefined") { pointer = 0; }
if (typeof delay === "undefined") { delay = 500; }
return (this._pointerData[pointer].isDown && this.downDuration(pointer) < delay);
};
Input.prototype.justReleased = /**
* Returns true if the pointer has left the Sprite within the specified delay time (defaults to 500ms, half a second)
* @param delay The time below which the pointer is considered as just out.
* @returns {boolean}
*/
function (pointer, delay) {
if (typeof pointer === "undefined") { pointer = 0; }
if (typeof delay === "undefined") { delay = 500; }
return (this._pointerData[pointer].isUp && (this.game.time.now - this._pointerData[pointer].timeUp < delay));
};
Input.prototype.overDuration = /**
* If the pointer is currently over this Sprite this returns how long it has been there for in milliseconds.
* @returns {number} The number of milliseconds the pointer has been over the Sprite, or -1 if not over.
*/
function (pointer) {
if (typeof pointer === "undefined") { pointer = 0; }
if(this._pointerData[pointer].isOver) {
return this.game.time.now - this._pointerData[pointer].timeOver;
}
return -1;
};
Input.prototype.downDuration = /**
* If the pointer is currently over this Sprite this returns how long it has been there for in milliseconds.
* @returns {number} The number of milliseconds the pointer has been pressed down on the Sprite, or -1 if not over.
*/
function (pointer) {
if (typeof pointer === "undefined") { pointer = 0; }
if(this._pointerData[pointer].isDown) {
return this.game.time.now - this._pointerData[pointer].timeDown;
}
return -1;
}; };
Object.defineProperty(Input.prototype, "duration", {
get: /**
* If the pointer is currently over this Sprite this returns how long it has been there for in milliseconds.
* @returns {number} The number of milliseconds the pointer has been over the Sprite, or -1 if not over.
*/
function () {
if(this.isOver) {
return this.game.time.now - this.timeOver;
}
return -1;
},
enumerable: true,
configurable: true
});
Input.prototype.enableDrag = /** Input.prototype.enableDrag = /**
* Make this Sprite draggable by the mouse. You can also optionally set mouseStartDragCallback and mouseStopDragCallback * Make this Sprite draggable by the mouse. You can also optionally set mouseStartDragCallback and mouseStopDragCallback
* *
* @param lockCenter If false the Sprite will drag from where you click it. If true it will center itself to the tip of the mouse pointer. * @param lockCenter If false the Sprite will drag from where you click it minus the dragOffset. If true it will center itself to the tip of the mouse pointer.
* @param pixelPerfect If true it will use a pixel perfect test to see if you clicked the Sprite. False uses the bounding box. * @param pixelPerfect If true it will use a pixel perfect test to see if you clicked the Sprite. False uses the bounding box.
* @param alphaThreshold If using pixel perfect collision this specifies the alpha level from 0 to 255 above which a collision is processed (default 255) * @param alphaThreshold If using pixel perfect collision this specifies the alpha level from 0 to 255 above which a collision is processed (default 255)
* @param boundsRect If you want to restrict the drag of this sprite to a specific FlxRect, pass the FlxRect here, otherwise it's free to drag anywhere * @param boundsRect If you want to restrict the drag of this sprite to a specific FlxRect, pass the FlxRect here, otherwise it's free to drag anywhere
@ -5768,8 +5907,10 @@ var Phaser;
if (typeof alphaThreshold === "undefined") { alphaThreshold = 255; } if (typeof alphaThreshold === "undefined") { alphaThreshold = 255; }
if (typeof boundsRect === "undefined") { boundsRect = null; } if (typeof boundsRect === "undefined") { boundsRect = null; }
if (typeof boundsSprite === "undefined") { boundsSprite = null; } if (typeof boundsSprite === "undefined") { boundsSprite = null; }
this._dragPoint = new Phaser.Point();
this.draggable = true; this.draggable = true;
this.dragFromPoint = lockCenter; this.dragOffset = new Phaser.Point();
this.dragFromCenter = lockCenter;
this.dragPixelPerfect = pixelPerfect; this.dragPixelPerfect = pixelPerfect;
this.dragPixelPerfectAlpha = alphaThreshold; this.dragPixelPerfectAlpha = alphaThreshold;
if(boundsRect) { if(boundsRect) {
@ -5783,15 +5924,36 @@ var Phaser;
* Stops this sprite from being able to be dragged. If it is currently the target of an active drag it will be stopped immediately. Also disables any set callbacks. * Stops this sprite from being able to be dragged. If it is currently the target of an active drag it will be stopped immediately. Also disables any set callbacks.
*/ */
function () { function () {
if(this.isDragged) { if(this._pointerData) {
//FlxMouseControl.dragTarget = null; for(var i = 0; i < 10; i++) {
//FlxMouseControl.isDragging = false; this._pointerData[i].isDragged = false;
} }
this.isDragged = false; }
this.draggable = false; this.draggable = false;
//mouseStartDragCallback = null; //mouseStartDragCallback = null;
//mouseStopDragCallback = null; //mouseStopDragCallback = null;
}; };
Input.prototype.startDrag = /**
* Called by Pointer when drag starts on this Sprite. Should not usually be called directly.
*/
function (pointer) {
this._pointerData[pointer.id].isDragged = true;
if(this.dragFromCenter) {
// Move the sprite to the middle of the pointer
this.dragOffset.setTo(this._sprite.frameBounds.halfWidth, this._sprite.frameBounds.halfHeight);
}
this._dragPoint.setTo(pointer.x - this._sprite.x - this.dragOffset.x, pointer.y - this._sprite.y - this.dragOffset.y);
};
Input.prototype.stopDrag = /**
* Called by Pointer when drag is stopped on this Sprite. Should not usually be called directly.
*/
function (pointer) {
this._pointerData[pointer.id].isDragged = false;
if(this.snapOnRelease) {
this._sprite.x = Math.floor(this._sprite.x / this.snapX) * this.snapX;
this._sprite.y = Math.floor(this._sprite.y / this.snapY) * this.snapY;
}
};
Input.prototype.setDragLock = /** Input.prototype.setDragLock = /**
* Restricts this sprite to drag movement only on the given axis. Note: If both are set to false the sprite will never move! * Restricts this sprite to drag movement only on the given axis. Note: If both are set to false the sprite will never move!
* *
@ -5828,20 +5990,6 @@ var Phaser;
this.snapOnDrag = false; this.snapOnDrag = false;
this.snapOnRelease = false; this.snapOnRelease = false;
}; };
Input.prototype.startDrag = /**
* Called by FlxMouseControl when Mouse Drag starts on this Sprite. Should not usually be called directly.
*/
function () {
this.isDragged = true;
if(this.dragFromPoint == false) {
this.dragOffsetX = this.game.input.x - this._sprite.x;
this.dragOffsetY = this.game.input.y - this._sprite.y;
} else {
// Move the sprite to the middle of the mouse
this.dragOffsetX = this._sprite.frameBounds.halfWidth;
this.dragOffsetY = this._sprite.frameBounds.halfHeight;
}
};
Input.prototype.checkBoundsRect = /** Input.prototype.checkBoundsRect = /**
* Bounds Rect check for the sprite drag * Bounds Rect check for the sprite drag
*/ */
@ -5872,16 +6020,6 @@ var Phaser;
this._sprite.y = (this.boundsSprite.y + this.boundsSprite.height) - this._sprite.height; this._sprite.y = (this.boundsSprite.y + this.boundsSprite.height) - this._sprite.height;
} }
}; };
Input.prototype.stopDrag = /**
* Called by FlxMouseControl when Mouse Drag is stopped on this Sprite. Should not usually be called directly.
*/
function () {
this.isDragged = false;
if(this.snapOnRelease) {
this._sprite.x = Math.floor(this._sprite.x / this.snapX) * this.snapX;
this._sprite.y = Math.floor(this._sprite.y / this.snapY) * this.snapY;
}
};
Input.prototype.renderDebugInfo = /** Input.prototype.renderDebugInfo = /**
* Render debug infos. (including name, bounds info, position and some other properties) * Render debug infos. (including name, bounds info, position and some other properties)
* @param x {number} X position of the debug info to be rendered. * @param x {number} X position of the debug info to be rendered.
@ -5893,9 +6031,10 @@ var Phaser;
this._sprite.texture.context.font = '14px Courier'; this._sprite.texture.context.font = '14px Courier';
this._sprite.texture.context.fillStyle = color; this._sprite.texture.context.fillStyle = color;
this._sprite.texture.context.fillText('Sprite Input: (' + this._sprite.frameBounds.width + ' x ' + this._sprite.frameBounds.height + ')', x, y); this._sprite.texture.context.fillText('Sprite Input: (' + this._sprite.frameBounds.width + ' x ' + this._sprite.frameBounds.height + ')', x, y);
this._sprite.texture.context.fillText('x: ' + this.x.toFixed(1) + ' y: ' + this.y.toFixed(1), x, y + 14); this._sprite.texture.context.fillText('x: ' + this.pointerX().toFixed(1) + ' y: ' + this.pointerY().toFixed(1), x, y + 14);
this._sprite.texture.context.fillText('over: ' + this.isOver + ' duration: ' + this.duration.toFixed(0), x, y + 28); this._sprite.texture.context.fillText('over: ' + this.pointerOver() + ' duration: ' + this.overDuration().toFixed(0), x, y + 28);
this._sprite.texture.context.fillText('just over: ' + this.justOver() + ' just out: ' + this.justOut(), x, y + 42); this._sprite.texture.context.fillText('down: ' + this.pointerDown() + ' duration: ' + this.downDuration().toFixed(0), x, y + 42);
this._sprite.texture.context.fillText('just over: ' + this.justOver() + ' just out: ' + this.justOut(), x, y + 56);
}; };
return Input; return Input;
})(); })();
@ -6624,7 +6763,6 @@ var Phaser;
} }
} }
*/ */
this.input.update();
if(this.modified == true && this.scale.equals(1) && this.skew.equals(0) && this.angle == 0 && this.angleOffset == 0 && this.texture.flippedX == false && this.texture.flippedY == false) { if(this.modified == true && this.scale.equals(1) && this.skew.equals(0) && this.angle == 0 && this.angleOffset == 0 && this.texture.flippedX == false && this.texture.flippedY == false) {
this.modified = false; this.modified = false;
} }
@ -13280,7 +13418,7 @@ var Phaser;
* @type {Number} * @type {Number}
**/ **/
this.totalTouches = 0; this.totalTouches = 0;
this._game = game; this.game = game;
this.id = id; this.id = id;
this.active = false; this.active = false;
this.position = new Phaser.Vec2(); this.position = new Phaser.Vec2();
@ -13300,7 +13438,7 @@ var Phaser;
if(this.isUp) { if(this.isUp) {
return -1; return -1;
} }
return this._game.time.now - this.timeDown; return this.game.time.now - this.timeDown;
}, },
enumerable: true, enumerable: true,
configurable: true configurable: true
@ -13310,7 +13448,7 @@ var Phaser;
* @param {Camera} [camera] * @param {Camera} [camera]
*/ */
function (camera) { function (camera) {
if (typeof camera === "undefined") { camera = this._game.camera; } if (typeof camera === "undefined") { camera = this.game.camera; }
return camera.worldView.x + this.x; return camera.worldView.x + this.x;
}; };
Pointer.prototype.getWorldY = /** Pointer.prototype.getWorldY = /**
@ -13318,7 +13456,7 @@ var Phaser;
* @param {Camera} [camera] * @param {Camera} [camera]
*/ */
function (camera) { function (camera) {
if (typeof camera === "undefined") { camera = this._game.camera; } if (typeof camera === "undefined") { camera = this.game.camera; }
return camera.worldView.y + this.y; return camera.worldView.y + this.y;
}; };
Pointer.prototype.start = /** Pointer.prototype.start = /**
@ -13333,8 +13471,8 @@ var Phaser;
this.button = event.button; this.button = event.button;
} }
// Fix to stop rogue browser plugins from blocking the visibility state event // Fix to stop rogue browser plugins from blocking the visibility state event
if(this._game.paused == true) { if(this.game.paused == true) {
this._game.stage.resumeGame(); this.game.stage.resumeGame();
return this; return this;
} }
this._history.length = 0; this._history.length = 0;
@ -13344,38 +13482,57 @@ var Phaser;
this.withinGame = true; this.withinGame = true;
this.isDown = true; this.isDown = true;
this.isUp = false; this.isUp = false;
this.timeDown = this._game.time.now; this.timeDown = this.game.time.now;
this._holdSent = false; this._holdSent = false;
if(this._game.input.multiInputOverride == Phaser.Input.MOUSE_OVERRIDES_TOUCH || this._game.input.multiInputOverride == Phaser.Input.MOUSE_TOUCH_COMBINE || (this._game.input.multiInputOverride == Phaser.Input.TOUCH_OVERRIDES_MOUSE && this._game.input.currentPointers == 0)) { if(this.game.input.multiInputOverride == Phaser.Input.MOUSE_OVERRIDES_TOUCH || this.game.input.multiInputOverride == Phaser.Input.MOUSE_TOUCH_COMBINE || (this.game.input.multiInputOverride == Phaser.Input.TOUCH_OVERRIDES_MOUSE && this.game.input.currentPointers == 0)) {
this._game.input.x = this.x * this._game.input.scaleX; this.game.input.x = this.x * this.game.input.scaleX;
this._game.input.y = this.y * this._game.input.scaleY; this.game.input.y = this.y * this.game.input.scaleY;
this._game.input.onDown.dispatch(this); this.game.input.onDown.dispatch(this);
} }
this.totalTouches++; this.totalTouches++;
if(this.isMouse == false) { if(this.isMouse == false) {
this._game.input.currentPointers++; this.game.input.currentPointers++;
} }
return this; return this;
}; };
Pointer.prototype.update = function () { Pointer.prototype.update = function () {
if(this.active) { if(this.active) {
if(this._holdSent == false && this.duration >= this._game.input.holdRate) { if(this._holdSent == false && this.duration >= this.game.input.holdRate) {
if(this._game.input.multiInputOverride == Phaser.Input.MOUSE_OVERRIDES_TOUCH || this._game.input.multiInputOverride == Phaser.Input.MOUSE_TOUCH_COMBINE || (this._game.input.multiInputOverride == Phaser.Input.TOUCH_OVERRIDES_MOUSE && this._game.input.currentPointers == 0)) { if(this.game.input.multiInputOverride == Phaser.Input.MOUSE_OVERRIDES_TOUCH || this.game.input.multiInputOverride == Phaser.Input.MOUSE_TOUCH_COMBINE || (this.game.input.multiInputOverride == Phaser.Input.TOUCH_OVERRIDES_MOUSE && this.game.input.currentPointers == 0)) {
this._game.input.onHold.dispatch(this); this.game.input.onHold.dispatch(this);
} }
this._holdSent = true; this._holdSent = true;
} }
// Update the droppings history // Update the droppings history
if(this._game.input.recordPointerHistory && this._game.time.now >= this._nextDrop) { if(this.game.input.recordPointerHistory && this.game.time.now >= this._nextDrop) {
this._nextDrop = this._game.time.now + this._game.input.recordRate; this._nextDrop = this.game.time.now + this.game.input.recordRate;
this._history.push({ this._history.push({
x: this.position.x, x: this.position.x,
y: this.position.y y: this.position.y
}); });
if(this._history.length > this._game.input.recordLimit) { if(this._history.length > this.game.input.recordLimit) {
this._history.shift(); this._history.shift();
} }
} }
// Iterate through the tracked objects
// Build our temporary click stack
var _highestPriority = 0;
for(var i = 0; i < this.game.input.totalTrackedObjects; i++) {
if(this.game.input.inputObjects[i].input.enabled) {
this.game.input.inputObjects[i].input.update(this);
if(this.game.input.inputObjects[i].input.priorityID > _highestPriority) {
_highestPriority = this.game.input.inputObjects[i].input.priorityID;
}
}
}
if(this.isDown) {
// Now update all objects with the highest priority ID (can be more than 1)
for(var i = 0; i < this.game.input.totalTrackedObjects; i++) {
if(this.game.input.inputObjects[i].input.priorityID == _highestPriority) {
this.game.input.inputObjects[i].input._touchedHandler(this);
}
}
}
} }
}; };
Pointer.prototype.move = /** Pointer.prototype.move = /**
@ -13393,17 +13550,17 @@ var Phaser;
this.pageY = event.pageY; this.pageY = event.pageY;
this.screenX = event.screenX; this.screenX = event.screenX;
this.screenY = event.screenY; this.screenY = event.screenY;
this.x = this.pageX - this._game.stage.offset.x; this.x = this.pageX - this.game.stage.offset.x;
this.y = this.pageY - this._game.stage.offset.y; this.y = this.pageY - this.game.stage.offset.y;
this.position.setTo(this.x, this.y); this.position.setTo(this.x, this.y);
this.circle.x = this.x; this.circle.x = this.x;
this.circle.y = this.y; this.circle.y = this.y;
if(this._game.input.multiInputOverride == Phaser.Input.MOUSE_OVERRIDES_TOUCH || this._game.input.multiInputOverride == Phaser.Input.MOUSE_TOUCH_COMBINE || (this._game.input.multiInputOverride == Phaser.Input.TOUCH_OVERRIDES_MOUSE && this._game.input.currentPointers == 0)) { if(this.game.input.multiInputOverride == Phaser.Input.MOUSE_OVERRIDES_TOUCH || this.game.input.multiInputOverride == Phaser.Input.MOUSE_TOUCH_COMBINE || (this.game.input.multiInputOverride == Phaser.Input.TOUCH_OVERRIDES_MOUSE && this.game.input.currentPointers == 0)) {
this._game.input.x = this.x * this._game.input.scaleX; this.game.input.x = this.x * this.game.input.scaleX;
this._game.input.y = this.y * this._game.input.scaleY; this.game.input.y = this.y * this.game.input.scaleY;
this._game.input.position.setTo(this._game.input.x, this._game.input.y); this.game.input.position.setTo(this.game.input.x, this.game.input.y);
this._game.input.circle.x = this._game.input.x; this.game.input.circle.x = this.game.input.x;
this._game.input.circle.y = this._game.input.y; this.game.input.circle.y = this.game.input.y;
} }
return this; return this;
}; };
@ -13422,28 +13579,31 @@ var Phaser;
* @param {Any} event * @param {Any} event
*/ */
function (event) { function (event) {
this.timeUp = this._game.time.now; this.timeUp = this.game.time.now;
if(this._game.input.multiInputOverride == Phaser.Input.MOUSE_OVERRIDES_TOUCH || this._game.input.multiInputOverride == Phaser.Input.MOUSE_TOUCH_COMBINE || (this._game.input.multiInputOverride == Phaser.Input.TOUCH_OVERRIDES_MOUSE && this._game.input.currentPointers == 0)) { if(this.game.input.multiInputOverride == Phaser.Input.MOUSE_OVERRIDES_TOUCH || this.game.input.multiInputOverride == Phaser.Input.MOUSE_TOUCH_COMBINE || (this.game.input.multiInputOverride == Phaser.Input.TOUCH_OVERRIDES_MOUSE && this.game.input.currentPointers == 0)) {
this._game.input.onUp.dispatch(this); this.game.input.onUp.dispatch(this);
// Was it a tap? // Was it a tap?
if(this.duration >= 0 && this.duration <= this._game.input.tapRate) { if(this.duration >= 0 && this.duration <= this.game.input.tapRate) {
// Was it a double-tap? // Was it a double-tap?
if(this.timeUp - this.previousTapTime < this._game.input.doubleTapRate) { if(this.timeUp - this.previousTapTime < this.game.input.doubleTapRate) {
// Yes, let's dispatch the signal then with the 2nd parameter set to true // Yes, let's dispatch the signal then with the 2nd parameter set to true
this._game.input.onTap.dispatch(this, true); this.game.input.onTap.dispatch(this, true);
} else { } else {
// Wasn't a double-tap, so dispatch a single tap signal // Wasn't a double-tap, so dispatch a single tap signal
this._game.input.onTap.dispatch(this, false); this.game.input.onTap.dispatch(this, false);
} }
this.previousTapTime = this.timeUp; this.previousTapTime = this.timeUp;
} }
} }
this.active = false; // Mouse is always active
if(this.id > 0) {
this.active = false;
}
this.withinGame = false; this.withinGame = false;
this.isDown = false; this.isDown = false;
this.isUp = true; this.isUp = true;
if(this.isMouse == false) { if(this.isMouse == false) {
this._game.input.currentPointers--; this.game.input.currentPointers--;
} }
return this; return this;
}; };
@ -13454,8 +13614,8 @@ var Phaser;
* @return {Boolean} * @return {Boolean}
*/ */
function (duration) { function (duration) {
if (typeof duration === "undefined") { duration = this._game.input.justPressedRate; } if (typeof duration === "undefined") { duration = this.game.input.justPressedRate; }
if(this.isDown === true && (this.timeDown + duration) > this._game.time.now) { if(this.isDown === true && (this.timeDown + duration) > this.game.time.now) {
return true; return true;
} else { } else {
return false; return false;
@ -13468,8 +13628,8 @@ var Phaser;
* @return {Boolean} * @return {Boolean}
*/ */
function (duration) { function (duration) {
if (typeof duration === "undefined") { duration = this._game.input.justReleasedRate; } if (typeof duration === "undefined") { duration = this.game.input.justReleasedRate; }
if(this.isUp === true && (this.timeUp + duration) > this._game.time.now) { if(this.isUp === true && (this.timeUp + duration) > this.game.time.now) {
return true; return true;
} else { } else {
return false; return false;
@ -13497,30 +13657,30 @@ var Phaser;
if(hideIfUp == true && this.isUp == true) { if(hideIfUp == true && this.isUp == true) {
return; return;
} }
this._game.stage.context.beginPath(); this.game.stage.context.beginPath();
this._game.stage.context.arc(this.x, this.y, this.circle.radius, 0, Math.PI * 2); this.game.stage.context.arc(this.x, this.y, this.circle.radius, 0, Math.PI * 2);
if(this.active) { if(this.active) {
this._game.stage.context.fillStyle = 'rgba(0,255,0,0.5)'; this.game.stage.context.fillStyle = 'rgba(0,255,0,0.5)';
this._game.stage.context.strokeStyle = 'rgb(0,255,0)'; this.game.stage.context.strokeStyle = 'rgb(0,255,0)';
} else { } else {
this._game.stage.context.fillStyle = 'rgba(255,0,0,0.5)'; this.game.stage.context.fillStyle = 'rgba(255,0,0,0.5)';
this._game.stage.context.strokeStyle = 'rgb(100,0,0)'; this.game.stage.context.strokeStyle = 'rgb(100,0,0)';
} }
this._game.stage.context.fill(); this.game.stage.context.fill();
this._game.stage.context.closePath(); this.game.stage.context.closePath();
// Render the points // Render the points
this._game.stage.context.beginPath(); this.game.stage.context.beginPath();
this._game.stage.context.moveTo(this.positionDown.x, this.positionDown.y); this.game.stage.context.moveTo(this.positionDown.x, this.positionDown.y);
this._game.stage.context.lineTo(this.position.x, this.position.y); this.game.stage.context.lineTo(this.position.x, this.position.y);
this._game.stage.context.lineWidth = 2; this.game.stage.context.lineWidth = 2;
this._game.stage.context.stroke(); this.game.stage.context.stroke();
this._game.stage.context.closePath(); this.game.stage.context.closePath();
// Render the text // Render the text
this._game.stage.context.fillStyle = 'rgb(255,255,255)'; this.game.stage.context.fillStyle = 'rgb(255,255,255)';
this._game.stage.context.font = 'Arial 16px'; this.game.stage.context.font = 'Arial 16px';
this._game.stage.context.fillText('ID: ' + this.id + " Active: " + this.active, this.x, this.y - 100); this.game.stage.context.fillText('ID: ' + this.id + " Active: " + this.active, this.x, this.y - 100);
this._game.stage.context.fillText('Screen X: ' + this.x + " Screen Y: " + this.y, this.x, this.y - 80); this.game.stage.context.fillText('Screen X: ' + this.x + " Screen Y: " + this.y, this.x, this.y - 80);
this._game.stage.context.fillText('Duration: ' + this.duration + " ms", this.x, this.y - 60); this.game.stage.context.fillText('Duration: ' + this.duration + " ms", this.x, this.y - 60);
}; };
Pointer.prototype.toString = /** Pointer.prototype.toString = /**
* Returns a string representation of this object. * Returns a string representation of this object.
@ -14329,6 +14489,8 @@ var Phaser;
* @type {Pointer} * @type {Pointer}
**/ **/
this.pointer10 = null; this.pointer10 = null;
this.inputObjects = [];
this.totalTrackedObjects = 0;
this._game = game; this._game = game;
this._stack = []; this._stack = [];
this.mousePointer = new Phaser.Pointer(this._game, 0); this.mousePointer = new Phaser.Pointer(this._game, 0);
@ -14426,12 +14588,24 @@ var Phaser;
this.touch.start(); this.touch.start();
this.mspointer.start(); this.mspointer.start();
this.gestures.start(); this.gestures.start();
this.mousePointer.active = true;
}; };
Input.prototype.addGameObject = // Add Input Enabled array + add/remove methods and then iterate and update them during the main update
// Clear down this array on State swap??? Maybe removed from it when Sprite is destroyed
function (object) {
// Lots more checks here
this.inputObjects.push(object);
this.totalTrackedObjects++;
};
Input.prototype.removeGameObject = function (object) {
// TODO
};
Input.prototype.update = /** Input.prototype.update = /**
* Updates the Input Manager. Called by the core Game loop. * Updates the Input Manager. Called by the core Game loop.
* @method update * @method update
**/ **/
function () { function () {
// Swap for velocity vector - and add it to Pointer?
this.speed.x = this.position.x - this._oldPosition.x; this.speed.x = this.position.x - this._oldPosition.x;
this.speed.y = this.position.y - this._oldPosition.y; this.speed.y = this.position.y - this._oldPosition.y;
this._oldPosition.copyFrom(this.position); this._oldPosition.copyFrom(this.position);

137
build/phaser.d.ts vendored
View file

@ -3261,39 +3261,42 @@ module Phaser.Components {
* Reference to the Image stored in the Game.Cache that is used as the texture for the Sprite. * Reference to the Image stored in the Game.Cache that is used as the texture for the Sprite.
*/ */
private _sprite; private _sprite;
private dragOffsetX; private _pointerData;
private dragOffsetY;
private dragFromPoint;
private dragPixelPerfect;
private dragPixelPerfectAlpha;
private allowHorizontalDrag;
private allowVerticalDrag;
private snapOnDrag;
private snapOnRelease;
private snapX;
private snapY;
/** /**
* If enabled the Input component will be updated by the parent Sprite * If enabled the Input component will be updated by the parent Sprite
* @type {Boolean} * @type {Boolean}
*/ */
public enabled: bool; public enabled: bool;
/** /**
* Is this sprite being dragged by the mouse or not? * The PriorityID controls which Sprite receives an Input event first if they should overlap.
* @default false
*/ */
public isDragged: bool; public priorityID: number;
public start(priority?: number, checkBody?: bool, useHandCursor?: bool): void;
public stop(): void;
private _dragPoint;
public dragOffset: Point;
public dragFromCenter: bool;
public dragPixelPerfect: bool;
public dragPixelPerfectAlpha: number;
public allowHorizontalDrag: bool;
public allowVerticalDrag: bool;
public snapOnDrag: bool;
public snapOnRelease: bool;
public snapOffset: Point;
public snapX: number;
public snapY: number;
/** /**
* Is this sprite allowed to be dragged by the mouse? true = yes, false = no * Is this sprite allowed to be dragged by the mouse? true = yes, false = no
* @default false * @default false
*/ */
public draggable: bool; public draggable: bool;
/** /**
* An FlxRect region of the game world within which the sprite is restricted during mouse drag * A region of the game world within which the sprite is restricted during drag
* @default null * @default null
*/ */
public boundsRect: Rectangle; public boundsRect: Rectangle;
/** /**
* An FlxSprite the bounds of which this sprite is restricted during mouse drag * An Sprite the bounds of which this sprite is restricted during drag
* @default null * @default null
*/ */
public boundsSprite: Sprite; public boundsSprite: Sprite;
@ -3311,83 +3314,117 @@ module Phaser.Components {
public useHandCursor: bool; public useHandCursor: bool;
/** /**
* The x coordinate of the Input pointer, relative to the top-left of the parent Sprite. * The x coordinate of the Input pointer, relative to the top-left of the parent Sprite.
* This value is only set with the pointer is over this Sprite. * This value is only set when the pointer is over this Sprite.
* @type {number} * @type {number}
*/ */
public x: number; public pointerX(pointer?: number): number;
/** /**
* The y coordinate of the Input pointer, relative to the top-left of the parent Sprite * The y coordinate of the Input pointer, relative to the top-left of the parent Sprite
* This value is only set with the pointer is over this Sprite. * This value is only set when the pointer is over this Sprite.
* @type {number} * @type {number}
*/ */
public y: number; public pointerY(pointer?: number): number;
/** /**
* If the Pointer is touching the touchscreen, or the mouse button is held down, isDown is set to true * If the Pointer is touching the touchscreen, or the mouse button is held down, isDown is set to true
* @property isDown * @property isDown
* @type {Boolean} * @type {Boolean}
**/ **/
public isDown: bool; public pointerDown(pointer?: number): bool;
/** /**
* If the Pointer is not touching the touchscreen, or the mouse button is up, isUp is set to true * If the Pointer is not touching the touchscreen, or the mouse button is up, isUp is set to true
* @property isUp * @property isUp
* @type {Boolean} * @type {Boolean}
**/ **/
public isUp: bool; public pointerUp(pointer?: number): bool;
/** /**
* A timestamp representing when the Pointer first touched the touchscreen. * A timestamp representing when the Pointer first touched the touchscreen.
* @property timeDown * @property timeDown
* @type {Number} * @type {Number}
**/ **/
public timeOver: number; public pointerTimeDown(pointer?: number): bool;
/** /**
* A timestamp representing when the Pointer left the touchscreen. * A timestamp representing when the Pointer left the touchscreen.
* @property timeUp * @property timeUp
* @type {Number} * @type {Number}
**/ **/
public timeOut: number; public pointerTimeUp(pointer?: number): bool;
/** /**
* Is the Pointer over this Sprite * Is the Pointer over this Sprite
* @property isOver * @property isOver
* @type {Boolean} * @type {Boolean}
**/ **/
public isOver: bool; public pointerOver(pointer?: number): bool;
/** /**
* Is the Pointer outside of this Sprite * Is the Pointer outside of this Sprite
* @property isOut * @property isOut
* @type {Boolean} * @type {Boolean}
**/ **/
public isOut: bool; public pointerOut(pointer?: number): bool;
public oldX: number; /**
public oldY: number; * A timestamp representing when the Pointer first touched the touchscreen.
* @property timeDown
* @type {Number}
**/
public pointerTimeOver(pointer?: number): bool;
/**
* A timestamp representing when the Pointer left the touchscreen.
* @property timeUp
* @type {Number}
**/
public pointerTimeOut(pointer?: number): bool;
/**
* Is this sprite being dragged by the mouse or not?
* @default false
*/
public pointerDragged(pointer?: number): bool;
/** /**
* Update * Update
*/ */
public update(): void; public update(pointer: Pointer): void;
public _touchedHandler(pointer: Pointer): void;
public _releasedHandler(pointer: Pointer): void;
/** /**
* Updates the Mouse Drag on this Sprite. * Updates the Pointer drag on this Sprite.
*/ */
private updateDrag(); private updateDrag(pointer);
/** /**
* Returns true if the pointer has entered the Sprite within the specified delay time (defaults to 500ms, half a second) * Returns true if the pointer has entered the Sprite within the specified delay time (defaults to 500ms, half a second)
* @param delay The time below which the pointer is considered as just over. * @param delay The time below which the pointer is considered as just over.
* @returns {boolean} * @returns {boolean}
*/ */
public justOver(delay?: number): bool; public justOver(pointer?: number, delay?: number): bool;
/** /**
* Returns true if the pointer has left the Sprite within the specified delay time (defaults to 500ms, half a second) * Returns true if the pointer has left the Sprite within the specified delay time (defaults to 500ms, half a second)
* @param delay The time below which the pointer is considered as just out. * @param delay The time below which the pointer is considered as just out.
* @returns {boolean} * @returns {boolean}
*/ */
public justOut(delay?: number): bool; public justOut(pointer?: number, delay?: number): bool;
/**
* Returns true if the pointer has entered the Sprite within the specified delay time (defaults to 500ms, half a second)
* @param delay The time below which the pointer is considered as just over.
* @returns {boolean}
*/
public justPressed(pointer?: number, delay?: number): bool;
/**
* Returns true if the pointer has left the Sprite within the specified delay time (defaults to 500ms, half a second)
* @param delay The time below which the pointer is considered as just out.
* @returns {boolean}
*/
public justReleased(pointer?: number, delay?: number): bool;
/** /**
* If the pointer is currently over this Sprite this returns how long it has been there for in milliseconds. * If the pointer is currently over this Sprite this returns how long it has been there for in milliseconds.
* @returns {number} The number of milliseconds the pointer has been over the Sprite, or -1 if not over. * @returns {number} The number of milliseconds the pointer has been over the Sprite, or -1 if not over.
*/ */
public duration : number; public overDuration(pointer?: number): number;
/**
* If the pointer is currently over this Sprite this returns how long it has been there for in milliseconds.
* @returns {number} The number of milliseconds the pointer has been pressed down on the Sprite, or -1 if not over.
*/
public downDuration(pointer?: number): number;
/** /**
* Make this Sprite draggable by the mouse. You can also optionally set mouseStartDragCallback and mouseStopDragCallback * Make this Sprite draggable by the mouse. You can also optionally set mouseStartDragCallback and mouseStopDragCallback
* *
* @param lockCenter If false the Sprite will drag from where you click it. If true it will center itself to the tip of the mouse pointer. * @param lockCenter If false the Sprite will drag from where you click it minus the dragOffset. If true it will center itself to the tip of the mouse pointer.
* @param pixelPerfect If true it will use a pixel perfect test to see if you clicked the Sprite. False uses the bounding box. * @param pixelPerfect If true it will use a pixel perfect test to see if you clicked the Sprite. False uses the bounding box.
* @param alphaThreshold If using pixel perfect collision this specifies the alpha level from 0 to 255 above which a collision is processed (default 255) * @param alphaThreshold If using pixel perfect collision this specifies the alpha level from 0 to 255 above which a collision is processed (default 255)
* @param boundsRect If you want to restrict the drag of this sprite to a specific FlxRect, pass the FlxRect here, otherwise it's free to drag anywhere * @param boundsRect If you want to restrict the drag of this sprite to a specific FlxRect, pass the FlxRect here, otherwise it's free to drag anywhere
@ -3399,6 +3436,14 @@ module Phaser.Components {
*/ */
public disableDrag(): void; public disableDrag(): void;
/** /**
* Called by Pointer when drag starts on this Sprite. Should not usually be called directly.
*/
public startDrag(pointer: Pointer): void;
/**
* Called by Pointer when drag is stopped on this Sprite. Should not usually be called directly.
*/
public stopDrag(pointer: Pointer): void;
/**
* Restricts this sprite to drag movement only on the given axis. Note: If both are set to false the sprite will never move! * Restricts this sprite to drag movement only on the given axis. Note: If both are set to false the sprite will never move!
* *
* @param allowHorizontal To enable the sprite to be dragged horizontally set to true, otherwise false * @param allowHorizontal To enable the sprite to be dragged horizontally set to true, otherwise false
@ -3420,10 +3465,6 @@ module Phaser.Components {
*/ */
public disableSnap(): void; public disableSnap(): void;
/** /**
* Called by FlxMouseControl when Mouse Drag starts on this Sprite. Should not usually be called directly.
*/
public startDrag(): void;
/**
* Bounds Rect check for the sprite drag * Bounds Rect check for the sprite drag
*/ */
private checkBoundsRect(); private checkBoundsRect();
@ -3432,10 +3473,6 @@ module Phaser.Components {
*/ */
private checkBoundsSprite(); private checkBoundsSprite();
/** /**
* Called by FlxMouseControl when Mouse Drag is stopped on this Sprite. Should not usually be called directly.
*/
public stopDrag(): void;
/**
* Render debug infos. (including name, bounds info, position and some other properties) * Render debug infos. (including name, bounds info, position and some other properties)
* @param x {number} X position of the debug info to be rendered. * @param x {number} X position of the debug info to be rendered.
* @param y {number} Y position of the debug info to be rendered. * @param y {number} Y position of the debug info to be rendered.
@ -7065,11 +7102,11 @@ module Phaser {
constructor(game: Game, id: number); constructor(game: Game, id: number);
/** /**
* Local private reference to game. * Local private reference to game.
* @property _game * @property game
* @type {Phaser.Game} * @type {Phaser.Game}
* @private * @private
**/ **/
private _game; public game: Game;
/** /**
* Local private variable to store the status of dispatching a hold event * Local private variable to store the status of dispatching a hold event
* @property _holdSent * @property _holdSent
@ -7245,6 +7282,12 @@ module Phaser {
**/ **/
public duration : number; public duration : number;
/** /**
* The Game Object this Pointer is currently dragging.
* @property draggedObject
* @type {Any}
**/
public draggedObject;
/**
* Gets the X value of this Pointer in world coordinate space * Gets the X value of this Pointer in world coordinate space
* @param {Camera} [camera] * @param {Camera} [camera]
*/ */
@ -7981,6 +8024,10 @@ module Phaser {
* @method start * @method start
**/ **/
public boot(): void; public boot(): void;
public inputObjects: any[];
public totalTrackedObjects: number;
public addGameObject(object): void;
public removeGameObject(object): void;
/** /**
* Updates the Input Manager. Called by the core Game loop. * Updates the Input Manager. Called by the core Game loop.
* @method update * @method update

View file

@ -5579,136 +5579,245 @@ var Phaser;
* @param parent The Sprite using this Input component * @param parent The Sprite using this Input component
*/ */
function Input(parent) { function Input(parent) {
/**
* The PriorityID controls which Sprite receives an Input event first if they should overlap.
*/
this.priorityID = 0;
this.dragPixelPerfect = false; this.dragPixelPerfect = false;
this.allowHorizontalDrag = true; this.allowHorizontalDrag = true;
this.allowVerticalDrag = true; this.allowVerticalDrag = true;
this.snapOnDrag = false; this.snapOnDrag = false;
this.snapOnRelease = false; this.snapOnRelease = false;
/** this.snapX = 0;
* Is this sprite being dragged by the mouse or not? this.snapY = 0;
* @default false
*/
this.isDragged = false;
/** /**
* Is this sprite allowed to be dragged by the mouse? true = yes, false = no * Is this sprite allowed to be dragged by the mouse? true = yes, false = no
* @default false * @default false
*/ */
this.draggable = false; this.draggable = false;
/** /**
* An FlxRect region of the game world within which the sprite is restricted during mouse drag * A region of the game world within which the sprite is restricted during drag
* @default null * @default null
*/ */
this.boundsRect = null; this.boundsRect = null;
/** /**
* An FlxSprite the bounds of which this sprite is restricted during mouse drag * An Sprite the bounds of which this sprite is restricted during drag
* @default null * @default null
*/ */
this.boundsSprite = null; this.boundsSprite = null;
/**
* The x coordinate of the Input pointer, relative to the top-left of the parent Sprite.
* This value is only set with the pointer is over this Sprite.
* @type {number}
*/
this.x = 0;
/**
* The y coordinate of the Input pointer, relative to the top-left of the parent Sprite
* This value is only set with the pointer is over this Sprite.
* @type {number}
*/
this.y = 0;
/**
* If the Pointer is touching the touchscreen, or the mouse button is held down, isDown is set to true
* @property isDown
* @type {Boolean}
**/
this.isDown = false;
/**
* If the Pointer is not touching the touchscreen, or the mouse button is up, isUp is set to true
* @property isUp
* @type {Boolean}
**/
this.isUp = true;
/**
* A timestamp representing when the Pointer first touched the touchscreen.
* @property timeDown
* @type {Number}
**/
this.timeOver = 0;
/**
* A timestamp representing when the Pointer left the touchscreen.
* @property timeUp
* @type {Number}
**/
this.timeOut = 0;
/**
* Is the Pointer over this Sprite
* @property isOver
* @type {Boolean}
**/
this.isOver = false;
/**
* Is the Pointer outside of this Sprite
* @property isOut
* @type {Boolean}
**/
this.isOut = true;
this.game = parent.game; this.game = parent.game;
this._sprite = parent; this._sprite = parent;
this.enabled = false; this.enabled = false;
this.checkBody = false;
this.useHandCursor = false;
} }
Input.prototype.start = function (priority, checkBody, useHandCursor) {
if (typeof priority === "undefined") { priority = 0; }
if (typeof checkBody === "undefined") { checkBody = false; }
if (typeof useHandCursor === "undefined") { useHandCursor = false; }
// Turning on
if(this.enabled) {
return;
} else {
// Register, etc
this.checkBody = checkBody;
this.useHandCursor = useHandCursor;
this._pointerData = [];
for(var i = 0; i < 10; i++) {
this._pointerData.push({
id: i,
x: 0,
y: 0,
isDown: false,
isUp: false,
isOver: false,
isOut: false,
timeOver: 0,
timeOut: 0,
timeDown: 0,
timeUp: 0,
downDuration: 0,
isDragged: false
});
}
this.snapOffset = new Phaser.Point();
this.enabled = true;
this.game.input.addGameObject(this._sprite);
}
};
Input.prototype.stop = function () {
// Turning off
if(this.enabled == false) {
return;
} else {
// De-register, etc
this.enabled = false;
this.game.input.removeGameObject(this._sprite);
}
};
Input.prototype.pointerX = /**
* The x coordinate of the Input pointer, relative to the top-left of the parent Sprite.
* This value is only set when the pointer is over this Sprite.
* @type {number}
*/
function (pointer) {
if (typeof pointer === "undefined") { pointer = 0; }
return this._pointerData[pointer].x;
};
Input.prototype.pointerY = /**
* The y coordinate of the Input pointer, relative to the top-left of the parent Sprite
* This value is only set when the pointer is over this Sprite.
* @type {number}
*/
function (pointer) {
if (typeof pointer === "undefined") { pointer = 0; }
return this._pointerData[pointer].y;
};
Input.prototype.pointerDown = /**
* If the Pointer is touching the touchscreen, or the mouse button is held down, isDown is set to true
* @property isDown
* @type {Boolean}
**/
function (pointer) {
if (typeof pointer === "undefined") { pointer = 0; }
return this._pointerData[pointer].isDown;
};
Input.prototype.pointerUp = /**
* If the Pointer is not touching the touchscreen, or the mouse button is up, isUp is set to true
* @property isUp
* @type {Boolean}
**/
function (pointer) {
if (typeof pointer === "undefined") { pointer = 0; }
return this._pointerData[pointer].isUp;
};
Input.prototype.pointerTimeDown = /**
* A timestamp representing when the Pointer first touched the touchscreen.
* @property timeDown
* @type {Number}
**/
function (pointer) {
if (typeof pointer === "undefined") { pointer = 0; }
return this._pointerData[pointer].timeDown;
};
Input.prototype.pointerTimeUp = /**
* A timestamp representing when the Pointer left the touchscreen.
* @property timeUp
* @type {Number}
**/
function (pointer) {
if (typeof pointer === "undefined") { pointer = 0; }
return this._pointerData[pointer].timeUp;
};
Input.prototype.pointerOver = /**
* Is the Pointer over this Sprite
* @property isOver
* @type {Boolean}
**/
function (pointer) {
if (typeof pointer === "undefined") { pointer = 0; }
return this._pointerData[pointer].isOver;
};
Input.prototype.pointerOut = /**
* Is the Pointer outside of this Sprite
* @property isOut
* @type {Boolean}
**/
function (pointer) {
if (typeof pointer === "undefined") { pointer = 0; }
return this._pointerData[pointer].isOut;
};
Input.prototype.pointerTimeOver = /**
* A timestamp representing when the Pointer first touched the touchscreen.
* @property timeDown
* @type {Number}
**/
function (pointer) {
if (typeof pointer === "undefined") { pointer = 0; }
return this._pointerData[pointer].timeOver;
};
Input.prototype.pointerTimeOut = /**
* A timestamp representing when the Pointer left the touchscreen.
* @property timeUp
* @type {Number}
**/
function (pointer) {
if (typeof pointer === "undefined") { pointer = 0; }
return this._pointerData[pointer].timeOut;
};
Input.prototype.pointerDragged = /**
* Is this sprite being dragged by the mouse or not?
* @default false
*/
function (pointer) {
if (typeof pointer === "undefined") { pointer = 0; }
return this._pointerData[pointer].isDragged;
};
Input.prototype.update = /** Input.prototype.update = /**
* Update * Update
*/ */
function () { function (pointer) {
if(this.enabled == false) { if(this.enabled == false) {
return; return;
} }
if(this.draggable && this.isDragged) { // If was previously touched by this Pointer, check if still is
this.updateDrag(); if(this._pointerData[pointer.id].isDown && pointer.isUp) {
this._releasedHandler(pointer);
} }
if(this.game.input.x != this.oldX || this.game.input.y != this.oldY) { if(this.draggable && this._pointerData[pointer.id].isDragged) {
this.oldX = this.game.input.x; this.updateDrag(pointer);
this.oldY = this.game.input.y; //return;
if(Phaser.RectangleUtils.contains(this._sprite.frameBounds, this.game.input.x, this.game.input.y)) { }
this.x = this.game.input.x - this._sprite.x; if(Phaser.RectangleUtils.contains(this._sprite.frameBounds, pointer.x, pointer.y)) {
this.y = this.game.input.y - this._sprite.y; // { id: i, x: 0, y: 0, isDown: false, isUp: false, isOver: false, isOut: false, timeOver: 0, timeOut: 0, isDragged: false }
if(this.isOver == false) { this._pointerData[pointer.id].x = pointer.x - this._sprite.x;
this.isOver = true; this._pointerData[pointer.id].y = pointer.y - this._sprite.y;
this.isOut = false; if(this._pointerData[pointer.id].isOver == false) {
this.timeOver = this.game.time.now; this._pointerData[pointer.id].isOver = true;
if(this.useHandCursor) { this._pointerData[pointer.id].isOut = false;
this._sprite.game.stage.canvas.style.cursor = "pointer"; this._pointerData[pointer.id].timeOver = this.game.time.now;
} if(this.useHandCursor && this._pointerData[pointer.id].isDragged == false) {
this._sprite.events.onInputOver.dispatch(this._sprite, this.x, this.y, this.timeOver); this.game.stage.canvas.style.cursor = "pointer";
} }
} else { this._sprite.events.onInputOver.dispatch(this._sprite, pointer);
if(this.isOver) { }
this.isOver = false; } else {
this.isOut = true; if(this._pointerData[pointer.id].isOver) {
this.timeOut = this.game.time.now; this._pointerData[pointer.id].isOver = false;
if(this.useHandCursor) { this._pointerData[pointer.id].isOut = true;
this._sprite.game.stage.canvas.style.cursor = "default"; this._pointerData[pointer.id].timeOut = this.game.time.now;
} if(this.useHandCursor && this._pointerData[pointer.id].isDragged == false) {
this._sprite.events.onInputOut.dispatch(this._sprite, this.timeOut); this.game.stage.canvas.style.cursor = "default";
} }
this._sprite.events.onInputOut.dispatch(this._sprite, pointer);
} }
} }
}; };
Input.prototype._touchedHandler = function (pointer) {
this._pointerData[pointer.id].isDown = true;
this._pointerData[pointer.id].isUp = false;
this._pointerData[pointer.id].timeDown = this.game.time.now;
this._sprite.events.onInputDown.dispatch(this._sprite, pointer);
};
Input.prototype._releasedHandler = function (pointer) {
this._pointerData[pointer.id].isDown = false;
this._pointerData[pointer.id].isUp = true;
this._pointerData[pointer.id].timeUp = this.game.time.now;
//this._pointerData[pointer.id].downDuration = this._pointerData[pointer.id].timeUp - this._pointerData[pointer.id].timeDown;
this._sprite.events.onInputDown.dispatch(this._sprite, pointer);
};
Input.prototype.updateDrag = /** Input.prototype.updateDrag = /**
* Updates the Mouse Drag on this Sprite. * Updates the Pointer drag on this Sprite.
*/ */
function () { function (pointer) {
if(this.isUp) { if(pointer.isUp) {
this.stopDrag(); this.stopDrag(pointer);
return; return;
} }
// something wrong here, should use _dragPoint as well I think somehow
if(this.allowHorizontalDrag) { if(this.allowHorizontalDrag) {
this._sprite.x = this.game.input.x - this.dragOffsetX; this._sprite.x = pointer.x - this.dragOffset.x;
} }
if(this.allowVerticalDrag) { if(this.allowVerticalDrag) {
this._sprite.y = this.game.input.y - this.dragOffsetY; this._sprite.y = pointer.y - this.dragOffset.y;
} }
if(this.boundsRect) { if(this.boundsRect) {
this.checkBoundsRect(); this.checkBoundsRect();
@ -5726,37 +5835,67 @@ var Phaser;
* @param delay The time below which the pointer is considered as just over. * @param delay The time below which the pointer is considered as just over.
* @returns {boolean} * @returns {boolean}
*/ */
function (delay) { function (pointer, delay) {
if (typeof pointer === "undefined") { pointer = 0; }
if (typeof delay === "undefined") { delay = 500; } if (typeof delay === "undefined") { delay = 500; }
return (this.isOver && this.duration < delay); return (this._pointerData[pointer].isOver && this.overDuration(pointer) < delay);
}; };
Input.prototype.justOut = /** Input.prototype.justOut = /**
* Returns true if the pointer has left the Sprite within the specified delay time (defaults to 500ms, half a second) * Returns true if the pointer has left the Sprite within the specified delay time (defaults to 500ms, half a second)
* @param delay The time below which the pointer is considered as just out. * @param delay The time below which the pointer is considered as just out.
* @returns {boolean} * @returns {boolean}
*/ */
function (delay) { function (pointer, delay) {
if (typeof pointer === "undefined") { pointer = 0; }
if (typeof delay === "undefined") { delay = 500; } if (typeof delay === "undefined") { delay = 500; }
return (this.isOut && (this.game.time.now - this.timeOut < delay)); return (this._pointerData[pointer].isOut && (this.game.time.now - this._pointerData[pointer].timeOut < delay));
};
Input.prototype.justPressed = /**
* Returns true if the pointer has entered the Sprite within the specified delay time (defaults to 500ms, half a second)
* @param delay The time below which the pointer is considered as just over.
* @returns {boolean}
*/
function (pointer, delay) {
if (typeof pointer === "undefined") { pointer = 0; }
if (typeof delay === "undefined") { delay = 500; }
return (this._pointerData[pointer].isDown && this.downDuration(pointer) < delay);
};
Input.prototype.justReleased = /**
* Returns true if the pointer has left the Sprite within the specified delay time (defaults to 500ms, half a second)
* @param delay The time below which the pointer is considered as just out.
* @returns {boolean}
*/
function (pointer, delay) {
if (typeof pointer === "undefined") { pointer = 0; }
if (typeof delay === "undefined") { delay = 500; }
return (this._pointerData[pointer].isUp && (this.game.time.now - this._pointerData[pointer].timeUp < delay));
};
Input.prototype.overDuration = /**
* If the pointer is currently over this Sprite this returns how long it has been there for in milliseconds.
* @returns {number} The number of milliseconds the pointer has been over the Sprite, or -1 if not over.
*/
function (pointer) {
if (typeof pointer === "undefined") { pointer = 0; }
if(this._pointerData[pointer].isOver) {
return this.game.time.now - this._pointerData[pointer].timeOver;
}
return -1;
};
Input.prototype.downDuration = /**
* If the pointer is currently over this Sprite this returns how long it has been there for in milliseconds.
* @returns {number} The number of milliseconds the pointer has been pressed down on the Sprite, or -1 if not over.
*/
function (pointer) {
if (typeof pointer === "undefined") { pointer = 0; }
if(this._pointerData[pointer].isDown) {
return this.game.time.now - this._pointerData[pointer].timeDown;
}
return -1;
}; };
Object.defineProperty(Input.prototype, "duration", {
get: /**
* If the pointer is currently over this Sprite this returns how long it has been there for in milliseconds.
* @returns {number} The number of milliseconds the pointer has been over the Sprite, or -1 if not over.
*/
function () {
if(this.isOver) {
return this.game.time.now - this.timeOver;
}
return -1;
},
enumerable: true,
configurable: true
});
Input.prototype.enableDrag = /** Input.prototype.enableDrag = /**
* Make this Sprite draggable by the mouse. You can also optionally set mouseStartDragCallback and mouseStopDragCallback * Make this Sprite draggable by the mouse. You can also optionally set mouseStartDragCallback and mouseStopDragCallback
* *
* @param lockCenter If false the Sprite will drag from where you click it. If true it will center itself to the tip of the mouse pointer. * @param lockCenter If false the Sprite will drag from where you click it minus the dragOffset. If true it will center itself to the tip of the mouse pointer.
* @param pixelPerfect If true it will use a pixel perfect test to see if you clicked the Sprite. False uses the bounding box. * @param pixelPerfect If true it will use a pixel perfect test to see if you clicked the Sprite. False uses the bounding box.
* @param alphaThreshold If using pixel perfect collision this specifies the alpha level from 0 to 255 above which a collision is processed (default 255) * @param alphaThreshold If using pixel perfect collision this specifies the alpha level from 0 to 255 above which a collision is processed (default 255)
* @param boundsRect If you want to restrict the drag of this sprite to a specific FlxRect, pass the FlxRect here, otherwise it's free to drag anywhere * @param boundsRect If you want to restrict the drag of this sprite to a specific FlxRect, pass the FlxRect here, otherwise it's free to drag anywhere
@ -5768,8 +5907,10 @@ var Phaser;
if (typeof alphaThreshold === "undefined") { alphaThreshold = 255; } if (typeof alphaThreshold === "undefined") { alphaThreshold = 255; }
if (typeof boundsRect === "undefined") { boundsRect = null; } if (typeof boundsRect === "undefined") { boundsRect = null; }
if (typeof boundsSprite === "undefined") { boundsSprite = null; } if (typeof boundsSprite === "undefined") { boundsSprite = null; }
this._dragPoint = new Phaser.Point();
this.draggable = true; this.draggable = true;
this.dragFromPoint = lockCenter; this.dragOffset = new Phaser.Point();
this.dragFromCenter = lockCenter;
this.dragPixelPerfect = pixelPerfect; this.dragPixelPerfect = pixelPerfect;
this.dragPixelPerfectAlpha = alphaThreshold; this.dragPixelPerfectAlpha = alphaThreshold;
if(boundsRect) { if(boundsRect) {
@ -5783,15 +5924,36 @@ var Phaser;
* Stops this sprite from being able to be dragged. If it is currently the target of an active drag it will be stopped immediately. Also disables any set callbacks. * Stops this sprite from being able to be dragged. If it is currently the target of an active drag it will be stopped immediately. Also disables any set callbacks.
*/ */
function () { function () {
if(this.isDragged) { if(this._pointerData) {
//FlxMouseControl.dragTarget = null; for(var i = 0; i < 10; i++) {
//FlxMouseControl.isDragging = false; this._pointerData[i].isDragged = false;
} }
this.isDragged = false; }
this.draggable = false; this.draggable = false;
//mouseStartDragCallback = null; //mouseStartDragCallback = null;
//mouseStopDragCallback = null; //mouseStopDragCallback = null;
}; };
Input.prototype.startDrag = /**
* Called by Pointer when drag starts on this Sprite. Should not usually be called directly.
*/
function (pointer) {
this._pointerData[pointer.id].isDragged = true;
if(this.dragFromCenter) {
// Move the sprite to the middle of the pointer
this.dragOffset.setTo(this._sprite.frameBounds.halfWidth, this._sprite.frameBounds.halfHeight);
}
this._dragPoint.setTo(pointer.x - this._sprite.x - this.dragOffset.x, pointer.y - this._sprite.y - this.dragOffset.y);
};
Input.prototype.stopDrag = /**
* Called by Pointer when drag is stopped on this Sprite. Should not usually be called directly.
*/
function (pointer) {
this._pointerData[pointer.id].isDragged = false;
if(this.snapOnRelease) {
this._sprite.x = Math.floor(this._sprite.x / this.snapX) * this.snapX;
this._sprite.y = Math.floor(this._sprite.y / this.snapY) * this.snapY;
}
};
Input.prototype.setDragLock = /** Input.prototype.setDragLock = /**
* Restricts this sprite to drag movement only on the given axis. Note: If both are set to false the sprite will never move! * Restricts this sprite to drag movement only on the given axis. Note: If both are set to false the sprite will never move!
* *
@ -5828,20 +5990,6 @@ var Phaser;
this.snapOnDrag = false; this.snapOnDrag = false;
this.snapOnRelease = false; this.snapOnRelease = false;
}; };
Input.prototype.startDrag = /**
* Called by FlxMouseControl when Mouse Drag starts on this Sprite. Should not usually be called directly.
*/
function () {
this.isDragged = true;
if(this.dragFromPoint == false) {
this.dragOffsetX = this.game.input.x - this._sprite.x;
this.dragOffsetY = this.game.input.y - this._sprite.y;
} else {
// Move the sprite to the middle of the mouse
this.dragOffsetX = this._sprite.frameBounds.halfWidth;
this.dragOffsetY = this._sprite.frameBounds.halfHeight;
}
};
Input.prototype.checkBoundsRect = /** Input.prototype.checkBoundsRect = /**
* Bounds Rect check for the sprite drag * Bounds Rect check for the sprite drag
*/ */
@ -5872,16 +6020,6 @@ var Phaser;
this._sprite.y = (this.boundsSprite.y + this.boundsSprite.height) - this._sprite.height; this._sprite.y = (this.boundsSprite.y + this.boundsSprite.height) - this._sprite.height;
} }
}; };
Input.prototype.stopDrag = /**
* Called by FlxMouseControl when Mouse Drag is stopped on this Sprite. Should not usually be called directly.
*/
function () {
this.isDragged = false;
if(this.snapOnRelease) {
this._sprite.x = Math.floor(this._sprite.x / this.snapX) * this.snapX;
this._sprite.y = Math.floor(this._sprite.y / this.snapY) * this.snapY;
}
};
Input.prototype.renderDebugInfo = /** Input.prototype.renderDebugInfo = /**
* Render debug infos. (including name, bounds info, position and some other properties) * Render debug infos. (including name, bounds info, position and some other properties)
* @param x {number} X position of the debug info to be rendered. * @param x {number} X position of the debug info to be rendered.
@ -5893,9 +6031,10 @@ var Phaser;
this._sprite.texture.context.font = '14px Courier'; this._sprite.texture.context.font = '14px Courier';
this._sprite.texture.context.fillStyle = color; this._sprite.texture.context.fillStyle = color;
this._sprite.texture.context.fillText('Sprite Input: (' + this._sprite.frameBounds.width + ' x ' + this._sprite.frameBounds.height + ')', x, y); this._sprite.texture.context.fillText('Sprite Input: (' + this._sprite.frameBounds.width + ' x ' + this._sprite.frameBounds.height + ')', x, y);
this._sprite.texture.context.fillText('x: ' + this.x.toFixed(1) + ' y: ' + this.y.toFixed(1), x, y + 14); this._sprite.texture.context.fillText('x: ' + this.pointerX().toFixed(1) + ' y: ' + this.pointerY().toFixed(1), x, y + 14);
this._sprite.texture.context.fillText('over: ' + this.isOver + ' duration: ' + this.duration.toFixed(0), x, y + 28); this._sprite.texture.context.fillText('over: ' + this.pointerOver() + ' duration: ' + this.overDuration().toFixed(0), x, y + 28);
this._sprite.texture.context.fillText('just over: ' + this.justOver() + ' just out: ' + this.justOut(), x, y + 42); this._sprite.texture.context.fillText('down: ' + this.pointerDown() + ' duration: ' + this.downDuration().toFixed(0), x, y + 42);
this._sprite.texture.context.fillText('just over: ' + this.justOver() + ' just out: ' + this.justOut(), x, y + 56);
}; };
return Input; return Input;
})(); })();
@ -6624,7 +6763,6 @@ var Phaser;
} }
} }
*/ */
this.input.update();
if(this.modified == true && this.scale.equals(1) && this.skew.equals(0) && this.angle == 0 && this.angleOffset == 0 && this.texture.flippedX == false && this.texture.flippedY == false) { if(this.modified == true && this.scale.equals(1) && this.skew.equals(0) && this.angle == 0 && this.angleOffset == 0 && this.texture.flippedX == false && this.texture.flippedY == false) {
this.modified = false; this.modified = false;
} }
@ -13280,7 +13418,7 @@ var Phaser;
* @type {Number} * @type {Number}
**/ **/
this.totalTouches = 0; this.totalTouches = 0;
this._game = game; this.game = game;
this.id = id; this.id = id;
this.active = false; this.active = false;
this.position = new Phaser.Vec2(); this.position = new Phaser.Vec2();
@ -13300,7 +13438,7 @@ var Phaser;
if(this.isUp) { if(this.isUp) {
return -1; return -1;
} }
return this._game.time.now - this.timeDown; return this.game.time.now - this.timeDown;
}, },
enumerable: true, enumerable: true,
configurable: true configurable: true
@ -13310,7 +13448,7 @@ var Phaser;
* @param {Camera} [camera] * @param {Camera} [camera]
*/ */
function (camera) { function (camera) {
if (typeof camera === "undefined") { camera = this._game.camera; } if (typeof camera === "undefined") { camera = this.game.camera; }
return camera.worldView.x + this.x; return camera.worldView.x + this.x;
}; };
Pointer.prototype.getWorldY = /** Pointer.prototype.getWorldY = /**
@ -13318,7 +13456,7 @@ var Phaser;
* @param {Camera} [camera] * @param {Camera} [camera]
*/ */
function (camera) { function (camera) {
if (typeof camera === "undefined") { camera = this._game.camera; } if (typeof camera === "undefined") { camera = this.game.camera; }
return camera.worldView.y + this.y; return camera.worldView.y + this.y;
}; };
Pointer.prototype.start = /** Pointer.prototype.start = /**
@ -13333,8 +13471,8 @@ var Phaser;
this.button = event.button; this.button = event.button;
} }
// Fix to stop rogue browser plugins from blocking the visibility state event // Fix to stop rogue browser plugins from blocking the visibility state event
if(this._game.paused == true) { if(this.game.paused == true) {
this._game.stage.resumeGame(); this.game.stage.resumeGame();
return this; return this;
} }
this._history.length = 0; this._history.length = 0;
@ -13344,38 +13482,57 @@ var Phaser;
this.withinGame = true; this.withinGame = true;
this.isDown = true; this.isDown = true;
this.isUp = false; this.isUp = false;
this.timeDown = this._game.time.now; this.timeDown = this.game.time.now;
this._holdSent = false; this._holdSent = false;
if(this._game.input.multiInputOverride == Phaser.Input.MOUSE_OVERRIDES_TOUCH || this._game.input.multiInputOverride == Phaser.Input.MOUSE_TOUCH_COMBINE || (this._game.input.multiInputOverride == Phaser.Input.TOUCH_OVERRIDES_MOUSE && this._game.input.currentPointers == 0)) { if(this.game.input.multiInputOverride == Phaser.Input.MOUSE_OVERRIDES_TOUCH || this.game.input.multiInputOverride == Phaser.Input.MOUSE_TOUCH_COMBINE || (this.game.input.multiInputOverride == Phaser.Input.TOUCH_OVERRIDES_MOUSE && this.game.input.currentPointers == 0)) {
this._game.input.x = this.x * this._game.input.scaleX; this.game.input.x = this.x * this.game.input.scaleX;
this._game.input.y = this.y * this._game.input.scaleY; this.game.input.y = this.y * this.game.input.scaleY;
this._game.input.onDown.dispatch(this); this.game.input.onDown.dispatch(this);
} }
this.totalTouches++; this.totalTouches++;
if(this.isMouse == false) { if(this.isMouse == false) {
this._game.input.currentPointers++; this.game.input.currentPointers++;
} }
return this; return this;
}; };
Pointer.prototype.update = function () { Pointer.prototype.update = function () {
if(this.active) { if(this.active) {
if(this._holdSent == false && this.duration >= this._game.input.holdRate) { if(this._holdSent == false && this.duration >= this.game.input.holdRate) {
if(this._game.input.multiInputOverride == Phaser.Input.MOUSE_OVERRIDES_TOUCH || this._game.input.multiInputOverride == Phaser.Input.MOUSE_TOUCH_COMBINE || (this._game.input.multiInputOverride == Phaser.Input.TOUCH_OVERRIDES_MOUSE && this._game.input.currentPointers == 0)) { if(this.game.input.multiInputOverride == Phaser.Input.MOUSE_OVERRIDES_TOUCH || this.game.input.multiInputOverride == Phaser.Input.MOUSE_TOUCH_COMBINE || (this.game.input.multiInputOverride == Phaser.Input.TOUCH_OVERRIDES_MOUSE && this.game.input.currentPointers == 0)) {
this._game.input.onHold.dispatch(this); this.game.input.onHold.dispatch(this);
} }
this._holdSent = true; this._holdSent = true;
} }
// Update the droppings history // Update the droppings history
if(this._game.input.recordPointerHistory && this._game.time.now >= this._nextDrop) { if(this.game.input.recordPointerHistory && this.game.time.now >= this._nextDrop) {
this._nextDrop = this._game.time.now + this._game.input.recordRate; this._nextDrop = this.game.time.now + this.game.input.recordRate;
this._history.push({ this._history.push({
x: this.position.x, x: this.position.x,
y: this.position.y y: this.position.y
}); });
if(this._history.length > this._game.input.recordLimit) { if(this._history.length > this.game.input.recordLimit) {
this._history.shift(); this._history.shift();
} }
} }
// Iterate through the tracked objects
// Build our temporary click stack
var _highestPriority = 0;
for(var i = 0; i < this.game.input.totalTrackedObjects; i++) {
if(this.game.input.inputObjects[i].input.enabled) {
this.game.input.inputObjects[i].input.update(this);
if(this.game.input.inputObjects[i].input.priorityID > _highestPriority) {
_highestPriority = this.game.input.inputObjects[i].input.priorityID;
}
}
}
if(this.isDown) {
// Now update all objects with the highest priority ID (can be more than 1)
for(var i = 0; i < this.game.input.totalTrackedObjects; i++) {
if(this.game.input.inputObjects[i].input.priorityID == _highestPriority) {
this.game.input.inputObjects[i].input._touchedHandler(this);
}
}
}
} }
}; };
Pointer.prototype.move = /** Pointer.prototype.move = /**
@ -13393,17 +13550,17 @@ var Phaser;
this.pageY = event.pageY; this.pageY = event.pageY;
this.screenX = event.screenX; this.screenX = event.screenX;
this.screenY = event.screenY; this.screenY = event.screenY;
this.x = this.pageX - this._game.stage.offset.x; this.x = this.pageX - this.game.stage.offset.x;
this.y = this.pageY - this._game.stage.offset.y; this.y = this.pageY - this.game.stage.offset.y;
this.position.setTo(this.x, this.y); this.position.setTo(this.x, this.y);
this.circle.x = this.x; this.circle.x = this.x;
this.circle.y = this.y; this.circle.y = this.y;
if(this._game.input.multiInputOverride == Phaser.Input.MOUSE_OVERRIDES_TOUCH || this._game.input.multiInputOverride == Phaser.Input.MOUSE_TOUCH_COMBINE || (this._game.input.multiInputOverride == Phaser.Input.TOUCH_OVERRIDES_MOUSE && this._game.input.currentPointers == 0)) { if(this.game.input.multiInputOverride == Phaser.Input.MOUSE_OVERRIDES_TOUCH || this.game.input.multiInputOverride == Phaser.Input.MOUSE_TOUCH_COMBINE || (this.game.input.multiInputOverride == Phaser.Input.TOUCH_OVERRIDES_MOUSE && this.game.input.currentPointers == 0)) {
this._game.input.x = this.x * this._game.input.scaleX; this.game.input.x = this.x * this.game.input.scaleX;
this._game.input.y = this.y * this._game.input.scaleY; this.game.input.y = this.y * this.game.input.scaleY;
this._game.input.position.setTo(this._game.input.x, this._game.input.y); this.game.input.position.setTo(this.game.input.x, this.game.input.y);
this._game.input.circle.x = this._game.input.x; this.game.input.circle.x = this.game.input.x;
this._game.input.circle.y = this._game.input.y; this.game.input.circle.y = this.game.input.y;
} }
return this; return this;
}; };
@ -13422,28 +13579,31 @@ var Phaser;
* @param {Any} event * @param {Any} event
*/ */
function (event) { function (event) {
this.timeUp = this._game.time.now; this.timeUp = this.game.time.now;
if(this._game.input.multiInputOverride == Phaser.Input.MOUSE_OVERRIDES_TOUCH || this._game.input.multiInputOverride == Phaser.Input.MOUSE_TOUCH_COMBINE || (this._game.input.multiInputOverride == Phaser.Input.TOUCH_OVERRIDES_MOUSE && this._game.input.currentPointers == 0)) { if(this.game.input.multiInputOverride == Phaser.Input.MOUSE_OVERRIDES_TOUCH || this.game.input.multiInputOverride == Phaser.Input.MOUSE_TOUCH_COMBINE || (this.game.input.multiInputOverride == Phaser.Input.TOUCH_OVERRIDES_MOUSE && this.game.input.currentPointers == 0)) {
this._game.input.onUp.dispatch(this); this.game.input.onUp.dispatch(this);
// Was it a tap? // Was it a tap?
if(this.duration >= 0 && this.duration <= this._game.input.tapRate) { if(this.duration >= 0 && this.duration <= this.game.input.tapRate) {
// Was it a double-tap? // Was it a double-tap?
if(this.timeUp - this.previousTapTime < this._game.input.doubleTapRate) { if(this.timeUp - this.previousTapTime < this.game.input.doubleTapRate) {
// Yes, let's dispatch the signal then with the 2nd parameter set to true // Yes, let's dispatch the signal then with the 2nd parameter set to true
this._game.input.onTap.dispatch(this, true); this.game.input.onTap.dispatch(this, true);
} else { } else {
// Wasn't a double-tap, so dispatch a single tap signal // Wasn't a double-tap, so dispatch a single tap signal
this._game.input.onTap.dispatch(this, false); this.game.input.onTap.dispatch(this, false);
} }
this.previousTapTime = this.timeUp; this.previousTapTime = this.timeUp;
} }
} }
this.active = false; // Mouse is always active
if(this.id > 0) {
this.active = false;
}
this.withinGame = false; this.withinGame = false;
this.isDown = false; this.isDown = false;
this.isUp = true; this.isUp = true;
if(this.isMouse == false) { if(this.isMouse == false) {
this._game.input.currentPointers--; this.game.input.currentPointers--;
} }
return this; return this;
}; };
@ -13454,8 +13614,8 @@ var Phaser;
* @return {Boolean} * @return {Boolean}
*/ */
function (duration) { function (duration) {
if (typeof duration === "undefined") { duration = this._game.input.justPressedRate; } if (typeof duration === "undefined") { duration = this.game.input.justPressedRate; }
if(this.isDown === true && (this.timeDown + duration) > this._game.time.now) { if(this.isDown === true && (this.timeDown + duration) > this.game.time.now) {
return true; return true;
} else { } else {
return false; return false;
@ -13468,8 +13628,8 @@ var Phaser;
* @return {Boolean} * @return {Boolean}
*/ */
function (duration) { function (duration) {
if (typeof duration === "undefined") { duration = this._game.input.justReleasedRate; } if (typeof duration === "undefined") { duration = this.game.input.justReleasedRate; }
if(this.isUp === true && (this.timeUp + duration) > this._game.time.now) { if(this.isUp === true && (this.timeUp + duration) > this.game.time.now) {
return true; return true;
} else { } else {
return false; return false;
@ -13497,30 +13657,30 @@ var Phaser;
if(hideIfUp == true && this.isUp == true) { if(hideIfUp == true && this.isUp == true) {
return; return;
} }
this._game.stage.context.beginPath(); this.game.stage.context.beginPath();
this._game.stage.context.arc(this.x, this.y, this.circle.radius, 0, Math.PI * 2); this.game.stage.context.arc(this.x, this.y, this.circle.radius, 0, Math.PI * 2);
if(this.active) { if(this.active) {
this._game.stage.context.fillStyle = 'rgba(0,255,0,0.5)'; this.game.stage.context.fillStyle = 'rgba(0,255,0,0.5)';
this._game.stage.context.strokeStyle = 'rgb(0,255,0)'; this.game.stage.context.strokeStyle = 'rgb(0,255,0)';
} else { } else {
this._game.stage.context.fillStyle = 'rgba(255,0,0,0.5)'; this.game.stage.context.fillStyle = 'rgba(255,0,0,0.5)';
this._game.stage.context.strokeStyle = 'rgb(100,0,0)'; this.game.stage.context.strokeStyle = 'rgb(100,0,0)';
} }
this._game.stage.context.fill(); this.game.stage.context.fill();
this._game.stage.context.closePath(); this.game.stage.context.closePath();
// Render the points // Render the points
this._game.stage.context.beginPath(); this.game.stage.context.beginPath();
this._game.stage.context.moveTo(this.positionDown.x, this.positionDown.y); this.game.stage.context.moveTo(this.positionDown.x, this.positionDown.y);
this._game.stage.context.lineTo(this.position.x, this.position.y); this.game.stage.context.lineTo(this.position.x, this.position.y);
this._game.stage.context.lineWidth = 2; this.game.stage.context.lineWidth = 2;
this._game.stage.context.stroke(); this.game.stage.context.stroke();
this._game.stage.context.closePath(); this.game.stage.context.closePath();
// Render the text // Render the text
this._game.stage.context.fillStyle = 'rgb(255,255,255)'; this.game.stage.context.fillStyle = 'rgb(255,255,255)';
this._game.stage.context.font = 'Arial 16px'; this.game.stage.context.font = 'Arial 16px';
this._game.stage.context.fillText('ID: ' + this.id + " Active: " + this.active, this.x, this.y - 100); this.game.stage.context.fillText('ID: ' + this.id + " Active: " + this.active, this.x, this.y - 100);
this._game.stage.context.fillText('Screen X: ' + this.x + " Screen Y: " + this.y, this.x, this.y - 80); this.game.stage.context.fillText('Screen X: ' + this.x + " Screen Y: " + this.y, this.x, this.y - 80);
this._game.stage.context.fillText('Duration: ' + this.duration + " ms", this.x, this.y - 60); this.game.stage.context.fillText('Duration: ' + this.duration + " ms", this.x, this.y - 60);
}; };
Pointer.prototype.toString = /** Pointer.prototype.toString = /**
* Returns a string representation of this object. * Returns a string representation of this object.
@ -14329,6 +14489,8 @@ var Phaser;
* @type {Pointer} * @type {Pointer}
**/ **/
this.pointer10 = null; this.pointer10 = null;
this.inputObjects = [];
this.totalTrackedObjects = 0;
this._game = game; this._game = game;
this._stack = []; this._stack = [];
this.mousePointer = new Phaser.Pointer(this._game, 0); this.mousePointer = new Phaser.Pointer(this._game, 0);
@ -14426,12 +14588,24 @@ var Phaser;
this.touch.start(); this.touch.start();
this.mspointer.start(); this.mspointer.start();
this.gestures.start(); this.gestures.start();
this.mousePointer.active = true;
}; };
Input.prototype.addGameObject = // Add Input Enabled array + add/remove methods and then iterate and update them during the main update
// Clear down this array on State swap??? Maybe removed from it when Sprite is destroyed
function (object) {
// Lots more checks here
this.inputObjects.push(object);
this.totalTrackedObjects++;
};
Input.prototype.removeGameObject = function (object) {
// TODO
};
Input.prototype.update = /** Input.prototype.update = /**
* Updates the Input Manager. Called by the core Game loop. * Updates the Input Manager. Called by the core Game loop.
* @method update * @method update
**/ **/
function () { function () {
// Swap for velocity vector - and add it to Pointer?
this.speed.x = this.position.x - this._oldPosition.x; this.speed.x = this.position.x - this._oldPosition.x;
this.speed.y = this.position.y - this._oldPosition.y; this.speed.y = this.position.y - this._oldPosition.y;
this._oldPosition.copyFrom(this.position); this._oldPosition.copyFrom(this.position);