Copyright © 2025 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
Gamepad仕様は、ゲームパッドデバイスを表す 低水準インターフェイスを定義します。
この節は、この 文書の公開時点におけるステータスを説明します。現在のW3C 公開物の一覧およびこの技術報告書の最新版は、 W3C標準および草案 索引にあります。
これは進行中の作業です。
この文書は、Web Applications Working Groupにより、 勧告トラックを使用した 作業草案として公開されました。
作業草案としての公開は、 W3Cおよびそのメンバーによる承認を意味しません。
これは草案文書であり、いつでも他の文書によって更新、置換、または廃止される 可能性があります。この文書を、進行中の作業以外のものとして引用することは 不適切です。
この文書は、 W3C 特許 ポリシーの下で運営される グループによって作成されました。 W3Cは、 グループの成果物に関連して行われた 特許開示の公開一覧を 管理しています。そのページには、 特許を開示するための手順も含まれています。個人が、 必須クレームを含むと その個人が信じる特許について実際の知識を持つ場合、 W3C特許ポリシー第6節に従って その情報を開示しなければなりません。
この文書は、 2023年11月3日 W3Cプロセス文書により管理されます。
この節は非規範的です。
一部のユーザーエージェントには、 ゲームパッドデバイスが接続されています。これらのデバイスは、 ゲームアプリケーションへの入力、および「10 フィート」ユーザーインターフェイス(プレゼンテーション、メディアビューアー)に望ましく適しています。
現在、ゲームパッドを入力として使用する唯一の方法は、 マウスまたはキーボードイベントをエミュレートすることですが、これは情報を失わせ、 エミュレーションを実現するためにユーザーエージェントの外部にある 追加ソフトウェアを必要とします。
一方、ネイティブアプリケーションは、システムAPIを介して これらのデバイスにアクセスできます。
Gamepad APIは、Webアプリケーションがゲームパッドデータを直接扱えるようにする インターフェイスを指定することで、この問題に対する解決策を提供します。
ゲームを制御するために設計された外部デバイスとのインターフェイスは、 完全に一般的な方法で取り組むと、 大規模で扱いにくいものになる可能性があります。この仕様では、 広く実装でき、幅広く有用な機能の有用なサブセットを提供するために、 範囲を狭めることを明示的に選択します。
具体的には、ゲームパッドをサポートするために必要な機能のみを サポートすることを選択します。ゲームパッドのサポートには、 ボタンと軸という2種類の入力が必要です。ボタンと軸はいずれもアナログ値として報告され、 ボタンは[0 .. 1]の範囲、軸は[-1 .. 1]の範囲です。
主な目的はゲームパッドデバイスのサポートですが、これら 2種類のアナログ入力をサポートすることで、現在のゲームシステムで一般的な他の類似デバイス、 すなわちジョイスティック、ステアリングホイール、 ペダル、加速度計などもサポートできます。そのため、「gamepad」という名称は、 この仕様が扱うデバイス全体の総称になろうとするものではなく、 例示的なものです。
この仕様では、モーションセンシング、深度センシング、映像解析、 ジェスチャー認識などを行う、ゲームの文脈で使用されることもある より複雑なデバイスのサポートを明示的に除外します。
gamepadは、入力コントロールおよび出力 コントロールの集合です。入力コントロールは、時間とともに更新され得る入力 値の集合を持ちます。入力コントロールには、 gamepadのボタン、トリガー、ジョイスティック、サムスティック、およびタッチ面が含まれます。 出力コントロールは、 gamepadの挙動を変更し、 gamepadを操作するユーザーへフィードバックを提供する機能です。 出力コントロールには、gamepadの触覚アクチュエーターが含まれます。 gamepadは、ユーザーエージェントがその入力コントロールの現在の状態を読み取れる場合、 利用可能です。 gamepadが利用可能でない場合、 それは利用不能です。 入力コントロールおよび出力コントロールは、 gamepadが利用可能である間は 変更できません。
ユーザーエージェントは、次の責任を負います:
gamepadは、gamepad 識別子文字列を持ちます。これは、 gamepadのブランドまたはスタイルを識別する、 人間が読める文字列です。内容はユーザーエージェントによって決定されます。
gamepadは、gamepad上の各入力コントロールの 位置、向き、および種類を説明する入力コントロールレイアウトを持つことがあります。 ユーザーエージェントは、 gamepadが標準レイアウトに対応する時を認識する責任を負います。 これは、gamepadが、同じ標準レイアウトに対応する他のgamepadsと交換可能に使用できるようにする 入力 コントロールレイアウトを持つことを意味します。ユーザー エージェントは、その入力コントロールが、 標準レイアウトで説明される入力コントロールと おおよそ同じ相対位置および向きを持つ場合、そのレイアウトが標準レイアウトに 対応すると考えるべきです。
ユーザーエージェントは通常、 gamepadの入力コントロールレイアウトを 直接検査することはできず、レイアウトを決定するためにヒューリスティックを使用してもよいです。 ユーザーエージェントは、 gamepadが標準レイアウトに 対応するかどうかを決定する際に、 デバイス識別子を考慮するべきです。システムが各入力コントロールにラベルを割り当て、 そのラベルが特定のレイアウトを示唆する場合、ユーザーエージェントは、 そのgamepadがそのレイアウトを持つと考えるべきです。 同じ入力コントロールを持つ 標準モデルとアクセシブルモデルが存在する場合、ユーザーエージェントは、 アクセシブルモデルが標準モデルと同じ入力コントロールレイアウトを持つと 考えるべきです。
各入力コントロールは、関連付けられた1つ以上の入力値を持ちます。 これはコントロールの現在の状態を表す数値です。 入力値はいつでも更新され得ます。ユーザーエージェントは、 入力値が更新された時を検出する責任を負い、 更新と、更新された値が読み取られる時との間の遅延を最小化するよう努めるべきです。
入力値を読み取ると、その論理値、 すなわち現在の状態のスケーリングされていない数値表現が返されます。入力値はまた、 範囲内の最小および最大の 論理値を定義する論理 最小値および論理 最大値も持ちます。
入力値は、表されるデータの種類を識別する32ビット値である HID usage 識別子を関連付けて持つことがあります。HID usageは 入力コントロールレイアウトを正確に 説明するものではありませんが、慣例上、類似したレイアウトを持つ多くの gamepadsは類似したusageを使用します。ユーザーエージェントは、 入力コントロールレイアウトを決定する際に、 HID usage識別子に関する慣例に依拠するべきです。
gamepadはaxis入力を持つことがあります。 軸は、 基準位置からのコントロールの現在の変位を表す 入力値です。
gamepadは、リストである axis listを持ちます。これは、 gamepadのすべての axis入力を、ユーザー エージェントによって決定される何らかの順序で含みます。
入力コントロールは、ユーザーが 入力コントロールとの相互作用を停止した時に、 axisを中心位置へ自動的に戻すよう設計されていることがあります。 その場合、axisは優先軸 状態を持ちます。axisが優先軸状態を持つ場合、 追加の入力値である中心 位置 値も持つことがあります。これはaxisが中心にある時の 論理値です。
gamepadはタッチ面を持つことがあります。 タッチ面 は、接触点を表す2D位置データを提供する入力コントロールです。 gamepadは、touch surface listを持ちます。 これは、リストであり、 gamepadの タッチ面を含みます。このリストは、 gamepadの左側により近いタッチ面ほど、 リストの先頭に近く現れるように順序付けられます。
タッチ面は、 センサーによって現在検出されている接触点を表す、0個以上のタッチ点のリストである アクティブ タッチ点リスト入力値を持ちます。 タッチ 点は、単一時点における単一の接触点を表します。 タッチ点は、 タッチ面の座標系内の位置を表す touch x座標および touch y 座標を持ちます。タッチ面がgamepadの上面、下面、前面、または背面にある場合、 touch x座標は左右軸に沿って測定され、 それ以外の場合は上下軸に沿って測定されます。touch y 座標は直交軸に沿って測定されます。
タッチ面がgamepadの左側または右側にある場合、 その寸法はいずれも水平軸とは揃いません。
タッチ面は、面の寸法入力値を持つことがあります。 面の 幅および面の 高さ入力値は、タッチ面の寸法であり、 touch x座標およびtouch y 座標と同じ単位です。タッチ面は、両方の寸法値を持つか、どちらも持たないかのいずれかです。
タッチ点は、新しい接触点である場合も、
以前の接触の継続である場合もあります。タッチ点は、ユーザーエージェントが、
それが以前のタッチ点の継続であり、以前の
GamepadTouchによって表されたものだと識別する場合、
既存のアクティブ
タッチ点の一部です。既存の
アクティブタッチ点の一部であるタッチ点の
アクティブ
タッチ点IDは、以前のGamepadTouchの
touchIdです。
gamepadは触覚 アクチュエーターを持つことがあります。触覚 アクチュエーターは、ユーザーが感じられる方法でgamepadを 動かすことができる出力コントロールです。触覚アクチュエーターは、 ユーザーへフィードバックを提供する触覚効果を生成するために 使用できます。複数のアクチュエーターからの振動は、より複雑な効果を生成するために 組み合わされます。ユーザー エージェントは、 利用可能なgamepads上で、 触覚アクチュエーターに触覚効果の再生および停止を命令する責任を負います。
gamepadは、 振動 アクチュエーターを持つことがあります。これは、 触覚アクチュエーターであり、 gamepad全体を振動させる 触覚効果を再生できます。
触覚アクチュエーターは、
1つ以上のGamepadHapticEffectType
値を含むサポートされる
効果
種類のリストを持ちます。これは、
gamepadが利用可能である間は
変更できません。
このインターフェイスは、個々のゲームパッドデバイスを定義します。
WebIDL[Exposed=Window]
interface Gamepad {
readonly attribute DOMString id;
readonly attribute long index;
readonly attribute boolean connected;
readonly attribute DOMHighResTimeStamp timestamp;
readonly attribute GamepadMappingType mapping;
readonly attribute FrozenArray<double> axes;
readonly attribute FrozenArray<GamepadButton> buttons;
readonly attribute FrozenArray<GamepadTouch> touches;
[SameObject] readonly attribute GamepadHapticActuator vibrationActuator;
};
システムと通信するために使用されるアルゴリズムは通常、 非同期に完了し、ゲームパッドタスクソースに作業をキューに入れます。
Gamepadのインスタンスは、次の表で説明される
内部スロットを用いて作成されます:
| 内部スロット | 初期値 | 説明(非規範的) |
|---|---|---|
| [[connected]] |
false
|
デバイスがシステムに接続されていることを示すフラグ |
| [[timestamp]] | undefined |
このGamepadのデータが最後に更新された時刻
|
| [[axes]] | 空のsequence |
このデバイスによって公開される軸の現在の状態を表す
sequenceのdouble値
|
| [[buttons]] | 空のsequence |
このデバイスによって公開されるボタンの現在の状態を表す
GamepadButtonオブジェクトの
sequence
|
| [[exposed]] |
false
|
Gamepadオブジェクトが
スクリプトに公開されたことを示すフラグ
|
| [[axisMapping]] | 空のordered map |
未マップ軸インデックスから
axes配列内のインデックスへのマッピング
|
| [[axisMinimums]] | 空のlist | 各軸の最小論理値を含むlist |
| [[axisMaximums]] | 空のlist | 各軸の最大論理値を含むlist |
| [[buttonMapping]] | 空のordered map |
未マップボタンインデックスから
buttons配列内のインデックスへのマッピング
|
| [[buttonMinimums]] | 空のlist | 各ボタンの最小論理値を含むlist。 |
| [[buttonMaximums]] | 空のlist | 各ボタンの最大論理値を含むlist |
| [[touches]] | 空のlist | ユーザー生成のタッチがあれば、そのリストを保持します。ゲームパッドが タッチ面をサポートしていない場合、このリストは空のままです。 |
| [[nextTouchId]] | 0 |
次に入ってくるタッチに使用する
touchId値。
|
| [[vibrationActuator]] | undefined |
ゲームパッド全体を振動させる触覚効果を生成できる
GamepadHapticActuatorオブジェクト
|
id属性
ゲームパッドの識別文字列です。この文字列は、接続された ゲームパッドデバイスのブランドまたはスタイルを識別します。
id文字列の正確な形式は未指定のままです。
ユーザーエージェントは、
デバイスを一意に識別することなく製品を識別する文字列を選択することが
推奨されます。たとえば、USBゲームパッドは
idVendorおよびidProduct値によって識別されることがあります。
シリアル番号やBluetoothデバイスアドレスのような一意の識別子は、
id文字列に含めてはなりません。
index属性
Navigator内のゲームパッドのインデックスです。
複数のゲームパッドがユーザー
エージェントに接続されている場合、インデックスはゼロから始まり、
先着順で割り当てられなければなりません。ゲームパッドが
切断された場合、以前に割り当てられたインデックスを、接続され続けている
ゲームパッドに再割り当てしてはなりません。ただし、ゲームパッドが
切断され、その後、同じまたは異なるゲームパッドが接続された場合、
以前に使用された最小のインデックスが再利用されなければなりません。
connected
属性
このオブジェクトによって表される物理デバイスが
まだシステムに接続されているかどうかを示します。ゲームパッドが、
物理的に切断された、電源が切られた、またはその他の理由で
使用不能になったことにより利用不能になると、
connected属性は
falseに設定されなければなりません。
connected取得子の手順は次のとおりです:
[[connected]]を返す。
timestamp
属性
timestampにより、作成者は、この
ゲームパッドのaxesまたはbuttons属性が最後に更新された時刻を
判断できます。この値は、システムがデバイスから新しいボタンまたは軸入力
値を受信するたびに、現在の高分解能
時刻へ設定されなければなりません。ハードウェアからデータを受信していない場合、
timestampは、
Gamepadが最初にスクリプトへ
利用可能にされた時点の現在の高分解能
時刻でなければなりません。
ユーザーエージェントは、
[HR-TIME]のクロック分解能の推奨に従い、
timestamp属性の最小分解能を
5マイクロ秒に設定するべきです。
timestamp取得子の手順は次のとおりです:
[[timestamp]]を返す。
mapping
属性
このデバイスで使用されているマッピングです。ユーザーエージェントが
デバイスのレイアウトについて知識を持つ場合、対応するGamepadMappingType
値へmappingを設定することで、
マッピングが使用中であることを示すべきです。
ゲームパッドデバイスのマッピングを選択するには、次の手順を実行します:
standard"を返す。
"を返す。
axes属性
ゲームパッドのすべての軸の値の配列です。すべての軸値は、 [-1 .. 1]の範囲に線形正規化されなければなりません。 コントローラーが地面に垂直で、方向スティックが上を指している場合、 -1は「前方」または「左」に対応するべきであり、1は 「後方」または「右」に対応するべきです。2D 入力デバイスから得られる軸は、axes配列内で互いに隣接して現れ、X、 次にYの順になるべきです。要素0および1が通常、方向スティックの X軸およびY軸を表すように、軸は重要度の降順に現れることが 推奨されます。ユーザーエージェントが 異なる値(または異なる順序の値)を返す必要があるまで、 同じオブジェクトが返されなければなりません。
axes取得子の手順は次のとおりです:
buttons
属性
ゲームパッドのすべてのボタンのボタン状態の配列です。 主ボタン、副ボタン、第3ボタンなどが buttons配列内の要素0、1、2、...として現れるように、 ボタンは重要度の降順に現れることが 推奨されます。ユーザーエージェントが 異なる値(または異なる順序の値)を返す必要があるまで、 同じオブジェクトが返されなければなりません。
buttons取得子の手順は次のとおりです:
[[buttons]]を返す。
touches
属性
すべてのタッチ面から生成されるGamepadTouchオブジェクトの
listです。
touches取得子の手順は次のとおりです:
[[touches]]を返す。
vibrationActuator属性
デバイスの主たる振動アクチュエーターを表す
GamepadHapticActuatorオブジェクトです。
vibrationActuator取得子の手順は
次のとおりです:
システムが新しいボタンまたは軸入力値を受信する時、 次の手順を実行します:
Gamepad
オブジェクトとする。
gamepadについてゲームパッド状態を更新するには、 次の手順を実行します:
[[timestamp]]をnowに設定する。
Navigator
オブジェクトとする。
[[hasGamepadGesture]]が
falseであり、かつ
gamepadがゲームパッドユーザージェスチャーを含む場合:
[[hasGamepadGesture]]を
trueに設定する。
[[gamepads]]の各
connectedGamepadについて反復する:
nullでない場合:
[[exposed]]を
trueに設定する。
[[timestamp]]を
nowに設定する。
Documentとし、それ以外の場合は
nullとする。
nullではなく、かつ
完全に
アクティブである場合、グローバルタスクをキューに入れる。
これはゲームパッドタスクソース上で行い、gamepadの関連する
グローバルオブジェクトに対して
gamepadconnectedという名前のイベントを発火する。
その際、GamepadEventを用い、その
gamepad
属性を
connectedGamepadで初期化する。
gamepadについて軸を マップして正規化するには、次の手順を実行します:
unsigned long値の
listとする。
[[axisMapping]][rawAxisIndex]とする。
[[axisMinimums]][rawAxisIndex]とする。
[[axisMaximums]][rawAxisIndex]とする。
[[axes]][axisIndex]を
normalizedValueに設定する。
gamepadについてボタンを マップして正規化するには、次の手順を実行します:
unsigned long値の
listとする。
[[buttonMapping]][rawButtonIndex]とする。
[[buttonMinimums]][rawButtonIndex]とする。
[[buttonMaximums]][rawButtonIndex]とする。
[[buttons]][mappedIndex]とする。
[[value]]を
normalizedValueに設定する。
ボタンが純粋な押下状態または解放状態を示すデジタルスイッチを持つ場合、
ボタンが押されていればbutton.[[pressed]]
をtrueに、押されていなければfalseに設定する。
それ以外の場合、値がボタン押下しきい値を上回る場合は
button.[[pressed]]を
trueに設定し、しきい値を上回らない場合はfalseに設定する。
ボタンがタッチを検出できる場合、ボタンが現在タッチされていれば
button.[[touched]]をtrueに設定する。
それ以外の場合、button.[[touched]]を
button.[[pressed]]に設定する。
gamepadについてタッチを 記録するには、次の手順を実行します:
Gamepad.[[touches]]は空である。
surfaceDimensions
を、width
および
height
がデバイス単位でのタッチ面上の最大XおよびY
寸法に初期化されたDOMRectReadOnly
に設定する。
GamepadTouchオブジェクトとする。
surfaceIdをsurfaceIdに設定する。
touchIdを、
そのアクティブタッチ点の
touchIdに設定する。
touchIdを
gamepad.[[nextTouchId]]に設定し、
gamepad.[[nextTouchId]]を
インクリメントする。
Gamepadが複数のタッチ面を持つ場合、touch idは面をまたいで一意になります。
positionを、新しい
DOMPointReadOnly
に設定する。そのx
は、デバイスタッチ面に相対的なデバイスX座標に初期化され、
左端の座標が-1、右端の座標が1となるよう[-1 .. 1]へ正規化される。
また、
y
は、デバイスタッチ面に対して、上端の座標が-1、下端の座標が1となるよう
[-1 .. 1]へ正規化されて初期化される。
x = (2.0 * touchData.x / surfaceDimensions.width) -
1
y = (2.0 * touchData.y / surfaceDimensions.height) - 1
[[touches]]に追加する。
接続されたゲームパッドデバイスを表す新しい
Gamepadは、
次の手順を実行することで構築されます:
Gamepadインスタンスとする:
id属性を、ゲームパッドの
識別文字列に初期化する。
index属性を、
gamepadについて未使用の
ゲームパッドインデックスを選択する結果に初期化する。
mapping属性を、
ゲームパッドデバイスについてマッピングを選択する結果に
初期化する。
[[connected]]をtrueに設定する。
[[timestamp]]を、gamepadの関連する
グローバルオブジェクトが与えられた現在の高分解能
時刻に設定する。
[[axes]]
を、gamepadについて
軸を初期化する結果に設定する。
[[buttons]]を、gamepadについて
ボタンを初期化する結果に設定する。
[[vibrationActuator]]を、
gamepadについてGamepadHapticActuatorを
構築する結果に設定する。
gamepadについて未使用の ゲームパッドインデックスを選択するには、次の手順を実行します:
Navigator
オブジェクトとする。
[[gamepads]]のサイズ − 1とする。
[[gamepads]][gamepadIndex]が
nullなら、gamepadIndexを返す。
[[gamepads]]に
nullを追加する。
[[gamepads]]のサイズ − 1を返す。
gamepadについて軸を初期化するには、 次の手順を実行します:
[[axisMinimums]]を、
inputCountに等しいサイズを持ち、
各軸入力の最小論理値を含む
unsigned long値の
listに設定する。
[[axisMaximums]]を、
inputCountに等しいサイズを持ち、
各軸入力の最大論理値を含む
unsigned long値の
listに設定する。
それ以外の場合:
[[axisMapping]][rawInputIndex]を
canonicalIndexに設定する。
それ以外の場合、rawInputIndexを unmappedInputListに追加する。
[[axisMapping]][rawInputIndex]を
axisIndexに設定する。
gamepadについてボタンを初期化するには、 次の手順を実行します:
[[buttonMinimums]]を、inputCountに等しいサイズを持ち、
各ボタン入力の最小論理値を含む
unsigned long値の
listに設定する。
[[buttonMaximums]]を、inputCountに等しいサイズを持ち、
各ボタン入力の最大論理値を含む
unsigned long値の
listに設定する。
それ以外の場合:
[[buttonMapping]][rawInputIndex]
をcanonicalIndexに設定する。
それ以外の場合、rawInputIndexを unmappedInputListに追加する。
[[buttonMapping]][rawInputIndex]
をbuttonIndexに設定する。
GamepadButtonを
buttonsに追加する。
このインターフェイスは、そのような入力をサポートするゲームパッドのタッチ面上の
タッチを定義します。このオブジェクトは、入力媒体(例: 指、スタイラスなど)が
タッチデバイスに接触した時から、入力媒体がタッチデバイスに接触しなくなる時まで、
タッチ点を一意に識別するタッチ
touchIdで構成されます。
WebIDLdictionary GamepadTouch {
unsigned long touchId;
octet surfaceId;
DOMPointReadOnly position;
DOMRectReadOnly? surfaceDimensions;
};
touchId属性
surfaceId属性
position属性
x、
y座標を保持する
DOMPointReadOnlyです。
z値およびw値は現在使用されません。各座標の範囲は[-1 .. 1]に正規化されます。
x軸に沿って、-1は最左端の座標を参照し、1は最右端の座標を参照します。
y軸に沿って、-1は最上端の座標を参照し、1は最下端の座標を参照します。
surfaceDimensions属性
width
およびheightで
初期化されたDOMRectReadOnlyです。
利用できない場合はnullです。
この列挙型は、Gamepadの既知のマッピングの集合を定義します。
WebIDLenum GamepadMappingType {
"",
"standard",
"xr-standard",
};
""
standard"
xr-standard"
Gamepadオブジェクトが
getGamepads()によって返される場合、
"xr-standard"の
mappingを報告してはなりません。
GamepadHapticActuatorは、
触覚フィードバックの目的で力を加えることができる、モーターまたは他のアクチュエーターの
構成に対応します。
WebIDL[Exposed=Window]
interface GamepadHapticActuator {
[SameObject] readonly attribute FrozenArray<GamepadHapticEffectType> effects;
Promise<GamepadHapticsResult> playEffect(
GamepadHapticEffectType type,
optional GamepadEffectParameters params = {}
);
Promise<GamepadHapticsResult> reset();
};
GamepadHapticActuatorのインスタンスは、
次の表で説明される内部スロットを用いて作成されます:
| 内部スロット | 初期値 | 説明 |
|---|---|---|
| [[effects]] |
GamepadHapticEffectTypeの空のlist。
|
アクチュエーターがサポートする効果を表します。 |
| [[playingEffectPromise]] |
null
|
何らかの効果を再生するためのPromise、または効果が
再生されていない場合はnull。
|
effects属性
アクチュエーターがサポートするすべての触覚効果の種類を表す
GamepadHapticEffectType値の配列です。
このプロパティは、ユーザーエージェントがその種類の効果の
再生をサポートしない場合を除き、アクチュエーターがサポートする
GamepadHapticEffectType値を列挙します。
effects取得子の手順は次のとおりです:
[[effects]]を返す。
playEffect()メソッド
GamepadHapticEffectType typeおよび
GamepadEffectParameters paramsを伴って呼び出される
playEffect()
メソッドの手順は次のとおりです:
TypeErrorで拒否されたpromiseを返す。
Documentとする。
nullである、またはdocumentが完全に
アクティブでない、またはdocumentの可視性
状態が
"hidden"である場合、
"InvalidStateError"
DOMExceptionで
拒否されたpromiseを返す。
[[playingEffectPromise]]
がnullでない場合:
[[playingEffectPromise]]とする。
[[playingEffectPromise]]を
nullに設定する。
preempted"で解決する。
GamepadHapticActuatorが、typeの効果を再生できない場合、
NotSupportedErrorを理由として
拒否されたpromiseを返す。
[[playingEffectPromise]]を新しいpromiseとする。
[[playingEffectPromise]]が
nullでない場合、グローバルタスクをキューに入れる。
これはゲームパッドタスクソース上で、thisの関連する
グローバルオブジェクトを用いて行い、
次の手順を実行する:
[[playingEffectPromise]]
がnullである場合、これらの手順を中止する。
[[playingEffectPromise]]
を"complete"で
解決する。
[[playingEffectPromise]]
をnullに設定する。
[[playingEffectPromise]]を返す。
reset()メソッド
reset()メソッドの手順は次のとおりです:
Documentとする。
nullである、またはdocumentが完全に
アクティブでない、またはdocumentの可視性
状態が
"hidden"である場合、
"InvalidStateError"
DOMExceptionで
拒否されたpromiseを返す。
[[playingEffectPromise]]
がnullでない場合、次の手順を並列に行う:
[[playingEffectPromise]]とする。
[[playingEffectPromise]]
がまだ同じである場合、
this.[[playingEffectPromise]]
をnullに設定する。
preempted"で
解決する。
complete"で
解決する
GamepadHapticActuatorは、
typeが
[[effects]] list内に見つかる場合、typeの
効果を再生できます。
GamepadHapticEffectType
typeおよびGamepadEffectParameters
paramsを持つ効果が、妥当な効果を記述するかどうかを確認するには、
次の手順を実行します:
GamepadHapticEffectType
typeの値が与えられたとして、次で分岐する:
dual-rumble"
falseを返す。
trigger-rumble"
falseを返す。
trueを返す
アクチュエーター上で触覚効果を
発行するには、ユーザーエージェントは、
typeの効果をレンダリングするためのコマンドを
デバイスへ送信し、提供されたparamsを使用させようとしなければなりません。
ユーザーエージェントは、
params.startDelayが
0.0でない場合、より正確な再生タイミングのために、提供されたplayEffectTimestampを
使用するべきです。ユーザー
エージェントは、互換性を高めるために効果を変更してもよいです。
たとえば、ランブルモーター向けの効果は、波形触覚をサポートするが
ランブルモーターを欠くデバイスのために、波形ベースの効果に変換されることがあります。
アクチュエーター上で触覚 効果を停止するには、ユーザーエージェントは、 現在再生中の効果を中止するためのコマンドをデバイスへ送信しなければなりません。 触覚効果が中断された場合、アクチュエーターは可能な限り速やかに静止状態へ戻るべきです。
documentの可視性状態が
"hidden"になった時、各GamepadHapticActuator
actuatorについて、次の手順を実行します:
[[playingEffectPromise]]
がnullである場合、これらの手順を中止する。
[[playingEffectPromise]]が
nullである場合、これらの手順を中止する。
[[playingEffectPromise]]
を"preempted"で
解決する。
[[playingEffectPromise]]を
nullに設定する。
Gamepadの主たる振動アクチュエーターを表す
新しい
gamepadHapticActuatorは、
次の手順を実行することで構築されます:
GamepadHapticActuatorインスタンスとする。
supportedEffectsListを空のlistとする。
GamepadHapticEffectTypeの各列挙値
typeについて、ユーザーエージェントが、
そのアクチュエーター上でその種類の効果を開始するコマンドを送信できる場合、
typeを
supportedEffectsListに追加する。
[[effects]]
をsupportedEffectsListに設定する。
WebIDLenum GamepadHapticsResult {
"complete",
"preempted"
};
complete
触覚効果は再生を完了しました。
preempted
現在の効果は、別の効果によって停止または置換されました(すなわち「preempted」)。
効果の種類は、効果パラメーターがアクチュエーターによってどのように解釈されるかを 定義します。
WebIDLenum GamepadHapticEffectType {
"dual-rumble",
"trigger-rumble"
};
dual-rumble"効果タイプ
"dual-rumble"は、標準ゲームパッドの
各ハンドルに偏心回転質量(ERM)振動モーターを持つ触覚
構成を記述します。この構成では、どちらの
モーターもゲームパッド全体を振動させることができます。各モーターによって
作成される振動効果は等しくないため、それぞれの効果を組み合わせて
より複雑な触覚効果を作成できます。
"dual-rumble"効果は、この種類の
アクチュエーターを対象とした、固定時間で一定強度の振動効果です。
"dual-rumble"
効果は、startDelay、
duration、
strongMagnitude、および
weakMagnitudeによって定義されますが、
いずれも既定値が0であるため必須ではありません。
strongMagnitudeおよび
weakMagnitudeは、
低周波振動および高周波振動の強度レベルを設定し、
[0 .. 1]の範囲に正規化され、既定値は0です。
GamepadEffectParameters paramsが与えられた場合、
妥当なdual-rumble効果は、妥当なduration、妥当なstartDelayを持ち、かつ
strongMagnitudeおよび
weakMagnitudeの両方が
[0
.. 1]の範囲内になければなりません。
trigger-rumble"効果タイプ
"trigger-rumble"は、
"dual-rumble"に使用される2つの
ハンドルモーターに加えて、Standard Gamepadの下部前面ボタン
(標準インデックス6および7のボタン)のそれぞれに
振動モーターを持つ触覚構成を記述します。これらのボタンは
最も一般的にはばね付きトリガーの形を取ります。この
構成では、どちらのモーターもボタン表面に局所的な
触覚フィードバックを提供できます。
"trigger-rumble"効果は、
この種類のアクチュエーターを対象とした、固定時間で一定強度の
振動効果です。"trigger-rumble"
効果は、startDelay、
duration、
strongMagnitude、
weakMagnitude、
leftTrigger、および
rightTriggerによって
定義されますが、いずれも既定値が0であるため必須ではありません。
startDelay、
duration、
strongMagnitude、
weakMagnitudeは、
"dual-rumble"と同じ定義を共有します。
leftTriggerおよび
rightTriggerは、それぞれ
左右の下部前面ボタン振動の強度レベルを設定し、
[0 .. 1]の範囲に正規化され、既定値は0です。
GamepadEffectParameters paramsが与えられた場合、
妥当なtrigger-rumble効果は、妥当なduration、妥当なstartDelayを持ち、かつ
strongMagnitude、
weakMagnitude、
leftTrigger、および
rightTriggerが
[0 ..
1]の範囲内になければなりません。
GamepadEffectParameters辞書は、触覚効果によって使用される
パラメーター用のキーを含みます。各キーの意味は触覚効果によって定義され、
一部のキーは使用されないことがあります。
望ましくない長時間実行効果を緩和するため、ユーザーエージェントは、妥当な効果について、 合計効果時間を何らかの最大時間までに制限してもよいです。 ユーザーエージェントが最大5秒を使用することが 推奨されます。
WebIDLdictionary GamepadEffectParameters {
unsigned long long duration = 0;
unsigned long long startDelay = 0;
double strongMagnitude = 0.0;
double weakMagnitude = 0.0;
double leftTrigger = 0.0;
double rightTrigger = 0.0;
};
duration
メンバー
durationは、
振動効果の継続時間をミリ秒で設定します。
startDelay
メンバー
startDelayは、
playEffect()が
呼び出されてから振動が開始されるまでの遅延時間をミリ秒で設定します。
遅延間隔の間、アクチュエーターは振動するべきではありません。
strongMagnitudeメンバー
dual-rumble"または
"trigger-rumble"効果における
低周波ランブルの振動強度です。
weakMagnitudeメンバー
dual-rumble"または
"trigger-rumble"効果における
高周波ランブルの振動強度です。
leftTriggerメンバー
trigger-rumble"
効果における、左下前面ボタン(標準
インデックス6)のランブルの振動強度です。
rightTriggerメンバー
trigger-rumble"効果における、
右下前面ボタン(標準インデックス7)のランブルの振動強度です。
WebIDL[Exposed=Window]
interface GamepadEvent: Event {
constructor(DOMString type, GamepadEventInit eventInitDict);
[SameObject] readonly attribute Gamepad gamepad;
};
gamepad属性
gamepad属性は、このイベントに関連付けられた
ゲームパッドデータへのアクセスを提供します。
WebIDLdictionary GamepadEventInit : EventInit {
required Gamepad gamepad;
};
gamepadメンバー
Gamepad。
各デバイス製造元は多くの異なる製品を作成しており、それぞれが 固有のボタンおよび軸のスタイルとレイアウトを持ちます。 ユーザーエージェントは、 これらを可能な限り多くサポートすることが意図されています。
さらに、ゲームコンソールによって普及したデファクト標準レイアウトが 存在します。ユーザーエージェントが 接続されたデバイスを認識する場合、可能であれば標準順序に再マッピングすることが 推奨されます。認識されないデバイスも、 それらの生の形式で公開されるべきです。
現在、標準レイアウトは1つあり、それがStandard
Gamepadです。再マッピング時、axesおよび
buttons内のインデックスは、
できるだけ下図の物理的位置に対応するべきです。さらに、
mappingは
"standard"に設定されるべきです。
Standard Gamepadのボタンは、4つのボタンからなる左クラスター、 4つのボタンからなる右クラスター、3つのボタンからなる中央 クラスター、およびゲームパッドの左右両側にある前面向きボタンのペアとして 配置されます。"Standard Gamepad"の4つの軸は、 左右に1つずつあるアナログスティックのペアに関連付けられています。次の 表は、ボタン/軸とそれらの物理的位置を説明します。
軸入力は、サムスティック軸の入力値を報告し、そのサムスティックが 対応するStandard Gamepadサムスティックとほぼ同じ位置にあり、 軸の向き(上下または左右)がStandard Gamepad軸の向きと一致する場合、Standard Gamepad軸を表すものとします。同じ Standard Gamepad軸を表す軸が複数ある場合、ユーザーエージェントは、そのうち1つを Standard Gamepad軸として選択し、他の軸には別の インデックスを割り当てるべきです。
ボタン入力は、ボタンまたはトリガーの入力値を報告し、そのボタンまたは トリガーが対応するStandard Gamepadボタンとほぼ同じ位置にある場合、 Standard Gamepadボタンを表すものとします。
軸またはボタン入力がStandard Gamepadの軸または ボタンを表す場合、その標準インデックスは、 対応するStandard Gamepadの軸またはボタンのインデックスです。
| 種類 | インデックス | 位置 |
|---|---|---|
| ボタン | 0 | 右クラスターの下ボタン |
| 1 | 右クラスターの右ボタン | |
| 2 | 右クラスターの左ボタン | |
| 3 | 右クラスターの上ボタン | |
| 4 | 左上前面ボタン | |
| 5 | 右上前面ボタン | |
| 6 | 左下前面ボタン | |
| 7 | 右下前面ボタン | |
| 8 | 中央クラスターの左ボタン | |
| 9 | 中央クラスターの右ボタン | |
| 10 | 左スティック押下ボタン | |
| 11 | 右スティック押下ボタン | |
| 12 | 左クラスターの上ボタン | |
| 13 | 左クラスターの下ボタン | |
| 14 | 左クラスターの左ボタン | |
| 15 | 左クラスターの右ボタン | |
| 16 | 中央クラスターの中央ボタン | |
| axes | 0 | 左スティックの水平軸(負が左/正が右) |
| 1 | 左スティックの垂直軸(負が上/正が下) | |
| 2 | 右スティックの水平軸(負が左/正が右) | |
| 3 | 右スティックの垂直軸(負が上/正が下) |
Gamepadオブジェクトの機能を検査することは、
能動的フィンガープリンティングの手段として使用できます。ユーザーエージェントは、フィンガープリンティング
面を減らすために、APIを通じて公開されるデバイス情報を変更してもよいです。
例として、実装は、接続されたデバイスにより多いまたは少ない
入力が存在する場合でも、Gamepadオブジェクトが
Standard Gamepadレイアウトで定義された数とちょうど同じボタンおよび軸を
持つことを要求できます。
[FINGERPRINTING-GUIDANCE]
この節は非規範的です。
以下の例は、ゲームパッドへの典型的なアクセスを示します。
requestAnimationFrame()
メソッドとの関係に注意してください。
function runAnimation() {
window.requestAnimationFrame(runAnimation);
for (const pad of navigator.getGamepads()) {
// todo; pad.axesとpad.buttonsを表示する簡単なデモ
console.log(pad);
}
}
window.requestAnimationFrame(runAnimation);
requestAnimationFrame()との
調整
インタラクティブなアプリケーションは通常、
requestAnimationFrame()
メソッドを用いてアニメーションを駆動し、アニメーションをユーザーのゲームパッド入力と
調整したいと考えます。そのため、ゲームパッドデータは、アニメーションコールバックが
実行される直前にできるだけ近いタイミングで、かつアニメーションと一致する頻度で
ポーリングされるべきです。すなわち、アニメーションコールバックが60Hzで実行されている場合、
ゲームパッド入力もそのレートでサンプリングされるべきです。
ゲームパッドがシステム上で利用可能になった時、次の手順を実行します:
Documentとし、それ以外の場合はnullとする。
nullでなく、かつ
"gamepad"権限の使用を許可されていない場合、
これらの手順を中止する。
Gamepadとする。
Navigator
オブジェクトとする。
[[gamepads]][gamepad.index]を
gamepadに設定する。
[[hasGamepadGesture]]が
trueである場合:
[[exposed]]をtrueに設定する。
nullでなく、かつ
完全に
アクティブである場合、gamepadの関連する
グローバルオブジェクトに対して、
gamepadconnectedという名前のイベントを発火する。
その際、GamepadEventを使用し、その
gamepad属性を
gamepadで初期化する。
この仕様を実装するユーザーエージェントは、
gamepadconnectedという名前の
新しいDOMイベントを提供しなければなりません。対応するイベントは
GamepadEvent型でなければならず、
Window
オブジェクト上で発火しなければなりません。
ユーザーエージェントは、
ユーザーがゲームパッドを接続したことを示すため、このイベント型をディスパッチしなければなりません。ページが読み込まれた時点でゲームパッドが
すでに接続されていた場合、ユーザーがボタンを押すか軸を動かした時に
gamepadconnectedイベントが
ディスパッチされるべきです。
ゲームパッドがシステム上で利用不能になった時、次の手順を実行します:
Gamepad
とする。
[[connected]]をfalseに設定する。
Documentとし、それ以外の場合はnullとする。
[[exposed]]がtrueであり、かつ
documentがnullでなく、かつ
完全に
アクティブである場合、gamepadの関連する
グローバルオブジェクトに対して、
gamepaddisconnectedという名前のイベントを発火する。これは
GamepadEventを用い、その
gamepad属性を
gamepadで初期化する。
Navigator
オブジェクトとする。
[[gamepads]][gamepad.index]を
nullに設定する。
[[gamepads]]が空でなく、かつ
navigator.[[gamepads]]の最後の項目が
nullである間、
navigator.[[gamepads]]の最後の項目を削除する。
この仕様を実装するユーザーエージェントは、
gamepaddisconnectedという名前の
新しいDOMイベントを提供しなければなりません。対応するイベントは
GamepadEvent型でなければならず、
Window
オブジェクト上で発火しなければなりません。
ゲームパッドがユーザーエージェントから切断された時、
ユーザーエージェントが以前にその
ゲームパッドについてgamepadconnectedイベントを
Windowへ
ディスパッチしていた場合、gamepaddisconnectedイベントは
その同じWindowへ
ディスパッチされなければなりません。
軸およびボタン変更イベントを含めるか除外するか、またそれらを
よりまとめる("gamepadchanged"?)、多少分離する("gamepadaxischanged"?)、
あるいは個々の軸およびボタンごとに分離するかについて、さらなる議論が必要です。
この仕様は、HTMLのWindowEventHandlers
インターフェイスミックスインを拡張し、
イベントハンドラー登録を容易にするためにイベントハンドラー
IDL属性を追加します。
WebIDLpartial interface mixin WindowEventHandlers {
attribute EventHandler ongamepadconnected;
attribute EventHandler ongamepaddisconnected;
};
この仕様は、 文字列"gamepad"で識別されるポリシー制御機能を定義します。その 既定の 許可リストは*です。
文書の権限
ポリシーは、
その文書内の任意のコンテンツが
getGamepads()へアクセスすることを許可されるかどうかを
決定します。いずれかの文書で無効にされた場合、その文書内のどのコンテンツも
getGamepads()を使用することを許可されず、
またgamepadconnectedおよび
gamepaddisconnected
イベントも発火しません。
非規範的と明示された節に加え、この仕様内のすべての著作ガイドライン、図、例、および注は 非規範的です。この仕様内のその他すべては規範的です。
この文書におけるキーワードMAY、MUST、MUST NOT、RECOMMENDED、SHOULD、およびSHOULD NOTは、 ここに示すようにすべて大文字で現れる場合に限り、 BCP 14 [RFC2119] [RFC8174] に記述されているように解釈されます。
この節は非規範的です。
以下の人々が、この文書の開発に貢献しました。
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in: