0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ブラウザの Gamepad API 触ってみた

Last updated at Posted at 2023-03-04

Gamepad API とは?

https://developer.mozilla.org/ja/docs/Web/API/Gamepad_API
ブラウザでゲームのコントローラを使うことができる。

試してみる

今回は macOS の Safari から PS4 のコントローラを使ってみた。
コードはこんな感じ↓

<div id="mylog">コントローラのボタンを押してください</div>
<script>
function mainLoop(){
	const gamepad = navigator.getGamepads()[0];
	if (!gamepad){
		requestAnimationFrame(mainLoop);
		return;
	}
	let str = gamepad.axes + "\n";
	gamepad.buttons.forEach(button => {
		str += `${button.pressed ? "O" : "-"}:${button.value}\n`;
	});
	document.getElementById("mylog").innerText = str;
	requestAnimationFrame(mainLoop);
}
mainLoop();
</script>

最初にページを開いたときは navigator.getGamepads() が空になるが、ブラウザのページ内にフォーカスがあるときにコントローラで何かボタンを押すと、 navigator.getGamepads() が情報を返すようになる。

注意点としては、 navigator.getGamepads() が返す Gamepad オブジェクトの値は、取得した瞬間の状態を固定で保持しているらしく、時間が経ってもボタン入力などの情報が同じ値のままとなっている。
なので、毎フレームごとにボタンなどの状態を見張るときには、毎回 navigator.getGamepads() を呼んで最新情報を取得し直さないといけない。(実際に結構ハマった)

  • 初期状態

スクリーンショット 2023-03-04 19.01.33.png

  • 左スティックを真上に倒したとき

スクリーンショット 2023-03-04 19.03.00.png

  • ○ボタンを押したとき

スクリーンショット 2023-03-04 19.03.21.png

  • L2 を半分ぐらい押し下げたとき。 button.value にはアナログな値が入ることがあるようだ。(R2 もだったが、この2つが押す強さを感知しているとは知らなかった...)

スクリーンショット 2023-03-04 19.03.42.png

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?