Wyłącz przyspieszenie myszy, aby zwiększyć komfort grania w gry FPS

Aplikacje internetowe mogą teraz wyłączyć przyspieszenie myszy podczas rejestrowania zdarzeń wskaźnika.

François Beaufort
François Beaufort

Przyspieszony ruch to funkcja ergonomiczna, która pojawia się, gdy używasz myszy lub trackpada do przesuwania wskaźnika po ekranie. Umożliwia precyzyjny ruch, powoli poruszając się, a jednocześnie umożliwia skupienie wskaźnika na całym ekranie. Przy takiej samej odległości fizycznej, jaką przesuniesz myszą, wskaźnik na ekranie posunie się dalej, jeśli pokonasz tę odległość szybciej.

Systemy operacyjne mają domyślnie włączone przyspieszanie działania myszy. W niektórych grach opartych na własnej perspektywie (zwykle FPS) do sterowania obrotem kamery używane są nieprzetworzone dane wejściowe myszy. Ten sam ruch, zarówno wolny, jak i szybki, daje taki sam obrót. Zapewnia to lepsze wrażenia z gier i większą dokładność według opinii zawodowych graczy.

Zrzut ekranu pokazujący sterowanie ruchem wskaźnika w ustawieniach systemu Windows 10.
Sterowanie ruchem wskaźnika w ustawieniach systemu Windows 10.

Począwszy od Chrome 88 aplikacje internetowe mogą przełączać się między przyspieszonym a nieprzyspieszonym ruchem myszy dzięki zaktualizowanym interfejsowi Pointer Lock API.

Internetowe platformy gier, takie jak Google Stadia i Nvidia GeForce Now, już korzystają z nowych możliwości, aby zadowolić graczy.

Obsługa przeglądarek

  • 37
  • 13
  • 50
  • 10.1

Źródło

Korzystanie z interfejsu API

Żądanie blokady wskaźnika

Blokada wskaźnika to kanoniczna nazwa, która określa, że aplikacja komputerowa ukrywa ikonę wskaźnika i interpretuje ruch myszy w inny sposób, np. rozglądając się w 3D.

Atrybuty movementX i movementY zdarzeń w dokumencie mousemove informują o tym, o ile przesunął się wskaźnik myszy od ostatniego zdarzenia ruchu. Nie są one jednak aktualizowane, gdy wskaźnik znajduje się poza stroną internetową.

document.addEventListener("mousemove", (event) => {
  console.log(`movementX: ${event.movementX} movementY: ${event.movementY}`);
});

Przechwytywanie wskaźnika myszy (lub żądanie jego zablokowania) pozwala nie martwić się o to, że wskaźnik będzie się przemieszczał na zewnątrz. Jest to szczególnie przydatne w przypadku wciągających gier internetowych. Gdy wskaźnik jest zablokowany, wszystkie zdarzenia myszy są przekazywane do elementu docelowego blokady wskaźnika.

Wywołaj requestPointerLock() w elemencie docelowym, aby zażądać blokady wskaźnika, oraz nasłuchuj zdarzeń pointerlockchange i pointerlockerror w celu monitorowania zmian blokady wskaźnika.

const myTargetElement = document.body;

// Call this function to request a pointer lock.
function requestPointerLock() {
  myTargetElement.requestPointerLock();
}

document.addEventListener("pointerlockchange", () => {
  if (document.pointerLockElement) {
    console.log(`pointer is locked on ${document.pointerLockElement}`);
  } else {
    console.log("pointer is unlocked");
  }
});

document.addEventListener("pointerlockerror", () => {
  console.log("pointer lock error");
});

Wyłącz przyspieszenie myszy

Wywołaj polecenie requestPointerLock() z poleceniem { unadjustedMovement: true }, aby wyłączyć korektę przyspieszenia myszy na poziomie systemu operacyjnego i uzyskać dostęp do danych wejściowych myszy. Dzięki temu dane o ruchu myszy ze zdarzeń mousemove nie będą uwzględniać przyspieszenia myszy, gdy wskaźnik jest zablokowany.

Aby sprawdzić, czy żądanie się powiodło, użyj nowej zwróconej obietnicy od requestPointerLock().

function requestPointerLockWithUnadjustedMovement() {
  const promise = myTargetElement.requestPointerLock({
    unadjustedMovement: true,
  });

  if (!promise) {
    console.log("disabling mouse acceleration is not supported");
    return;
  }

  return promise
    .then(() => console.log("pointer is locked"))
    .catch((error) => {
      if (error.name === "NotSupportedError") {
        // Some platforms may not support unadjusted movement.
        // You can request again a regular pointer lock.
        return myTargetElement.requestPointerLock();
      }
    });
}

Możesz przełączać się między danymi o przyspieszonym i nieprzyspieszonym ruchu myszy bez zwalniania blokady wskaźnika. Wystarczy ponownie zażądać blokady wskaźnika, używając wybranej opcji. Jeśli żądanie się nie powiedzie, pierwotna blokada pozostanie bez zmian, a zwrócona obietnica zostanie odrzucona. Zdarzenia blokady wskaźnika nie będą wywoływane po nieudanej próbie zmiany.

Obsługiwane przeglądarki

Interfejs Pointer Lock API jest obsługiwany w różnych przeglądarkach. Jednak od października 2020 r.wyłącznie przeglądarki oparte na Chromium (np. Chrome, Edge itp.) obsługują korektę przyspieszenia myszy na poziomie systemu operacyjnego. Aktualne informacje znajdziesz w tabeli zgodności przeglądarek w MDN.

Obsługa systemu operacyjnego

Wyłączenie korekty na poziomie systemu operacyjnego na potrzeby przyspieszenia myszy jest obsługiwane w ChromeOS, macOS Catalina 10.15.1 i Windows. Linux przyjdzie sam.

Przykład

Możesz wypróbować interfejs Pointer Lock API, uruchamiając sample w Glitch. Pamiętaj, aby sprawdzić kod źródłowy.

Przydatne linki

Podziękowania

Dziękujemy Jamesowi Hollyerowi, Thomas Steiner, Joe Medley, Kayce Basques i Vincent Scheib za recenzję tego artykułu.