Skip to content

Instantly share code, notes, and snippets.

@bsparks
Last active August 29, 2015 13:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bsparks/9044738 to your computer and use it in GitHub Desktop.
Save bsparks/9044738 to your computer and use it in GitHub Desktop.
windows 8 xbox controller plugin for impact.js
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