You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
55 lines
1.8 KiB
55 lines
1.8 KiB
# Gamepad HTML5 API |
|
class Gamepad |
|
constructor: (pad) -> |
|
@gamepad = pad |
|
@map = @detectMapping(pad.id, navigator.userAgent) |
|
@pressed = @getPressed() |
|
detectMapping: (id, browser) -> |
|
for map in salet.view.gamepadmappings |
|
for device in map.supported |
|
if id.indexOf(device.id) != -1 and browser.indexOf(device.browser) != -1 |
|
return map |
|
# mapping not found, return the first map for this browser |
|
for device in map.supported |
|
if browser.indexOf(device.browser) != -1 |
|
return map |
|
# browser and device are not supported, just return the first map |
|
console.warn "Browser and device are not found, gamepad support not guaranteed." |
|
return salet.view.gamepadmappings[0] |
|
axis: (name) -> |
|
map = @map.axes[name] |
|
unless map? |
|
return 0 |
|
if map.index? |
|
return @gamepad.axes[map.index] |
|
if map.buttonPositive? and @gamepad.buttons[map.buttonPositive].pressed |
|
return 1 |
|
if map.buttonNegative? and @gamepad.buttons[map.buttonNegative].pressed |
|
return -1 |
|
return 0 |
|
button: (name) -> |
|
map = @map.buttons[name] |
|
unless map? |
|
return 0 |
|
if map.index? and @gamepad.buttons[map.index]? |
|
return @gamepad.buttons[map.index].pressed |
|
if map.axis? |
|
if map.direction < 0 |
|
return @gamepad.axes[map.axis] < -0.75 |
|
else |
|
return @gamepad.axes[map.axis] > 0.75 |
|
return false |
|
# Return the name of the pressed button |
|
getPressed: () -> |
|
for buttonname, button of @map.buttons |
|
if ( |
|
@gamepad.buttons[button.index]? and |
|
@gamepad.buttons[button.index].pressed |
|
) or ( |
|
@gamepad.axes[button.axis] < -0.75 and |
|
button.direction < 0 |
|
) or ( |
|
@gamepad.axes[button.axis] > 0.75 and |
|
button.direction > 0 |
|
) |
|
return buttonname
|
|
|