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