taiko-web/public/src/js/gamepad.js

99 lines
1.9 KiB
JavaScript
Raw Normal View History

2018-08-29 08:00:15 +02:00
class Gamepad{
2018-09-26 20:30:57 +02:00
constructor(bindings, callback){
this.bindings = bindings
2018-09-17 18:25:47 +02:00
this.b = {
2018-09-17 19:33:52 +02:00
"a": 0,
"b": 1,
"x": 2,
"y": 3,
"lb": 4,
"rb": 5,
"lt": 6,
"rt": 7,
"back": 8,
"start": 9,
"ls": 10,
"rs": 11,
"u": 12,
"d": 13,
"l": 14,
"r": 15,
"guide": 16
2018-09-17 18:25:47 +02:00
}
this.btn = {}
2018-09-26 20:30:57 +02:00
if(callback){
this.interval = setInterval(() => {
this.play(callback)
}, 100)
}
2018-09-17 18:25:47 +02:00
}
2018-09-26 20:30:57 +02:00
play(callback){
2018-09-17 18:25:47 +02:00
if("getGamepads" in navigator){
var gamepads = navigator.getGamepads()
}else{
return
}
2018-09-26 20:30:57 +02:00
var bindings = this.bindings
2018-09-17 18:25:47 +02:00
for(var i = 0; i < gamepads.length; i++){
if(gamepads[i]){
this.toRelease = {}
for(var bind in bindings){
this.toRelease[bind] = bindings[bind].length
}
2018-09-17 19:33:52 +02:00
for(var btnName = 0; btnName <= 16; btnName++){
2018-09-17 18:25:47 +02:00
buttonSearch: {
for(var bind in bindings){
for(var name in bindings[bind]){
if(btnName === this.b[bindings[bind][name]]){
2018-09-26 20:30:57 +02:00
this.checkButton(gamepads, btnName, bind, callback)
2018-09-17 18:25:47 +02:00
break buttonSearch
}
}
}
}
}
break
}
}
}
2018-09-26 20:30:57 +02:00
checkButton(gamepads, btnName, keyCode, callback){
2018-09-17 18:25:47 +02:00
var button = false
2018-09-21 22:31:35 +02:00
2018-09-17 18:25:47 +02:00
for(var i = 0; i < gamepads.length; i++){
if(gamepads[i]){
2018-09-17 19:33:52 +02:00
var btn = gamepads[i].buttons[btnName]
if(btn){
var btnPressed = btn.pressed || btn.value >= 0.5
if(btnPressed){
button = btnPressed
}
2018-09-17 18:25:47 +02:00
}
}
}
2018-09-21 22:31:35 +02:00
2018-09-17 18:25:47 +02:00
var pressed = !this.btn[btnName] && button
var released = this.btn[btnName] && !button
2018-09-21 22:31:35 +02:00
2018-09-17 18:25:47 +02:00
if(pressed){
this.btn[btnName] = true
}else if(released){
delete this.btn[btnName]
}
2018-09-21 22:31:35 +02:00
2018-09-17 18:25:47 +02:00
if(pressed){
2018-09-26 20:30:57 +02:00
callback(true, keyCode)
}else if(!button){
2018-09-17 18:25:47 +02:00
if(released){
this.toRelease[keyCode + "released"] = true
}
this.toRelease[keyCode]--
if(this.toRelease[keyCode] === 0 && this.toRelease[keyCode + "released"]){
2018-09-26 20:30:57 +02:00
callback(false, keyCode)
2018-09-17 18:25:47 +02:00
}
}
}
2018-09-26 20:30:57 +02:00
clean(){
clearInterval(this.interval)
}
2018-08-29 08:00:15 +02:00
}