Skip to content

Commit 4c2df65

Browse files
committed
Large refactoring of the Input Manager
Split events out into Game Object and global Pointer ones. Removed redundant topOnly checks (as the source array is already filtered), removing use of 'childOn' functions. Normalizing event data.
1 parent 68cc768 commit 4c2df65

20 files changed

Lines changed: 310 additions & 78 deletions

v3/src/checksum.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
var CHECKSUM = {
2-
build: '9bfd8260-7070-11e7-a8ad-036eabaeebad'
2+
build: 'faf097c0-70c1-11e7-83f8-1fe1cff41d47'
33
};
44
module.exports = CHECKSUM;

v3/src/input/InteractiveObject.js

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,19 @@ var InteractiveObject = function (gameObject, hitArea, hitAreaCallback)
88
gameObject: gameObject,
99

1010
enabled: true,
11-
draggable: false,
11+
// draggable: false,
1212

1313
hitArea: hitArea,
1414
hitAreaCallback: hitAreaCallback,
1515

16-
localX: 0,
17-
localY: 0,
16+
localX: 0, // tempX value populated by HitTest function
17+
localY: 0, // tempY value populated by HitTest function
1818

19-
isOver: false,
20-
isDown: false,
21-
isDragged: false,
19+
// isOver: false,
20+
// isDown: false,
21+
// isDragged: false,
2222

23-
checkingDrag: false,
23+
// checkingDrag: false,
2424

2525
dragX: 0,
2626
dragY: 0,

