Last active
August 29, 2015 13:56
-
-
Save bsparks/9044738 to your computer and use it in GitHub Desktop.
windows 8 xbox controller plugin for impact.js
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
ig.module('plugins.controller') | |
.requires('impact.system', 'impact.input') | |
.defines(function () { | |
// TODO: support 4 controllers | |
var controller = new GameController.Controller(0); | |
// extra keys for gamepad buttons (starting at -20 to support plusplus) | |
ig.KEY.GAMEPAD_A = -20; | |
ig.KEY.GAMEPAD_B = -21; | |
ig.KEY.GAMEPAD_X = -22; | |
ig.KEY.GAMEPAD_Y = -23; | |
ig.KEY.GAMEPAD_DPAD_UP = -24; | |
ig.KEY.GAMEPAD_DPAD_DOWN = -25; | |
ig.KEY.GAMEPAD_DPAD_LEFT = -26; | |
ig.KEY.GAMEPAD_DPAD_RIGHT = -27; | |
ig.KEY.GAMEPAD_LEFT_THUMB = -28; // for clicks! | |
ig.KEY.GAMEPAD_RIGHT_THUMB = -29; | |
ig.KEY.GAMEPAD_LEFT_SHOULDER = -30; | |
ig.KEY.GAMEPAD_RIGHT_SHOULDER = -31; | |
ig.KEY.GAMEPAD_START = -32; | |
ig.KEY.GAMEPAD_BACK = -33; | |
// for when you dont care about the analog-ness | |
ig.KEY.GAMEPAD_LEFT_TRIGGER = -34; | |
ig.KEY.GAMEPAD_RIGHT_TRIGGER = -35; | |
ig.Input.inject({ | |
isUsingController: false, | |
controller0: { | |
connected: false, | |
buttonStates: {}, | |
leftThumb: { | |
x: 0, | |
y: 0 | |
}, | |
rightThumb: { | |
x: 0, | |
y: 0 | |
}, | |
leftTrigger: 0, | |
rightTrigger: 0 | |
}, | |
initController: function() { | |
if (this.isUsingController) { return; } | |
this.isUsingController = true; | |
}, | |
updateController: function() { | |
var state = controller.getState(), | |
buttonStates = this.controller0.buttonStates, | |
normLX, normLY, leftStickX, leftStickY, | |
normRX, normRY, rightStickX, rightStickY, | |
// TODO: calibration? separate deadzone values? | |
deadzoneX = 0.15, deadzoneY = 0.15; | |
if (state.connected) { | |
this.controller0.connected = true; | |
normLX = Math.max(-1, state.leftThumbX / 32767); | |
normLY = Math.max(-1, state.leftThumbY / 32767); | |
normRX = Math.max(-1, state.rightThumbX / 32767); | |
normRY = Math.max(-1, state.rightThumbY / 32767); | |
leftStickX = (Math.abs(normLX) < deadzoneX ? 0 : (Math.abs(normLX) - deadzoneX) * (normLX / Math.abs(normLX))); | |
leftStickY = (Math.abs(normLY) < deadzoneY ? 0 : (Math.abs(normLY) - deadzoneY) * (normLY / Math.abs(normLY))); | |
rightStickX = (Math.abs(normRX) < deadzoneX ? 0 : (Math.abs(normRX) - deadzoneX) * (normRX / Math.abs(normRX))); | |
rightStickY = (Math.abs(normRY) < deadzoneY ? 0 : (Math.abs(normRY) - deadzoneY) * (normRY / Math.abs(normRY))); | |
if (deadzoneX > 0) { leftStickX /= 1 - deadzoneX; rightStickX /= 1 - deadzoneX; } | |
if (deadzoneY > 0) { leftStickY /= 1 - deadzoneY; rightStickY /= 1 - deadzoneY; } | |
this.controller0.leftThumb.x = leftStickX; | |
this.controller0.leftThumb.y = leftStickY; | |
this.controller0.rightThumb.x = rightStickX; | |
this.controller0.rightThumb.y = rightStickY; | |
this.controller0.leftTrigger = state.leftTrigger; | |
this.controller0.rightTrigger = state.rightTrigger; | |
if (this.controller0.leftTrigger > 0) { | |
if (!buttonStates.leftTrigger) { | |
this.buttonDown(ig.GAMEPAD_LEFT_TRIGGER); | |
} | |
buttonStates.leftTrigger = true; | |
} else { | |
if (buttonStates.leftTrigger) { | |
this.buttonUp(ig.KEY.GAMEPAD_LEFT_TRIGGER); | |
} | |
buttonStates.leftTrigger = false; | |
} | |
if (this.controller0.rightTrigger > 0) { | |
if (!buttonStates.rightTrigger) { | |
this.buttonDown(ig.GAMEPAD_RIGHT_TRIGGER); | |
} | |
buttonStates.rightTrigger = true; | |
} else { | |
if (buttonStates.rightTrigger) { | |
this.buttonUp(ig.KEY.GAMEPAD_RIGHT_TRIGGER); | |
} | |
buttonStates.rightTrigger = false; | |
} | |
if (state.a) { | |
if (!buttonStates.a) { | |
this.buttonDown(ig.KEY.GAMEPAD_A); | |
} | |
buttonStates.a = true; | |
} else { | |
if (buttonStates.a) { | |
this.buttonUp(ig.KEY.GAMEPAD_A); | |
} | |
buttonStates.a = false; | |
} | |
if (state.b) { | |
if (!buttonStates.b) { | |
this.buttonDown(ig.KEY.GAMEPAD_B); | |
} | |
buttonStates.b = true; | |
} else { | |
if (buttonStates.b) { | |
this.buttonUp(ig.KEY.GAMEPAD_B); | |
} | |
buttonStates.b = false; | |
} | |
if (state.x) { | |
if (!buttonStates.x) { | |
this.buttonDown(ig.KEY.GAMEPAD_X); | |
} | |
buttonStates.x = true; | |
} else { | |
if (buttonStates.x) { | |
this.buttonUp(ig.KEY.GAMEPAD_X); | |
} | |
buttonStates.x = false; | |
} | |
if (state.y) { | |
if (!buttonStates.y) { | |
this.buttonDown(ig.KEY.GAMEPAD_Y); | |
} | |
buttonStates.y = true; | |
} else { | |
if (buttonStates.y) { | |
this.buttonUp(ig.KEY.GAMEPAD_Y); | |
} | |
buttonStates.y = false; | |
} | |
if (state.dpad_left) { | |
if (!buttonStates.dpad_left) { | |
this.buttonDown(ig.KEY.GAMEPAD_DPAD_LEFT); | |
} | |
buttonStates.dpad_left = true; | |
} else { | |
if (buttonStates.dpad_left) { | |
this.buttonUp(ig.KEY.GAMEPAD_DPAD_LEFT); | |
} | |
buttonStates.dpad_left = false; | |
} | |
if (state.dpad_right) { | |
if (!buttonStates.dpad_right) { | |
this.buttonDown(ig.KEY.GAMEPAD_DPAD_RIGHT); | |
} | |
buttonStates.dpad_right = true; | |
} else { | |
if (buttonStates.dpad_right) { | |
this.buttonUp(ig.KEY.GAMEPAD_DPAD_RIGHT); | |
} | |
buttonStates.dpad_right = false; | |
} | |
if (state.dpad_up) { | |
if (!buttonStates.dpad_up) { | |
this.buttonDown(ig.KEY.GAMEPAD_DPAD_UP); | |
} | |
buttonStates.dpad_up = true; | |
} else { | |
if (buttonStates.dpad_up) { | |
this.buttonUp(ig.KEY.GAMEPAD_DPAD_UP); | |
} | |
buttonStates.dpad_up = false; | |
} | |
if (state.dpad_down) { | |
if (!buttonStates.dpad_down) { | |
this.buttonDown(ig.KEY.GAMEPAD_DPAD_DOWN); | |
} | |
buttonStates.dpad_down = true; | |
} else { | |
if (buttonStates.dpad_down) { | |
this.buttonUp(ig.KEY.GAMEPAD_DPAD_DOWN); | |
} | |
buttonStates.dpad_down = false; | |
} | |
if (state.left_thumb) { | |
if (!buttonStates.left_thumb) { | |
this.buttonDown(ig.KEY.GAMEPAD_LEFT_THUMB); | |
} | |
buttonStates.left_thumb = true; | |
} else { | |
if (buttonStates.left_thumb) { | |
this.buttonUp(ig.KEY.GAMEPAD_LEFT_THUMB); | |
} | |
buttonStates.left_thumb = false; | |
} | |
if (state.right_thumb) { | |
if (!buttonStates.right_thumb) { | |
this.buttonDown(ig.KEY.GAMEPAD_RIGHT_THUMB); | |
} | |
buttonStates.right_thumb = true; | |
} else { | |
if (buttonStates.right_thumb) { | |
this.buttonUp(ig.KEY.GAMEPAD_RIGHT_THUMB); | |
} | |
buttonStates.right_thumb = false; | |
} | |
if (state.left_shoulder) { | |
if (!buttonStates.left_shoulder) { | |
this.buttonDown(ig.KEY.GAMEPAD_LEFT_SHOULDER); | |
} | |
buttonStates.left_shoulder = true; | |
} else { | |
if (buttonStates.left_shoulder) { | |
this.buttonUp(ig.KEY.GAMEPAD_LEFT_SHOULDER); | |
} | |
buttonStates.left_shoulder = false; | |
} | |
if (state.right_shoulder) { | |
if (!buttonStates.right_shoulder) { | |
this.buttonDown(ig.KEY.GAMEPAD_RIGHT_SHOULDER); | |
} | |
buttonStates.right_shoulder = true; | |
} else { | |
if (buttonStates.right_shoulder) { | |
this.buttonUp(ig.KEY.GAMEPAD_RIGHT_SHOULDER); | |
} | |
buttonStates.right_shoulder = false; | |
} | |
if (state.start) { | |
if (!buttonStates.start) { | |
this.buttonDown(ig.KEY.GAMEPAD_START); | |
} | |
buttonStates.start = true; | |
} else { | |
if (buttonStates.start) { | |
this.buttonUp(ig.KEY.GAMEPAD_START); | |
} | |
buttonStates.start = false; | |
} | |
if (state.back) { | |
if (!buttonStates.back) { | |
this.buttonDown(ig.KEY.GAMEPAD_BACK); | |
} | |
buttonStates.back = true; | |
} else { | |
if (buttonStates.back) { | |
this.buttonUp(ig.KEY.GAMEPAD_BACK); | |
} | |
buttonStates.back = false; | |
} | |
} else { | |
// controller disconnected, all buttons off | |
this.controller0.connected = false; | |
// TODO: onDisconnected event? | |
for (var key in buttonStates) { | |
if (buttonStates.hasOwnProperty(key)) { | |
buttonStates[key] = false; | |
} | |
} | |
} | |
}, | |
buttonDown: function(code) { | |
var action = this.bindings[code]; | |
if (action) { | |
this.actions[action] = true; | |
if (!this.locks[action]) { | |
this.presses[action] = true; | |
this.locks[action] = true; | |
} | |
} | |
}, | |
buttonUp: function(code) { | |
var action = this.bindings[code]; | |
if (action) { | |
this.delayedKeyup[action] = true; | |
} | |
}, | |
bind: function (key, action) { | |
if (key < 0 && key > -20) { this.initMouse(); } | |
else if (key < -19) { this.initController(); } | |
else if (key > 0) { this.initKeyboard(); } | |
this.bindings[key] = action; | |
} | |
}); | |
ig.System.inject({ | |
run: function () { | |
this.parent(); | |
if (ig.input.isUsingController) { | |
ig.input.updateController(); | |
} | |
} | |
}); | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment