<html>
<head>
<meta charset="utf-8">
<title>JS Bin</title>
</head>
<body>
<h1>Gamepad Axis/button detection</h1>
<h3>Buttons detected:</h3>
<div id="buttonStatus"></div>
<progress id="buttonValue" value=0 min=0 max=1></progress>
<h3>Left joystick</h3>
Left/Right: <progress class="axe" id="leftRight1" value=1 max=2></progress><br>
Up/Down: <progress class="axe" id="right1" value=1 max=2></progress><br>
<h3>Right joystick</h3>
Left/Right: <progress class="axe" id="left2" value=1 max=2></progress><br>
Up/Down: <progress class="axe" id="right2" value=1 max=2></progress><br>
<h3>Other axes</h3>
Other 1: <progress class="axe" value=1 max=2></progress><br>
Other 2: <progress class="axe" value=1 max=2></progress><br>
</body>
</html>
var gamepad;
var buttonStatusDiv;
var analogicValueProgressBar;
window.onload = function() {
buttonStatusDiv = document.querySelector("#buttonStatus");
analogicValueProgressBar = document.querySelector("#buttonValue");
requestAnimationFrame(mainloop);
setInterval(scangamepads, 500);
};
function mainloop() {
// clear, draw objects, etc...
scangamepads();
// Check gamepad button states
checkButtons(gamepad);
// Check joysticks
checkAxes(gamepad);
// animate at 60 frames/s
requestAnimationFrame(mainloop);
}
//----------------------------------
// gamepad utility code
//----------------------------------
window.addEventListener("gamepadconnected", function(e) {
// now as a global var
gamepad = e.gamepad;
var index = gamepad.index;
var id = gamepad.id;
var nbButtons = gamepad.buttons.length;
var nbAxes = gamepad.axes.length;
console.log("Gamepad No " + index +
", with id " + id + " is connected. It has " +
nbButtons + " buttons and " +
nbAxes + " axes");
});
window.addEventListener("gamepaddisconnected", function(e) {
var gamepad = e.gamepad;
var index = gamepad.index;
console.log("Gamepad No " + index + " has been disconnected");
});
// detect axis (joystick states)
function checkAxes(gamepad) {
if(gamepad === undefined) return;
if(!gamepad.connected) return;
var axisValueProgressBars = document.querySelectorAll(".axe");
for (var i=0; i<gamepad.axes.length; i++) {
var progressBar = axisValueProgressBars[i];
progressBar.innerHTML = i + ": " + gamepad.axes[i].toFixed(4);
progressBar.setAttribute("value", gamepad.axes[i] + 1);
}
}
// Detect button states
function checkButtons(gamepad) {
if(gamepad === undefined) return;
if(!gamepad.connected) return;
//console.log("t");
var atLeastOneButtonPressed = false;
for (var i = 0; i < gamepad.buttons.length; i++) {
var b = gamepad.buttons[i];
if(b.pressed) {
atLeastOneButtonPressed = true;
buttonStatusDiv.innerHTML =
"Button " + i + " is pressed<br>";
if(b.value !== undefined)
analogicValueProgressBar.value = b.value;
}
}
if(!atLeastOneButtonPressed) {
buttonStatusDiv.innerHTML = "";
analogicValueProgressBar.value = 0;
}
}
function scangamepads() {
var gamepads = navigator.getGamepads();
for (var i = 0; i < gamepads.length; i++) {
if(gamepads[i])
gamepad = gamepads[i];
}
}
Output
You can jump to the latest bin by adding /latest
to your URL
Keyboard Shortcuts
Shortcut | Action |
---|---|
ctrl + [num] | Toggle nth panel |
ctrl + 0 | Close focused panel |
ctrl + enter | Re-render output. If console visible: run JS in console |
Ctrl + l | Clear the console |
ctrl + / | Toggle comment on selected lines |
ctrl + ] | Indents selected lines |
ctrl + [ | Unindents selected lines |
tab | Code complete & Emmet expand |
ctrl + shift + L | Beautify code in active panel |
ctrl + s | Save & lock current Bin from further changes |
ctrl + shift + s | Open the share options |
ctrl + y | Archive Bin |
Complete list of JS Bin shortcuts |
JS Bin URLs
URL | Action |
---|---|
/ | Show the full rendered output. This content will update in real time as it's updated from the /edit url. |
/edit | Edit the current bin |
/watch | Follow a Code Casting session |
/embed | Create an embeddable version of the bin |
/latest | Load the very latest bin (/latest goes in place of the revision) |
/[username]/last | View the last edited bin for this user |
/[username]/last/edit | Edit the last edited bin for this user |
/[username]/last/watch | Follow the Code Casting session for the latest bin for this user |
/quiet | Remove analytics and edit button from rendered output |
.js | Load only the JavaScript for a bin |
.css | Load only the CSS for a bin |
Except for username prefixed urls, the url may start with http://jsbin.com/abc and the url fragments can be added to the url to view it differently. |