
рдореЗрдЬ рдкрд░ рдмреИрдареЗ, рдЖрдк рд╕реЛрдлреЗ рдкрд░ рдмреИрдарддреЗ рд╕рдордп рдорд╛рдЙрд╕ рдФрд░ рдХреАрдмреЛрд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ - рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рд▓реИрдкрдЯреЙрдк рдХрд╛ рдЯрдЪрдкреИрдб рдпрд╛ рдЯреИрдмрд▓реЗрдЯ рдХрд╛ рдЯрдЪрд╕реНрдХреНрд░реАрдиред рддреБрдо рднреА рд▓реАрдк рдореЛрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ рдЗрд╢рд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдХрдВрдкреНрдпреВрдЯрд░ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдордЭ рдЪреБрдХреЗ рд╣реИрдВ, рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рд╕рд░реНрдл рдХрд░рдиреЗ рдФрд░ рдЕрдкрдиреЗ рдХрдВрдкреНрдпреВрдЯрд░ рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВред рдПрдХ рдЧреЗрдордкреИрдб рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рдЖрдкрдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд░реВрдБрдЧрд╛:
- рдЧреЗрдордкреИрдб рдХреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ
- рдЧреЗрдордкреИрдб рдЗрд╡реЗрдВрдЯреНрд╕ рдХреЛ рд╕реБрдиреЗрдВ
- рдЧреЗрдордкреИрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдкреГрд╖реНрда рддрддреНрд╡реЛрдВ рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реЗрдВ
- рдХрдВрдкрди рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрдВ
USB рдпрд╛ рдмреНрд▓реВрдЯреВрде рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдЧреЗрдордкреИрдб рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ рдФрд░ рд╢реБрд░реВ рдХрд░реЗрдВред
рдЧреЗрдордкреИрдб рдПрдкреАрдЖрдИ
HTML 5 рдорд╛рдирдХ рдореЗрдВ рдПрдХ рдПрдкреАрдЖрдИ рдЧреЗрдордкреИрдб рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИред рдПрдкреАрдЖрдИ рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЧреЗрдордкреИрдб рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдПрдХ рддрддреНрд╡ рдХреЗ рд╕рдВрдпреЛрдЬрди рдореЗрдВ, рдЗрд╕ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЧреЗрдо рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЧреЗрдордкреИрдб рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЧреЗрдордкреИрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реАрдзреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЧреЗрдо рдЦреЗрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдПрдкреАрдЖрдИ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рди рдХреЗрд╡рд▓ рдЧреЗрдореНрд╕ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХреЛрдИ рднреА рдЖрдкрдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЧреЗрдордкреИрдб рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдЗрдирдкреБрдЯ рдбрд┐рд╡рд╛рдЗрд╕ рдмрдирд╛рдиреЗ рд╕реЗ рдирд╣реАрдВ рд░реЛрдХ рд░рд╣рд╛ рд╣реИред
рдЧреЗрдордкреИрдб рдПрдкреАрдЖрдИ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╕рдорд░реНрдерд┐рдд рд╣реИ , рд▓реЗрдХрд┐рди рдЕрднреА рднреА рдорд╕реМрджрд╛ рдЪрд░рдг рдореЗрдВ рд╣реИред рд╢рд╛рдпрдж рдХреБрдЫ рдмрджрд▓ рдЬрд╛рдПрдЧрд╛, рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдпрд╛ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛ред
рд╣рдо рдПрдХ рдЧреЗрдордкреИрдб рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВ
рдЬрдм рдЧреЗрдордкреИрдб рдпреВрдПрд╕рдмреА рдпрд╛ рдмреНрд▓реВрдЯреВрде рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрдВрдкреНрдпреВрдЯрд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдХрдиреЗрдХреНрд╢рди рдФрд░ рдбрд┐рд╕реНрдХрдиреЗрдХреНрдЯ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо рджреЛ рдШрдЯрдирд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
window.addEventListener('gamepadconnected', function(event) {
рдмрдЯрди рджрдмрд╛рдиреЗ рдХреЗ рдмрд╛рдж рд╣реА рдЧреЗрдордкреИрдб рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрдЧрд╛ (рд▓рдЧрднрдЧ рдЕрдиреБрд╡рд╛рдж рдХрд░реЗрдВ рдпрд╛ рдкреНрд░рд╛рд░рдВрдн рдХрд░реЗрдВ)ред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреА рд╕реБрд░рдХреНрд╖рд╛ / рдЧреЛрдкрдиреАрдпрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдХрд╛рдо рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдЯрди рджрдмрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред
рдЧреЗрдордкреИрдб рдЗрд╡реЗрдВрдЯ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИрдВ:

рдЧреЗрдордкреИрдб рд▓реЗрдЖрдЙрдЯ: рдмрдЯрди рдФрд░ рдХреБрд▓реНрд╣рд╛рдбрд╝рд┐рдпреЛрдВ
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╡реЗрдВрдЯ рд▓реЙрдЧ рдореЗрдВ рдмрдЯрди (0 - 16) рдФрд░ рдХреБрд▓реНрд╣рд╛рдбрд╝рд┐рдпреЛрдВ (рдХреБрд▓реНрд╣рд╛рдбрд╝рд┐рдпреЛрдВ 0 - 3) рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдХреИрд╕реЗ рдкрддрд╛ рдЪрд▓реЗрдЧрд╛ рдХрд┐ рдмрдЯрди рдирдВрдмрд░ рдХреЗ рдкреАрдЫреЗ рдХреИрд╕реЗ рдЫрд┐рдкреЗ рд╣реИрдВ? рдЧреЗрдордкреИрдб рдореЗрдВ рдмреНрд░рд╛рдВрдб рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд▓реЗрдЖрдЙрдЯ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдЬрд╛рдирдХрд╛рд░реА рдЦреЛрдЬрдиреА рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╣рдо Xbox One рдЧреЗрдордкреИрдб рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдореЗрдВ рдпрд╣ рд▓реЗрдЖрдЙрдЯ рд╣реИ:

рдХреАрд╕реНрдЯреНрд░реЛрдХреЗ рд╕реБрдиреЗрдВ
рдЗрдВрдЯрд░рдлреЗрд╕ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╕рдордп, рдЖрдк рдПрдХ рдХреАрд╕реНрдЯреНрд░реЛрдХ рдкрд░ рдПрдХ рдШрдЯрдирд╛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП .addEventListener()
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдпрд╣ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдирд┐рдпрдВрддреНрд░рдХ рдкрд░ рдмрдЯрди рдИрд╡реЗрдВрдЯ рдирд╣реАрдВ рдмрдирд╛рддреЗ рд╣реИрдВред рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдКрдкрд░ рд▓реЙрдЧ рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдкрдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ pressed
рдлрд╝реАрд▓реНрдб рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреА рд╣реЛрдЧреА:
const xBoxButtonB = gamepad.buttons[1] if (xBoxButtonB.pressed) { doSomethingOnButtonPress(); }
рдЪреВрдВрдХрд┐ рд╣рдо рд╣рд░ рд╕рдордп рд╕рддреНрдпрд╛рдкрди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЗрд╕реЗ рд╕рднреА рдХреЛ рд▓реВрдк рдореЗрдВ рд▓рдкреЗрдЯрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП requestAnimationFrame
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░:
const rAF = window.mozRequestAnimationFrame || window.requestAnimationFrame; window.addEventListener('gamepadconnected', function() { updateLoop(); }); function updateLoop() {
рдЖрдЗрдЯрдо рдХреЗ рдмреАрдЪ рдиреЗрд╡рд┐рдЧреЗрд╢рди
рд╡реЗрдм рдкреЗрдЬ рдХреЛ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреЗрдордкреИрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХреАрдмреЛрд░реНрдб рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдкреГрд╖реНрда рдкрд░ рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЪрдпрдирдХрд░реНрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдЗрди рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
const focusableElements = document.querySelectorAll( 'button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])' );
рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛ рдлреЛрдХрд╕ рдХрд░рддреЗ рд╣реБрдП рдЖрдЧреЗ рдмрдврд╝реЗрдВ
рддрддреНрд╡ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо NodeList
рдорд╛рдзреНрдпрдо рд╕реЗ рд▓реВрдк рдХрд░реЗрдВрдЧреЗ рдФрд░ element.focus()
focus element.focus()
рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд░реНрддрдорд╛рди рддрддреНрд╡ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реЗрдВрдЧреЗред
рдпрд╣ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдЖрдк рддрддреНрд╡ рд╕реЗ рддрддреНрд╡ рдореЗрдВ рдХреИрд╕реЗ рдХреВрдж рд╕рдХрддреЗ рд╣реИрдВ:
let current; function updateLoop() { const gamepad = navigator.getGamepads()[0] const gamepadBumperL = gamepad.buttons[4] const gamepadBumperR = gamepad.buttons[5] if (gamepadBumperL.pressed) { prevItem(current) } if (gamepadBumperR.pressed) { nextItem(current) } setTimeout(() => rAF(updateLoop), 100) } function prevItem(index) { current = (index - 1) % focusableElements.length focusableElements[current].focus() } function nextItem(index) { current = (index + 1) % focusableElements.length focusableElements[current].focus() }
setTimeout
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЙрдкрдпреЛрдЧ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ requestAnimationFrame
рдХреЛ 100 рдорд┐рд▓реАрд╕реЗрдХрдВрдб рддрдХ рд╕реАрдорд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрд┐рдирд╛, рдХреБрдВрдЬреА рдкрд░ рдПрдХ рд╕рд┐рдВрдЧрд▓ рдХреНрд▓рд┐рдХ рдХрдИ рдЧреЗрдордкреИрдб рдШрдЯрдирд╛рдУрдВ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреЛрдИ рднреА рдкрд░рд┐рдЪрд┐рдд рд╡реНрдпрдХреНрддрд┐ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдПрдХ рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдореЗрдВ рдХреБрдВрдЬреА рдХреЛ рджрдмрд╛рдиреЗ рдФрд░ рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢рд╛рд░реАрд░рд┐рдХ рд░реВрдк рд╕реЗ рдЕрд╕рдВрднрд╡ рд╣реИред
рддрддреНрд╡реЛрдВ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ
рдЖрдк click()
рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рддрддреНрд╡реЛрдВ рдкрд░ click()
рдХрд░ click()
:
clickItem(index) { focusableElements[index].click(); }
рдХрдВрдкрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЬреЛрдбрд╝реЗрдВ
рдЖрдзреБрдирд┐рдХ рдЧреЗрдордкреИрдб рдХрдВрдкрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпреЗ рдХрдВрдкрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдлреАрдбрдмреИрдХ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЖрдорддреМрд░ рдкрд░ рдЦреЗрд▓реЛрдВ рдореЗрдВред рд▓реЗрдХрд┐рди рдЖрдк рдкреГрд╖реНрда рдкрд░ рд╡реЗрдм рддрддреНрд╡реЛрдВ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрдиреЗ рдХрд╛ рднреА рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЧреЗрдордкреИрдб рдЕрдХреНрд╕рд░ рджреЛ рдЗрд▓реЗрдХреНрдЯреНрд░рд┐рдХ рдореЛрдЯрд░реНрд╕ рд╕реЗ рд╕реБрд╕рдЬреНрдЬрд┐рдд рд╣реЛрддреЗ рд╣реИрдВ, рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдФрд░ рдХрдордЬреЛрд░:

рд╣рдо рдЗрди рдореЛрдЯрд░реНрд╕ рдХреЛ рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реЗ рд╡рд╛рдЗрдмреНрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдХрдВрдкрди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо playEffect()
рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
gamepad.vibrationActuator.playEffect('dual-rumble', { startDelay: 0,
рдХрдВрдкрди рдХреЗ рд▓рд┐рдП рдореЛрдЯрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдмрдбрд╝реА рдореЛрдЯрд░ рдХреЛ рддреЗрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕рдордп рдЪрд╛рд╣рд┐рдПред рдЗрд╕рд▓рд┐рдП, рдЕрд▓реНрдкрдХрд╛рд▓рд┐рдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП, рдПрдХ рдЫреЛрдЯреА рдореЛрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИред

рдирд┐рд╖реНрдХрд░реНрд╖
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдордиреЗ рдЧреЗрдордкреИрдб рдПрдкреАрдЖрдИ рдХреЗ рдмреБрдирд┐рдпрд╛рджреА рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХреА рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
GitHub рдХреЛрдб рдФрд░ рдбреЗрдореЛ рдпрд╣рд╛рдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред
рдЙрдкрдпреЛрдЧреА рд▓рд┐рдВрдХ
html5gamepad.com - рдЧреЗрдордкреИрдб рдЪреЗрдХрд░ рдЯреВрд▓
рдПрдордбреАрдПрди рдкрд░ рдЧреЗрдордкреИрдб рдПрдкреАрдЖрдИ