v3/src/input/global/GlobalInputManager.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,8 @@ var GlobalInputManager = new Class({
8787
{
8888
var event = queue[i];
8989

90-
// Move to CONSTs so we can do integer comparisons instead of strings
90+
// TODO: Move to CONSTs so we can do integer comparisons instead of strings.
91+
// TODO: Remove the MouseEvent events. Devs should use Pointer events instead.
9192
switch (event.type)
9293
{
9394
case 'mousemove':

v3/src/input/local/SceneInputManager.js

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,15 @@ var SceneInputManager = new Class({
4949
// draggable: A list of all Interactive Objects that are set to be draggable (a subset of list)
5050
// over: A list of all Interactive Objects currently considered as being 'over' by any pointer, indexed by pointer ID
5151
// down: A list of all Interactive Objects currently considered as being 'down' by any pointer, indexed by pointer ID
52+
this.children = {
53+
size: 0,
54+
list: [],
55+
pendingInsertion: [],
56+
pendingRemoval: [],
57+
over: { 0: [], 1: [], 2: [], 3: [], 4: [], 5: [], 6: [], 7: [], 8: [], 9: [] }
58+
};
59+
60+
/*
5261
this.children = {
5362
size: 0,
5463
list: [],
@@ -58,6 +67,7 @@ var SceneInputManager = new Class({
5867
over: { 0: [], 1: [], 2: [], 3: [], 4: [], 5: [], 6: [], 7: [], 8: [], 9: [] },
5968
down: { 0: [], 1: [], 2: [], 3: [], 4: [], 5: [], 6: [], 7: [], 8: [], 9: [] }
6069
};
70+
*/
6171

6272
this._validTypes = [ 'onDown', 'onUp', 'onOver', 'onOut', 'onMove' ];
6373
},
@@ -99,10 +109,10 @@ var SceneInputManager = new Class({
99109
processDownEvents: require('./components/ProcessDownEvents'),
100110
processUpEvents: require('./components/ProcessUpEvents'),
101111
processMoveEvents: require('./components/ProcessMoveEvents'),
102-
childOnOut: require('./components/ChildOnOut'),
103-
childOnOver: require('./components/ChildOnOver'),
104-
childOnDown: require('./components/ChildOnDown'),
105-
childOnUp: require('./components/ChildOnUp'),
112+
// childOnOut: require('./components/ChildOnOut'),
113+
// childOnOver: require('./components/ChildOnOver'),
114+
// childOnDown: require('./components/ChildOnDown'),
115+
// childOnUp: require('./components/ChildOnUp'),
106116
sortInteractiveObjects: require('./components/SortInteractiveObjects'),
107117
sortIndexHandler: require('./components/SortIndexHandler'),
108118

v3/src/input/local/components/ProcessDownEvents.js

Lines changed: 7 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2,27 +2,16 @@ var InputEvent = require('../events');
22

33
var ProcessDownEvents = function (pointer, currentlyOver)
44
{
5-
if (currentlyOver.length === 0)
6-
{
7-
// Dispatch DOWN event, even though nothing was below the pointer
8-
this.events.dispatch(new InputEvent.DOWN(pointer));
9-
}
10-
else
11-
{
12-
// Go through all objects the pointer was over and set them to down
13-
for (var i = 0; i < currentlyOver.length; i++)
14-
{
15-
var interactiveObject = currentlyOver[i];
5+
this.events.dispatch(new InputEvent.POINTER_DOWN(pointer, currentlyOver));
166

17-
this.events.dispatch(new InputEvent.DOWN(pointer, interactiveObject.gameObject, currentlyOver));
7+
// Go through all objects the pointer was over and fire their events / callbacks
8+
for (var i = 0; i < currentlyOver.length; i++)
9+
{
10+
var interactiveObject = currentlyOver[i];
1811

19-
this.childOnDown(pointer, interactiveObject);
12+
this.events.dispatch(new InputEvent.GAME_OBJECT_DOWN(pointer, interactiveObject));
2013

21-
if (this.topOnly)
22-
{
23-
break;
24-
}
25-
}
14+
interactiveObject.onDown(interactiveObject.gameObject, pointer, interactiveObject.localX, interactiveObject.localY);
2615
}
2716
};
2817

v3/src/input/local/components/ProcessMoveEvents.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,20 @@ var InputEvent = require('../events');
22

33
var ProcessMoveEvents = function (pointer, currentlyOver)
44
{
5+
this.events.dispatch(new InputEvent.POINTER_MOVE(pointer, currentlyOver));
6+
7+
// Go through all objects the pointer was over and fire their events / callbacks
8+
for (var i = 0; i < currentlyOver.length; i++)
9+
{
10+
var interactiveObject = currentlyOver[i];
11+
12+
this.events.dispatch(new InputEvent.GAME_OBJECT_MOVE(pointer, interactiveObject));
13+
14+
interactiveObject.onMove(interactiveObject.gameObject, pointer, interactiveObject.localX, interactiveObject.localY);
15+
}
16+
17+
18+
/*
519
var i;
620
var interactiveObject;
721
@@ -49,6 +63,7 @@ var ProcessMoveEvents = function (pointer, currentlyOver)
4963
this.childOnDrag(pointer, interactiveObject, currentlyOver);
5064
}
5165
}
66+
*/
5267
};
5368

5469
module.exports = ProcessMoveEvents;

v3/src/input/local/components/ProcessOverOutEvents.js

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -49,17 +49,21 @@ var ProcessOverOutEvents = function (pointer, currentlyOver)
4949
{
5050
this.sortInteractiveObjects(justOut);
5151

52+
this.events.dispatch(new InputEvent.POINTER_OUT(pointer, justOut));
53+
5254
// Call onOut for everything in the justOut array
5355
for (i = 0; i < total; i++)
5456
{
5557
interactiveObject = justOut[i];
5658

57-
if (!this.topOnly || (this.topOnly && i === 0))
59+
this.events.dispatch(new InputEvent.GAME_OBJECT_OUT(pointer, interactiveObject));
60+
61+
interactiveObject.onOut(interactiveObject.gameObject, pointer);
62+
63+
if (this.topOnly)
5864
{
59-
this.events.dispatch(new InputEvent.OUT(pointer, interactiveObject.gameObject, justOut));
65+
break;
6066
}
61-
62-
this.childOnOut(i, pointer, interactiveObject);
6367
}
6468
}
6569

@@ -70,17 +74,21 @@ var ProcessOverOutEvents = function (pointer, currentlyOver)
7074
{
7175
this.sortInteractiveObjects(justOver);
7276

77+
this.events.dispatch(new InputEvent.POINTER_OVER(pointer, justOver));
78+
7379
// Call onOver for everything in the justOver array
7480
for (i = 0; i < total; i++)
7581
{
7682
interactiveObject = justOver[i];
7783

78-
if (!this.topOnly || (this.topOnly && i === 0))
84+
this.events.dispatch(new InputEvent.GAME_OBJECT_OVER(pointer, interactiveObject));
85+
86+
interactiveObject.onOver(interactiveObject.gameObject, pointer, interactiveObject.localX, interactiveObject.localY);
87+
88+
if (this.topOnly)
7989
{
80-
this.events.dispatch(new InputEvent.OVER(pointer, interactiveObject.gameObject, justOver));
90+
break;
8191
}
82-
83-
this.childOnOver(i, pointer, interactiveObject);
8492
}
8593
}
8694

v3/src/input/local/components/ProcessUpEvents.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,20 @@ var InputEvent = require('../events');
22

33
var ProcessUpEvents = function (pointer, currentlyOver)
44
{
5+
this.events.dispatch(new InputEvent.POINTER_UP(pointer, currentlyOver));
6+
7+
// Go through all objects the pointer was over and fire their events / callbacks
8+
for (var i = 0; i < currentlyOver.length; i++)
9+
{
10+
var interactiveObject = currentlyOver[i];
11+
12+
this.events.dispatch(new InputEvent.GAME_OBJECT_UP(pointer, interactiveObject));
13+
14+
interactiveObject.onUp(interactiveObject.gameObject, pointer, interactiveObject.localX, interactiveObject.localY);
15+
}
16+
17+
/*
18+
519
// If the pointer is released we need to reset all 'isDown' IOs, regardless if pointer is still over them or not
620
// Also concat in the currentlyOver, so we can dispatch an UP event for an IO that has the pointer over it.
721
// For example if you click down outside a sprite, hold down, move over the sprite, then release, the sprite will
@@ -58,6 +72,7 @@ var ProcessUpEvents = function (pointer, currentlyOver)
5872
this.childOnDrag(pointer, interactiveObject, currentlyOver);
5973
}
6074
}
75+
*/
6176

6277
};
6378

v3/src/input/local/components/Update.js

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,5 @@
11
var Update = function (time, delta)
22
{
3-
// If nothing is input enabled we can abort now
4-
if (this.children.size === 0)
5-
{
6-
return;
7-
}
8-
93
var pointer = this.manager.activePointer;
104

115
var runUpdate = (pointer.dirty || this.pollRate === 0);
@@ -25,13 +19,6 @@ var Update = function (time, delta)
2519

2620
if (runUpdate)
2721
{
28-
// Update Process:
29-
30-
// 1) Get all objects currently under the pointer
31-
// 2) Process Over and Out Events for both objects now under the pointer, and those that previously were
32-
// 3) Process Up and Down Events for new objects and old ones (i.e. pointer has moved outside object and then gone up)
33-
// 4) Process Movement Events
34-
3522
var results = this.hitTestPointer(pointer);
3623

3724
if (this.topOnly && results.length > 0)
@@ -43,7 +30,6 @@ var Update = function (time, delta)
4330
results = [ top ];
4431
}
4532

46-
// This is run regardless if the pointer has moved so we capture moving Game Objects
4733
this.processOverOutEvents(pointer, results);
4834

4935
if (pointer.justUp)
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
var Class = require('../../../utils/Class');
2+
var Event = require('../../../events/Event');
3+
4+
var GameObjectDownEvent = new Class({
5+
6+
Extends: Event,
7+
8+
initialize:
9+
10+
function GameObjectDownEvent (pointer, interactiveObject)
11+
{
12+
Event.call(this, 'GAME_OBJECT_DOWN_EVENT');
13+
14+
// The Pointer that triggered the event
15+
this.pointer = pointer;
16+
17+
// The native DOM event (MouseEvent, TouchEvent, etc)
18+
this.event = pointer.event;
19+
20+
// The button that was used. This is read directly from the DOM event.
21+
this.button = pointer.event.button;
22+
23+
// The Game Object the event occurred on
24+
this.gameObject = interactiveObject.gameObject;
25+
26+
// The local x/y coordinates of the event within the Game Object
27+
this.x = interactiveObject.localX;
28+
this.y = interactiveObject.localY;
29+
}
30+
31+
});
32+
33+
module.exports = GameObjectDownEvent;

0 commit comments

Comments
 (0)