Summary

  • Первый публичный проект Gamepad API в 2012 году дал веб-играм значения кнопок и осей. Геймпад, изображавший клавиатуру или мышь, терял точность аналоговых движений и нуждался в дополнительной программе.
  • В проекте W3C 2025 года navigator.getGamepads() возвращает пустой список до настоящего действия с контроллером. Это ограничивает незаметную инвентаризацию устройств; Permissions Policy и активность документа проверяются отдельно.

Курок можно нажать наполовину. Стик можно слегка отклонить влево. Клавиатура обычно сообщает только «нажато» или «отпущено», а мышь плохо переводит язык руля. Первый публичный проект W3C от мая 2012 года избавлял контроллер от маскарада под офисную технику. Скрипт получал оси, кнопки, идентификатор, индекс, отметку времени и события подключения или отключения. Игра могла спросить устройство о движении на его собственном языке.

Числа имели значение. Ось менялась от -1 до 1, значение кнопки — от 0 до 1. Наполовину нажатый курок оставался наполовину нажатым. id подсказывал приложению тип контроллера, индекс помогал различать несколько устройств. Если четверо играют с дивана и кто-то ставит игру на паузу, полезно знать, кто именно. Но тот же список выдаёт часть обстановки посетителя. Страница, которая видит его до начала игры, узнаёт об оборудовании человека, даже если он вообще не собирался играть.

Представиться может сам игрок. В проекте W3C от 10 июля 2025 года сказано: navigator.getGamepads() возвращает пустой список, пока браузер не увидит действие пользователя с геймпадом. Текст прямо связывает это с ограничением цифрового отпечатка. Устройство может оставаться подключённым, просто страница пока не получает его перечень. Нажатие кнопки или намеренное движение стика из нейтрального положения начинает знакомство. Сначала рука, потом любопытство сайта.

У дверного звонка есть тонкость: он не должен звонить от сквозняка. Некоторые переключатели остаются включёнными, а некоторые стики едва заметно дрейфуют около центра. Это ещё не свежее приветствие. Поэтому проект описывает переход из нейтрального состояния: прежде отпущенную кнопку нажали или прежде спокойная ось прошла порог. Уставшая пружина не должна представлять своего владельца всем открытым вкладкам.

Есть и другие двери. Не полностью активный документ получает пустой список. Если Permissions Policy запрещает возможность gamepad, вызов getGamepads() выдаёт SecurityError. Действие игрока определяет момент открытия устройства для скрипта, но не раздаёт универсальное разрешение каждому встроенному фрейму. Браузер решает, какому документу доступна функция; игра решает, что означает кнопка; человек решает, когда начнётся разговор.

После знакомства игре нужны новые снимки состояния. getGamepads() сообщает о подключённых контроллерах, с которыми уже взаимодействовали, и ставит null на освободившиеся позиции массива. События говорят о прибытии и уходе устройства. Освободившийся индекс может достаться другому контроллеру: это номер места, а не фамилия. Значения кнопок и осей несут действие — прыжок, поворот, торможение или прогулку по меню с дивана. API передаёт движение; сюжет по-прежнему пишет игра.

История публикаций W3C начинается проектом 2012 года и продолжается документами вплоть до 2025-го. Даты относятся к публикациям, а не к единому дню, когда все браузеры стали вести себя одинаково. Суть развития без этого календаря ясна: играм понадобился честный ввод с контроллера, а посторонним страницам — отказ в бесплатной переписи подключённых устройств.

Наконец игрок нажимает кнопку. Персонаж прыгает. Браузер открыл дверь после того, как человек с геймпадом позвонил.