Skip to content

Commit f98bbc1

Browse files
committed
Added the new Gamepad Input classes
1 parent e3334e5 commit f98bbc1

13 files changed

Lines changed: 372 additions & 3 deletions

File tree

v3/src/boot/Config.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ var Config = new Class({
5555
this.inputTouch = GetValue(config, 'input.touch', true);
5656
this.inputTouchEventTarget = GetValue(config, 'input.touch.target', null);
5757

58+
this.inputGamepad = GetValue(config, 'input.gamepad', true);
59+
5860
this.disableContextMenu = GetValue(config, 'disableContextMenu', false);
5961

6062
// If you do: { banner: false } it won't display any banner at all

v3/src/input/gamepad/Button.js

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
// Phaser.Input.Gamepad.Button
2+
3+
var Class = require('../../utils/Class');
4+
var GamepadEvent = require('./events/');
5+
6+
var Button = new Class({
7+
8+
initialize:
9+
10+
function Button (pad, index)
11+
{
12+
this.pad = pad;
13+
14+
this.events = pad.events;
15+
16+
this.index = index;
17+
18+
this.pressed = false;
19+
20+
this.value = 0;
21+
},
22+
23+
update: function (data)
24+
{
25+
if (data.pressed)
26+
{
27+
if (!this.pressed)
28+
{
29+
this.pressed = true;
30+
this.value = data.value;
31+
this.events.dispatch(new GamepadEvent.DOWN(this.pad, this, this.value, data));
32+
}
33+
}
34+
else
35+
{
36+
if (this.pressed)
37+
{
38+
this.pressed = false;
39+
this.value = data.value;
40+
this.events.dispatch(new GamepadEvent.UP(this.pad, this, this.value, data));
41+
}
42+
}
43+
}
44+
45+
});
46+
47+
module.exports = Button;

v3/src/input/gamepad/Gamepad.js

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
// Phaser.Input.Gamepad.Gamepad
2+
3+
var Button = require('./Button');
4+
var Class = require('../../utils/Class');
5+
var GamepadEvent = require('./events/');
6+
7+
var Gamepad = new Class({
8+
9+
initialize:
10+
11+
function Gamepad (manager, id, index)
12+
{
13+
this.manager = manager;
14+
15+
this.events = manager.events;
16+
17+
this.id = id;
18+
19+
this.index = index;
20+
21+
this.connected = true;
22+
23+
this.timestamp = 0;
24+
25+
this.buttons = [];
26+
},
27+
28+
update: function (data)
29+
{
30+
this.timestamp = data.timestamp;
31+
this.connected = data.connected;
32+
33+
// Buttons
34+
35+
for (var i = 0; i < data.buttons.length; i++)
36+
{
37+
var buttonData = data.buttons[i];
38+
39+
if (this.buttons[i] === undefined)
40+
{
41+
this.buttons[i] = new Button(this, i);
42+
}
43+
44+
this.buttons[i].update(buttonData);
45+
}
46+
47+
// TODO: Axes
48+
}
49+
50+
});
51+
52+
module.exports = Gamepad;
Lines changed: 170 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,170 @@
1+
// Phaser.Input.Gamepad.GamepadManager
2+
3+
var Class = require('../../utils/Class');
4+
var Gamepad = require('./Gamepad');
5+
var GamepadEvent = require('./events/');
6+
7+
// https://developer.mozilla.org/en-US/docs/Web/API/Gamepad_API
8+
// https://developer.mozilla.org/en-US/docs/Web/API/Gamepad_API/Using_the_Gamepad_API
9+
// https://www.smashingmagazine.com/2015/11/gamepad-api-in-web-games/
10+
11+
var GamepadManager = new Class({
12+
13+
initialize:
14+
15+
function GamepadManager (inputManager)
16+
{
17+
this.manager = inputManager;
18+
19+
this.events = inputManager.events;
20+
21+
this.enabled = false;
22+
23+
this.target;
24+
25+
this.handler;
26+
27+
this.gamepads = [];
28+
29+
// Standard FIFO queue
30+
this.queue = [];
31+
},
32+
33+
boot: function ()
34+
{
35+
var config = this.manager.config;
36+
37+
this.enabled = config.inputGamepad;
38+
39+
this.target = window;
40+
41+
if (this.enabled)
42+
{
43+
this.startListeners();
44+
}
45+
},
46+
47+
startListeners: function ()
48+
{
49+
var queue = this.queue;
50+
51+
var handler = function (event)
52+
{
53+
if (event.preventDefaulted)
54+
{
55+
// Do nothing if event already handled
56+
return;
57+
}
58+
59+
queue.push(event);
60+
};
61+
62+
this.handler = handler;
63+
64+
this.target.addEventListener('gamepadconnected', handler, false);
65+
this.target.addEventListener('gamepaddisconnected', handler, false);
66+
67+
// FF only for now:
68+
this.target.addEventListener('gamepadbuttondown', handler, false);
69+
this.target.addEventListener('gamepadbuttonup', handler, false);
70+
this.target.addEventListener('gamepadaxismove', handler, false);
71+
},
72+
73+
stopListeners: function ()
74+
{
75+
this.target.removeEventListener('gamepadconnected', this.handler);
76+
this.target.removeEventListener('gamepaddisconnected', this.handler);
77+
78+
this.target.removeEventListener('gamepadbuttondown', this.handler);
79+
this.target.removeEventListener('gamepadbuttonup', this.handler);
80+
this.target.removeEventListener('gamepadaxismove', this.handler);
81+
},
82+
83+
disconnectAll: function ()
84+
{
85+
for (var i = 0; i < this.gamepads.length; i++)
86+
{
87+
this.gamepads.connected = false;
88+
}
89+
},
90+
91+
addPad: function (pad)
92+
{
93+
var gamepad = new Gamepad(this, pad.id, pad.index);
94+
95+
this.gamepads[pad.index] = gamepad;
96+
97+
return gamepad;
98+
},
99+
100+
removePad: function (index, pad)
101+
{
102+
},
103+
104+
refreshPads: function (pads)
105+
{
106+
if (pads === null)
107+
{
108+
this.disconnectAll();
109+
}
110+
else
111+
{
112+
for (var i = 0; i < pads.length; i++)
113+
{
114+
var pad = pads[i];
115+
116+
if (pad === null)
117+
{
118+
// removePad?
119+
continue;
120+
}
121+
122+
if (this.gamepads[pad.index] === undefined)
123+
{
124+
this.addPad(pad);
125+
}
126+
127+
this.gamepads[pad.index].update(pad);
128+
}
129+
}
130+
},
131+
132+
update: function ()
133+
{
134+
if (!this.enabled)
135+
{
136+
return;
137+
}
138+
139+
this.refreshPads(navigator.getGamepads());
140+
141+
var len = this.queue.length;
142+
143+
if (len === 0)
144+
{
145+
return;
146+
}
147+
148+
var queue = this.queue.splice(0, len);
149+
150+
// Process the event queue, dispatching all of the events that have stored up
151+
for (var i = 0; i < len; i++)
152+
{
153+
var event = queue[i];
154+
155+
switch (event.type)
156+
{
157+
case 'gamepadconnected':
158+
// Event?
159+
break;
160+
161+
case 'gamepaddisconnected':
162+
// Event?
163+
break;
164+
}
165+
}
166+
}
167+
168+
});
169+
170+
module.exports = GamepadManager;
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
// Tatar SNES USB Controller
2+
// USB Gamepad (STANDARD GAMEPAD Vendor: 0079 Product: 0011)
3+
4+
module.exports = {
5+
6+
UP: 12,
7+
DOWN: 13,
8+
LEFT: 14,
9+
RIGHT: 15,
10+
11+
SELECT: 8,
12+
START: 9,
13+
14+
B: 0,
15+
A: 1,
16+
Y: 2,
17+
X: 3,
18+
19+
LEFT_SHOULDER: 4,
20+
RIGHT_SHOULDER: 5
21+
22+
};
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
// Phaser.Input.Gamepad.Configs
2+
3+
module.exports = {
4+
5+
SNES_USB: require('./SNES_USB_Controller')
6+
7+
};
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
var Class = require('../../../utils/Class');
2+
var Event = require('../../../events/Event');
3+
4+
var GamepadDownEvent = new Class({
5+
6+
Extends: Event,
7+
8+
initialize:
9+
10+
function GamepadDownEvent (gamepad, button, value, nativeEvent)
11+
{
12+
Event.call(this, 'GAMEPAD_DOWN_EVENT');
13+
14+
this.data = nativeEvent;
15+
16+
this.gamepad = gamepad;
17+
this.button = button;
18+
this.value = value;
19+
}
20+
21+
});
22+
23+
module.exports = GamepadDownEvent;
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
var Class = require('../../../utils/Class');
2+
var Event = require('../../../events/Event');
3+
4+
var GamepadUpEvent = new Class({
5+
6+
Extends: Event,
7+
8+
initialize:
9+
10+
function GamepadUpEvent (gamepad, button, value, nativeEvent)
11+
{
12+
Event.call(this, 'GAMEPAD_UP_EVENT');
13+
14+
this.data = nativeEvent;
15+
16+
this.gamepad = gamepad;
17+
this.button = button;
18+
this.value = value;
19+
}
20+
21+
});
22+
23+
module.exports = GamepadUpEvent;
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
// Phaser.Input.Gamepad.Events
2+
3+
module.exports = {
4+
DOWN: require('./GamepadDownEvent'),
5+
UP: require('./GamepadUpEvent')
6+
};

v3/src/input/gamepad/index.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
// Phaser.Input.Gamepad
2+
3+
module.exports = {
4+
5+
Button: require('./Button'),
6+
Gamepad: require('./Gamepad'),
7+
GamepadManager: require('./GamepadManager'),
8+
9+
Configs: require('./configs/')
10+
};

0 commit comments

Comments
 (0)