1. 序論
◎非規範的`~UA$には、 ~gamepad装置が接続されるものもある。 これらの装置は、 ~gaming~app用の入力や “数歩先の” ~UI 【`10 foot UI@https://en.wikipedia.org/wiki/10-foot_user_interface$en】 (プレゼン, ~media~viewerなど) に望ましい, かつ適する。 ◎ Some user agents have connected gamepad devices. These devices are desirable and suited to input for gaming applications, and for "10 foot" user interfaces (presentations, media viewers).
~gamepadを入力として利用する仕方は、 現時点では,[ ~mouse/~keyboard ]~eventで模倣する他にない。 しかしながら,これは、 情報を失うことに加え,[ 模倣を成遂げるためには,`~UA$の外側に追加的な~softwareを要求する ]ことになる。 ◎ Currently, the only way for a gamepad to be used as input would be to emulate mouse or keyboard events, however this would lose information and require additional software outside of the user agent to accomplish emulation.
その一方,~native~appには、 ~system~APIを介してこれらの装置へ~accessする能力がある。 ◎ Meanwhile, native applications are capable of accessing these devices via system APIs.
~Gamepad~APIは、[ ~gamepad~data上で直に動作することを~web~appに許容する~interface ]を指定することにより,この問題への解決策を供する。 ◎ The Gamepad API provides a solution to this problem by specifying interfaces that allow web applications to directly act on gamepad data.
2. 視野
~gameの制御-用に設計された外部~装置との~interface法は、 全部的な一般性に向かって~approachすると,巨大で手に負えなくなるおそれがある。 この仕様では、 明示的に視野を絞って,そのような機能性のうち[ 広くから実装でき,広く有用になる下位集合 ]を供する。 ◎ Interfacing with external devices designed to control games has the potential to become large and intractable if approached in full generality. In this specification we explicitly choose to narrow scope to provide a useful subset of functionality that can be widely implemented and broadly useful.
特定的には,ここでは、 ~gamepadを~supportするために要求される機能性に限り~supportする。 ~gamepad用の~supportは、 2 種の入力 — ~button, 軸( `axis^en ) — を要求する。 両者とも~analog値として報告され、 各~buttonは[ 0 以上, 1 以下 ]の範囲を, 各~軸は[ −1 以上, 1 以下 ]の範囲をとる。 ◎ Specifically, we choose to only support the functionality required to support gamepads. Support for gamepads requires two input types: buttons and axes. Both buttons and axes are reported as analog values, buttons ranging from [0..1], and axes ranging from [-1..1].
首な目標は,~gamepad装置~用の~supportであるが、 この 2 種の~analog入力を~supportすることで,[ 現在の~gaming~systemに共通な,他の類似な装置 ] — ~joystick, ハンドルペダルアクセル, 等々も含む — 用の~supportも許容する。 そのようなわけで、 “~gamepad” という名前は — この仕様が取組む装置の集合~全体を汎用に表すものではなく — それらを~~代表する呼称である。 ◎ While the primary goal is support for gamepad devices, supporting these two types of analog inputs allows support for other similar devices common to current gaming systems including joysticks, driving wheels, pedals, and accelerometers. As such, the name "gamepad" is exemplary rather than trying to be a generic name for the entire set of devices addressed by this specification.
特定的には、 一部の~gaming文脈で利用され得る,より複階的な装置 — [ 動き感知/ 奥行き感知/ 動画~分析/ ~gesture認識 ]等々を行うもの — の~supportは除外される。 ◎ We specifically exclude support for more complex devices that may also be used in some gaming contexts, including those that that do motion sensing, depth sensing, video analysis, gesture recognition, and so on.
【この訳に特有な表記規約】
◎表記記号3. `Gamepad^I ~interface
この~interfaceは、 個々の~gamepad装置を定義する。 ◎ This interface defines an individual gamepad device.
[`Exposed$=Window] interface `Gamepad@I { readonly attribute `DOMString$ `id$m; readonly attribute `long$ `index$m; readonly attribute `boolean$ `connected$m; readonly attribute `DOMHighResTimeStamp$I `timestamp$m; readonly attribute `GamepadMappingType$I `mapping$m; readonly attribute `FrozenArray$<`double$> `axes$m; readonly attribute `FrozenArray$<`GamepadButton$I> `buttons$m; [`SameObject$] readonly attribute `GamepadHapticActuator$I `vibrationActuator$m; };
~systemと通信するために利用される各種~algoは、 概して, `~gamepad~task~source@ に対し~queueするように働くことにより,非同期に完了する。 ◎ The algorithms used to communicate with the system typically complete asynchronously, queuing work on the gamepad task source.
`Gamepad$I の各~instance %~gamepad は、 次に挙げる内部~slotを伴って作成される (値~型と初期~値~以外の記述は規範的でない): ◎ Instances of Gamepad are created with the internal slots described in the following table: ◎ Internal slot|Initial value|Description (non-normative)
- `connected@sl
- 真偽値 — 初期~時は ~F とする。 ◎ false|A flag\
- 当の装置は~systemに接続されているかどうかを指示する。 ◎ indicating that the device is connected to the system
- `timestamp@sl
- `DOMHighResTimeStamp$I 値 — 初期~時は未定義【~objの作成-時に設定される】。 ◎ undefined
- %~gamepad 用の~dataが最後に更新された時刻。 ◎ The last time data for this Gamepad was updated
- `axes@sl
- `double$c 値たちが成す`~list$【!sequence】 — 初期~時は空とする。 ◎ An empty sequence|A sequence of double values\
- この装置により公開される各~軸の現在の状態を表現する。 ◎ representing the current state of axes exposed by this device
- `buttons@sl
- `GamepadButton$I ~objたちが成す`~list$【!sequence】 — 初期~時は空とする。 ◎ An empty sequence|A sequence of GamepadButton objects\
- この装置により公開される各~buttonの現在の状態を表現する。 ◎ representing the current state of buttons exposed by this device
- `exposed@sl
- 真偽値 — 初期~時は ~F とする。 ◎ false|A flag\
- %~gamepad は~scriptに公開されたかどうかを指示する。 ◎ indicating that the Gamepad object has been exposed to script
- `axisMapping@sl
- `有順序~map$ — 初期~時は空とする。 ◎ An empty ordered map|\
- ~unmapped軸~indexから `axes$m 配列~内を指す~indexへの対応付け。 ◎ Mapping from unmapped axis index to an index in the axes array
- `axisMinimums@sl
- `~list$ — 初期~時は空とする。 ◎ An empty list|A list\
- 各~軸~用の最小な論理-値を包含する。 ◎ containing the minimum logical value for each axis
- `axisMaximums@sl
- `~list$ — 初期~時は空とする。 ◎ An empty list|A list\
- 各~軸~用の最大な論理-値を包含する。 ◎ containing the maximum logical value for each axis
- `buttonMapping@sl
- `有順序~map$ — 初期~時は 空とする。 ◎ An empty ordered map|\
- ~unmapped~button~indexから `buttons$m 配列~内を指す~indexへの対応付け。 ◎ Mapping from unmapped button index to an index in the buttons array
- `buttonMinimums@sl
- `~list$ — 初期~時は空とする。 ◎ An empty list|A list\
- 各~button用の最小な論理-値を包含する。 ◎ containing the minimum logical value for each button.
- `buttonMaximums@sl
- `~list$ — 初期~時は空とする。 ◎ An empty list|A list\
- 各~button用の最大な論理-値を包含する。 ◎ containing the maximum logical value for each button
- `vibrationActuator@sl
- ある `GamepadHapticActuator$I ~obj — 初期~時は未定義【~objの作成-時に設定される】。 ◎ undefined|A GamepadHapticActuator object\
- ~gamepad全体を振動する触覚-効果を生成する能力がある~obj。 ◎ capable of generating a haptic effect that vibrates the entire gamepad
`id@m 属性は: ◎ id attribute
- ~gamepad用の識別~文字列を指示する — それは、 接続された~gamepad装置の~brandや~styleを識別する。 ◎ An identification string for the gamepad. This string identifies the brand or style of connected gamepad device.
- 識別~文字列の正確な形式は、 指定されない。 `~UA$には、[ 製品を識別する文字列 ]として[ 装置を一意に識別しないもの ]を選定することが推奨される。 例えば,~USB~gamepadは、 その[ `idVendor^c, `idProduct^c ]値により識別され得る。 識別~文字列には、[ ~serial番号や~Bluetooth装置~addressの様な, 【各~装置,したがって各~利用者に】一意な識別子 ]は含めないモノトスル。 ◎ The exact format of the id string is left unspecified. It is RECOMMENDED that the user agent select a string that identifies the product without uniquely identifying the device. For example, a USB gamepad may be identified by its idVendor and idProduct values. Unique identifiers like serial numbers or Bluetooth device addresses MUST NOT be included in the id string.
`index@m 属性は: ◎ index attribute
- `Navigator$I 【の `getGamepads()$m が返す配列】 における,この~gamepadの~indexを指示する。 ◎ The index of the gamepad in the Navigator.\
-
`~UA$は、 各~gamepadに~indexをアテガうときには,次に従うモノトスル:
- 接続されている~gamepadが複数ある場合、 最初に接続されたものから順に, 0 から~indexをアテガう。
- ある~gamepadが切断されても、 それにアテガわれていた~indexを接続-中にある~gamepadにはアテガい直さない。 【接続-中にある どの~gamepadも,その~indexは変化しない。】
- ~gamepadが切断されてから,同じまたは異なる~gamepadが接続された場合、 それまでに利用された【かつ接続-中にある~gamepadにアテガっていない】最低な~indexを再利用する。
`connected@m 属性は: ◎ connected attribute
- この~objにより表現される物理的な装置は、 依然として~systemに接続されているかどうかを指示する。 ◎ Indicates whether the physical device represented by this object is still connected to the system.\
- ~gamepadが可用でなくなったとき — 物理的に切断された, 電源が切られた, その他~利用-不能になったなど — には、 ~F に設定するモノトスル。 ◎ When a gamepad becomes unavailable, whether by being physically disconnected, powered off or otherwise unusable, the connected attribute MUST be set to false.
- その取得子~手続きは ⇒ ~RET コレ.`connected$sl ◎ The connected getter steps are: • Return this.[[connected]].
`timestamp@m 属性は: ◎ timestamp attribute
- 次を決定することを作者に許容する ⇒ この~gamepad用の[ `axes$m / `buttons$m ]属性が最後に更新された時刻 ◎ The timestamp allows the author to determine the last time the axes or buttons attribute for this gamepad was updated.\
-
値は、 次に挙げる各~時点に,その時点における`現在の高分解能~時刻$に設定するモノトスル: ◎ The value MUST be set to the current high resolution time\
- ~systemが装置から`新たな[~button/軸]入力~値を受信-$した各回 ◎ each time the system receives new button or axis input values from the device.\
- ~hardwareから まだ何も~dataを受信していない間は、 この `Gamepad$I が~scriptに最初に可用された時点 ◎ If no data has been received from the hardware, timestamp MUST be the current high resolution time at the time when the Gamepad was first made available to script.
`~UA$は、 `HR-TIME$r による時計~分解能の推奨に従って, %~gamepad の `timestamp$m 属性の分解能を 5 ~micro秒~以上に設定するベキである。 ◎ Warning User agents SHOULD set a minimum resolution of gamepad's timestamp attribute to 5 microseconds, following [HR-TIME]'s clock resolution recommendation.
- その取得子~手続きは ⇒ ~RET コレ.`timestamp$sl ◎ The timestamp getter steps are: ◎ Return this.[[timestamp]].
`mapping@m 属性は: ◎ mapping attribute
- この装置~用に利用-中にある~layout対応付けを指示する。 ◎ The mapping in use for this device.\
- `~UA$は,装置の~layoutについて知識がある場合、 この属性を[ 当の~layoutに対応している `GamepadMappingType$I 値 ]に設定することにより,対応付けが利用-中にあることを指示するベキである。 ◎ If the user agent has knowledge of the layout of the device, then it SHOULD indicate that a mapping is in use by setting mapping to the corresponding GamepadMappingType value.
-
~gamepad装置~用の `対応付けを選定する@ ときは、 次の手続きを走らす: ◎ To select a mapping for a gamepad device, run the following steps:
- ~IF[ 当の~gamepad装置の[ ~button, 軸 ]の~layoutは、 `標準~gamepad$の~layoutに対応する ] ⇒ ~RET `standard$l ◎ If the button and axis layout of the gamepad device corresponds with the Standard Gamepad layout, then return "standard".
- ~RET `空~文字列@#dom-gamepadmappingtype-the-empty-string$ ◎ Return "".
`axes@m 属性は: ◎ axes attribute
- この~gamepadを成す すべての軸の値たちが成す配列を返す。 ◎ Array of values for all axes of the gamepad.\
- すべての軸~値は[ −1.0 以上 1.0 以下 ]の範囲に線形に正規化するモノトスル。 ~controllerの方向-~stickは天を指しているならば、 −1.0 は[ “前方” / “左方” ]に対応し, 1.0 は[ “後方” / “右方” ]に対応するベキである。 ◎ All axis values MUST be linearly normalized to the range [-1.0 .. 1.0].\ If the controller is perpendicular to the ground with the directional stick pointing up, -1.0 SHOULD correspond to "forward" or "left", and 1.0 SHOULD correspond to "backward" or "right".\
- ~2D入力~装置から取り出される軸は、 配列~内で[ ~X軸, ~Y軸 ]の順に,交互に現れるベキである。 軸たちは、 重要度の高いものから順に — 概して,[ 0 番, 1 番 ]の要素が順に,方向-~stickの[ ~X軸, ~Y軸 ]を表現するように — 現れることが推奨される。 ◎ Axes that are drawn from a 2D input device SHOULD appear next to each other in the axes array, X then Y. It is RECOMMENDED that axes appear in decreasing order of importance, such that element 0 and 1 typically represent the X and Y axis of a directional stick.\
- この属性は、 異なる値たちを返す(あるいは値たちを異なる順序にする)必要があるときまで, 同じ~objを返すモノトスル。 ◎ The same object MUST be returned until the user agent needs to return different values (or values in a different order).
- その取得子~手続きは ⇒ ~RET コレ.`axes$sl ◎ The axes getter steps are: • Return this.[[axes]].
`buttons@m 属性は: ◎ buttons attribute
- この~gamepadを成す すべての~buttonの状態たちが成す配列を返す。 ◎ Array of button states for all buttons of the gamepad.\
- 各~buttonは、 重要度の高いものから順に現れる — [ 第一~button, 第二~button, 第三~button, 等々 ]が配列~内で[ 0, 1, 2, … ]番の要素として現れる — ことが推奨される。 ◎ It is RECOMMENDED that buttons appear in decreasing importance such that the primary button, secondary button, tertiary button, and so on appear as elements 0, 1, 2, ... in the buttons array.\
- この属性は、 異なる値たちを返す(あるいは値たちを異なる順序にする)必要があるときまで, 同じ~objを返すモノトスル。 ◎ The same object MUST be returned until the user agent needs to return different values (or values in a different order).
- その取得子~手続きは ⇒ ~RET コレ.`buttons$sl ◎ The buttons getter steps are: • Return this.[[buttons]].
`vibrationActuator@m 属性は: ◎ vibrationActuator attribute
- 当の装置の首な振動~作動器を表現する `GamepadHapticActuator$I ~objを返す。 ◎ A GamepadHapticActuator object that represents the device's primary vibration actuator.
- その取得子~手続きは ⇒ ~RET コレ.`vibrationActuator$sl ◎ The vibrationActuator getter steps are: • Return this.[[vibrationActuator]].
3.1. 入力の受信-法
~systemの %装置 から `新たな[~button/軸]入力~値を受信-@ したときは、 次の手続きを走らす: ◎ When the system receives new button or axis input values, run the following steps:
- %~gamepad ~LET %装置 を表現している `Gamepad$I ~obj ◎ Let gamepad be the Gamepad object representing the device that received new button or axis input values.
-
`~taskを~queueする$( `~gamepad~task~source$, 次の手続き )
手続きは ⇒ `~gamepad状態を更新する$( %~gamepad )◎ Queue a task on the gamepad task source to update gamepad state for gamepad.
%~gamepad 用に `~gamepad状態を更新する@ ときは、 次の手続きを走らす: ◎ To update gamepad state for gamepad, run the following steps:
- %今 ~LET `現在の高分解能~時刻$( 【 %~gamepad に`関連な大域~obj$】 ) ◎ Let now be the current high resolution time.
- %~gamepad.`timestamp$sl ~SET %今 ◎ Set gamepad.[[timestamp]] to now.
- %~gamepad 用に`各~軸を対応付けて正規化する$() ◎ Run the steps to map and normalize axes for gamepad.
- %~gamepad 用に`各~buttonを対応付けて正規化する$() ◎ Run the steps to map and normalize buttons for gamepad.
- %~navigator ~LET %~gamepad に`関連な大域~obj$に`結付けられた~Navigator$ ◎ Let navigator be gamepad's relevant global object's Navigator object.
-
~IF[ %~navigator.`hasGamepadGesture$sl ~EQ ~F ]~AND[ %~gamepad は`~gamepad利用者~gestureを包含する$ ]: ◎ If navigator.[[hasGamepadGesture]] is false and gamepad contains a gamepad user gesture:
- %~navigator.`hasGamepadGesture$sl ~SET ~T ◎ Set navigator.[[hasGamepadGesture]] to true.
-
%~navigator.`gamepads$sl を成す ~EACH( %接続-済み~gamepad ) に対し: ◎ For each connectedGamepad of navigator.[[gamepads]]:
- ~IF[ %接続-済み~gamepad ~EQ ~NULL ] ⇒ ~CONTINUE ◎ If connectedGamepad is not equal to null:
- %接続-済み~gamepad.`exposed$sl ~SET ~T ◎ Set connectedGamepad.[[exposed]] to true.
- %接続-済み~gamepad.`timestamp$sl ~SET %今 ◎ Set connectedGamepad.[[timestamp]] to now.
- %文書 ~LET %~gamepad に`関連な大域~obj$に`結付けられた文書$ — 他の場合【?】は ~NULL ◎ Let document be gamepad's relevant global object's associated Document; otherwise null.
- ~IF[ %文書 ~EQ ~NULL【!余計?】 ]~OR[ %文書 は`全部的に作動中$でない ] ⇒ ~CONTINUE ◎ ↓
-
`~taskを~queueする$( `~gamepad~task~source$, 次の手続き )
手続きは ⇒ `~eventを発火する$( %~gamepad に`関連な大域~obj$, `gamepadconnected$et, `GamepadEvent$I ) — 次のように初期化して ⇒ `gamepad$m 属性 ~SET %接続-済み~gamepad◎ If document is not null and is fully active, then queue a task on the gamepad task source to fire an event named gamepadconnected at gamepad's relevant global object using GamepadEvent with its gamepad attribute initialized to connectedGamepad.
%~gamepad 用に `各~軸を対応付けて正規化する@ ときは、 次の手続きを走らす: ◎ To map and normalize axes for gamepad, run the following steps:
-
%~gamepad.`axisMapping$sl を成す ~EACH( %生の軸~index → %対応付けた~index ) に対し: ◎ ↓ Let axisValues be a list of unsigned long values representing the most recent logical axis input values for each axis input of the device represented by gamepad. ◎ Let maxRawAxisIndex be the size of axisValues − 1. ◎ For each rawAxisIndex of the range from 0 to maxRawAxisIndex: • Let mappedIndex be gamepad.[[axisMapping]][rawAxisIndex].
-
%論理-値 ~LET 【!%軸~値~list[ %生の軸~index ]】[ %~gamepad により表現される装置 ]を成す[ %生の軸~index 番の軸 ]用の[ 最も近過去な論理-軸~入力 `unsigned long$c† 値 ]
【† %論理-値 は~APIには直に公開されないにもかかわらず、 なぜ `unsigned long$c 型とされているのかは不明 (他所の `unsigned long^c も同様)。 ~USBなどの何らかの標準~規格の都合かもしれない。 】
◎ Let logicalValue be axisValues[rawAxisIndex]. - %論理-最小~値 ~LET %~gamepad.`axisMinimums$sl[ %生の軸~index ] ◎ Let logicalMinimum be gamepad.[[axisMinimums]][rawAxisIndex].
- %論理-最大~値 ~LET %~gamepad.`axisMaximums$sl[ %生の軸~index ] ◎ Let logicalMaximum be gamepad.[[axisMaximums]][rawAxisIndex].
- %正規化した値 ~LET 2 ~MUL ( %論理-値 ~MINUS %論理-最小~値 ) ~DIV ( %論理-最大~値 ~MINUS %論理-最小~値 ) ~MINUS 1 ◎ Let normalizedValue be 2 (logicalValue − logicalMinimum) / (logicalMaximum − logicalMinimum) − 1.
- %~gamepad.`axes$sl[ %対応付けた~index【!%軸~index】 ] ~SET %正規化した値 ◎ Set gamepad.[[axes]][axisIndex] to be normalizedValue.
-
%~gamepad 用に `各~buttonを対応付けて正規化する@ ときは、 次の手続きを走らす: ◎ To map and normalize buttons for gamepad, run the following steps:
-
%~gamepad.`buttonMapping$sl を成す ~EACH( %生の~button~index → %対応付けた~index ) に対し: ◎ ↓ Let buttonValues be a list of unsigned long values representing the most recent logical button input values for each button input of the device represented by gamepad. ◎ Let maxRawButtonIndex be the size of buttonValues − 1. ◎ For each rawButtonIndex of the range from 0 to maxRawButtonIndex: • Let mappedIndex be gamepad.[[buttonMapping]][rawButtonIndex].
- %装置~button ~LET [ %~gamepad により表現される装置 ]を成す[ %生の~button~index 番の~button ] ◎ ↑
- %論理-値 ~LET %装置~button 用の[ 最も近過去な論理-~button入力 `unsigned long$c 値 ] ◎ ↑ ◎ Let logicalValue be buttonValues[rawButtonIndex].
- %論理-最小~値 ~LET %~gamepad.`buttonMinimums$sl[ %生の~button~index ] ◎ Let logicalMinimum be gamepad.[[buttonMinimums]][rawButtonIndex].
- %論理-最大~値 ~LET %~gamepad.`buttonMaximums$sl[ %生の~button~index ] ◎ Let logicalMaximum be gamepad.[[buttonMaximums]][rawButtonIndex].
- %正規化した値 ~LET ( %論理-値 ~MINUS %論理-最小~値 ) ~DIV ( %論理-最大~値 ~MINUS %論理-最小~値 ) ◎ Let normalizedValue be (logicalValue − logicalMinimum) / (logicalMaximum − logicalMinimum).
- %~button ~LET %~gamepad.`buttons$sl[ %対応付けた~index ] ◎ Let button be gamepad.[[buttons]][mappedIndex].
- %~button.`value$sl ~SET %正規化した値 ◎ Set button.[[value]] to normalizedValue.
- ~IF[ %装置~button は、[ 押された状態, 放された状態 ]どちらかのみを指示する~digital~switchを備えている ] ⇒ %~button.`pressed$sl ~SET ~IS[ %装置~button は押されている ] ◎ If the button has a digital switch to indicate a pure pressed or released state, set button.[[pressed]] to true if the button is pressed or false if it is not pressed.
-
~ELSE ⇒ %~button.`pressed$sl ~SET ~IS[ 当の値は`~button押圧~閾値$を上回る ]
【 “当の値” は[ %論理-値 / %正規化した値 ]どちらかを表す ( `~button押圧~閾値$がどちらと比較されるかは,明示的に指定されていない)。 】
◎ Otherwise, set button.[[pressed]] to true if the value is above the button press threshold or false if it is not above the threshold. - ~IF[ %装置~button は、 ~touchを検出する能力がある ] ⇒ %~button.`touched$sl ~SET ~IS[ %装置~button は現在~touchされている ] ◎ If the button is capable of detecting touch, set button.[[touched]] to true if the button is currently being touched.
- ~ELSE ⇒ %~button.`touched$sl ~SET %~button.`pressed$sl ◎ Otherwise, set button.[[touched]] to button.[[pressed]].
3.2. `Gamepad^c の構築-法
接続された~gamepad装置 %~gamepad装置 を表現している `新たな~gamepad@ は、 次の手続きを遂行することにより構築される: ◎ A new Gamepad representing a connected gamepad device is constructed by performing the following steps:
-
%~gamepad ~LET 新たな `Gamepad$I ~instance — 以下に従って, %~gamepad を初期化する: ◎ Let gamepad be a newly created Gamepad instance:
- %~gamepad の `id$m 属性 ~SET %~gamepad装置 用の識別~文字列 ◎ Initialize gamepad's id attribute to an identification string for the gamepad.
- %~gamepad の `index$m 属性 ~SET %~gamepad 用に`未利用な~gamepad~indexを選定する$() ◎ Initialize gamepad's index attribute to the result of selecting an unused gamepad index for gamepad.
- %~gamepad の `mapping$m 属性 ~SET %~gamepad装置 用に`対応付けを選定する$() ◎ Initialize gamepad's mapping attribute to the result of selecting a mapping for the gamepad device.
- %~gamepad.`connected$sl ~SET ~T ◎ Initialize gamepad.[[connected]] to true.
- %~gamepad.`timestamp$sl ~SET `現在の高分解能~時刻$( 【 %~gamepad に`関連な大域~obj$】 ) ◎ Initialize gamepad.[[timestamp]] to the current high resolution time.
- %~gamepad.`axes$sl ~SET %~gamepad 用に`各~軸を初期化する$() ◎ Initialize gamepad.[[axes]] to the result of initializing axes for gamepad.
- %~gamepad.`buttons$sl ~SET %~gamepad 用に`各~buttonを初期化する$() ◎ Initialize gamepad.[[buttons]] to the result of initializing buttons for gamepad.
- %~gamepad.`vibrationActuator$sl ~SET `GamepadHapticActuator$I を`構築する$hA ◎ Initialize gamepad.[[vibrationActuator]] following the steps of constructing a GamepadHapticActuator for gamepad.
- ~RET %~gamepad ◎ Return gamepad.
%~gamepad 用に `未利用な~gamepad~indexを選定する@ ときは、 次の手続きを走らす: ◎ To select an unused gamepad index for gamepad, run the following steps:
- %~navigator ~LET %~gamepad に`関連な大域~obj$に`結付けられた~Navigator$ ◎ Let navigator be gamepad's relevant global object's Navigator object.
- %~gamepad群 ~LET %~navigator.`gamepads$sl ◎ ↓
-
`範囲$ { 0 〜 %~gamepad群 の`~size$ ~MINUS 1 } を成す ~EACH( %~gamepad~index ) に対し ⇒ ~IF[ %~gamepad群[ %~gamepad~index ] ~EQ ~NULL ] ⇒ ~RET %~gamepad~index ◎ Let maxGamepadIndex be the size of navigator.[[gamepads]] − 1. ◎ For each gamepadIndex of the range from 0 to maxGamepadIndex: • If navigator.[[gamepads]][gamepadIndex] is null, then return gamepadIndex.
- %~gamepad群 に ~NULL を`付加する$ ◎ Append null to navigator.[[gamepads]].
- ~RET %~gamepad群 の`~size$ ~MINUS 1 ◎ Return the size of navigator.[[gamepads]] − 1.
%~gamepad 用に `各~軸を初期化する@ ときは、 次の手続きを走らす: ◎ To initialize axes for gamepad, run the following steps:
- %装置 ~LET %~gamepad により表現される装置 ◎ ↓
- %入力~個数 ~LET %装置 により公開される軸~入力の個数 ◎ Let inputCount be the number of axis inputs exposed by the device represented by gamepad.
- %~gamepad.`axisMinimums$sl ~SET 新たな`~list$ ◎ ↓
- %~gamepad.`axisMaximums$sl ~SET 新たな`~list$ ◎ ↓
-
~EACH( %~index ~IN { 0 〜 %入力~個数 ~MINUS 1 } ) に対し,昇順に:
- %~gamepad.`axisMinimums$sl に次を`付加する$ ⇒ %装置 の %~index 番の軸~入力~用の最小な論理-値を与える `unsigned long$c 値
- %~gamepad.`axisMaximums$sl に次を`付加する$ ⇒ %装置 の %~index 番の軸~入力~用の最大な論理-値を与える `unsigned long$c 値
- %~unmapped入力~index~list ~LET 新たな`~list$ ◎ Initialize unmappedInputList to be an empty list.
- %対応付けた~index~list ~LET 新たな`~list$ ◎ Initialize mappedIndexList to be an empty list.
- %軸~list~size ~LET 0 ◎ Initialize axesSize to be 0.
-
~EACH( %生の入力~index ~IN { 0 〜 %入力~個数 ~MINUS 1 } ) に対し: ◎ For each rawInputIndex of the range from 0 to inputCount − 1:
- %正準的~index ~LET %装置 の %生の入力~index 番の軸~用の`正準的~index$ ◎ ↓
-
~IF[ %正準的~index ~NEQ ε ]~AND[ %正準的~index ~NIN %対応付けた~index~list ]: ◎ If the the gamepad axis at index rawInputIndex represents a Standard Gamepad axis: • Let canonicalIndex be the canonical index for the axis. • ↓↓ If mappedIndexList contains canonicalIndex, then append rawInputIndex to unmappedInputList. • Otherwise:
- %~gamepad.`axisMapping$sl[ %生の入力~index ] ~SET %正準的~index ◎ Set gamepad.[[axisMapping]][rawInputIndex] to canonicalIndex.
- %対応付けた~index~list に %正準的~index を`付加する$ ◎ Append canonicalIndex to mappedIndexList.
- ~IF[ %軸~list~size ~LTE %正準的~index ] ⇒ %軸~list~size ~SET %正準的~index ~PLUS 1 ◎ If canonicalIndex + 1 is greater than axesSize, then set axesSize to canonicalIndex + 1.
- ~ELSE ⇒ %~unmapped入力~index~list に %生の入力~index を`付加する$ ◎ Otherwise, append rawInputIndex to unmappedInputList.
- %軸~index ~LET 0 ◎ Initialize axisIndex to be 0.
-
%~unmapped入力~index~list を成す ~EACH( %生の入力~index ) に対し: ◎ For each rawInputIndex of unmappedInputList:
- ~WHILE[ %軸~index ~IN %対応付けた~index~list ] ⇒ %軸~index ~INCBY 1 ◎ While mappedIndexList contains axisIndex: • Increment axisIndex.
- %~gamepad.`axisMapping$sl[ %生の入力~index ] ~SET %軸~index ◎ Set gamepad.[[axisMapping]][rawInputIndex] to axisIndex.
- %対応付けた~index~list に %軸~index を`付加する$ ◎ Append axisIndex to mappedIndexList.
- ~IF[ %軸~list~size ~LTE %軸~index ] ⇒ %軸~list~size ~SET %軸~index ~PLUS 1 ◎ If axisIndex + 1 is greater than axesSize, then set axesSize to axisIndex + 1.
- %軸~list ~LET 新たな`~list$ ◎ Initialize axes to be an empty list.
- `範囲$ { 0 〜 %軸~list~size ~MINUS 1 } を成す ~EACH( %軸~index ) に対し ⇒ %軸~list に 0 を`付加する$ ◎ For each axisIndex of the range from 0 to axesSize − 1, append 0 to axes.
- ~RET %軸~list ◎ Return axes.
%~gamepad 用に `各~buttonを初期化する@ ときは、 次の手続きを走らす: ◎ To initialize buttons for a gamepad, run the following steps:
- %装置 ~LET %~gamepad により表現される装置 ◎ ↓
- %入力~個数 ~LET %~gamepad により表現される装置により公開される~button入力の個数 ◎ Let inputCount be the number of button inputs exposed by the device represented by gamepad.
- %~gamepad.`buttonMinimums$sl ~SET 新たな`~list$ ◎ ↓
- %~gamepad.`buttonMaximums$sl ~SET 新たな`~list$ ◎ ↓
-
~EACH( %~index ~IN { 0 〜 %入力~個数 ~MINUS 1 } ) に対し,昇順に:
- %~gamepad.`buttonMinimums$sl に次を`付加する$ ⇒ %装置 の %~index 番の~button入力~用の最小な論理-値を与える `unsigned long$c 値
- %~gamepad.`buttonMaximums$sl に次を`付加する$ ⇒ %装置 の %~index 番の~button入力~用の最大な論理-値を与える `unsigned long$c 値
- %~unmapped入力~index~list ~LET 新たな`~list$ ◎ Initialize unmappedInputList to be an empty list.
- %対応付けた~index~list ~LET 新たな`~list$ ◎ Initialize mappedIndexList to be an empty list.
- %~button~list~size ~LET 0 ◎ Initialize buttonsSize to be 0.
-
~EACH( %生の入力~index ~IN { 0 〜 %入力~個数 ~MINUS 1 }) に対し: ◎ For each rawInputIndex of the range from 0 to inputCount − 1:
- %正準的~index ~LET %装置 の %生の入力~index 番の~button用の`正準的~index$ ◎ ↓
-
~IF[ %正準的~index ~NEQ ε ]~AND[ %正準的~index ~NIN %対応付けた~index~list ] ◎ If the the gamepad button at index rawInputIndex represents a Standard Gamepad button: • Let canonicalIndex be the canonical index for the button. • ↓↓ If mappedIndexList contains canonicalIndex, then append rawInputIndex to unmappedInputList. ◎ • Otherwise:
- %~gamepad.`buttonMapping$sl[ %生の入力~index ] ~SET %正準的~index ◎ Set gamepad.[[buttonMapping]][rawInputIndex] to canonicalIndex.
- %対応付けた~index~list に %正準的~index を`付加する$ ◎ Append canonicalIndex to mappedIndexList.
- ~IF[ %~button~list~size ~LTE %正準的~index ] ⇒ %~button~list~size ~SET %正準的~index ~PLUS 1 ◎ If canonicalIndex + 1 is greater than buttonsSize, then set buttonsSize to canonicalIndex + 1.
-
~ELSE ⇒ %~unmapped入力~index~list に %生の入力~index を`付加する$ ◎ Otherwise, append rawInputIndex to unmappedInputList. ◎ Increment rawInputIndex.(意味不明
- %~button~index ~LET 0 ◎ Initialize buttonIndex to be 0.
-
%~unmapped入力~index~list を成す ~EACH( %生の入力~index ) に対し: ◎ For each rawInputIndex of unmappedInputList:
- ~WHILE[ %~button~index ~IN %対応付けた~index~list ] ⇒ %~button~index ~INCBY 1 ◎ While mappedIndexList contains buttonIndex: • Increment buttonIndex.
- %~gamepad.`buttonMapping$sl[ %生の入力~index ] ~SET %~button~index ◎ Set gamepad.[[buttonMapping]][rawInputIndex] to buttonIndex.
- %対応付けた~index~list に %~button~index を`付加する$ ◎ Append buttonIndex to mappedIndexList.
- ~IF[ %~button~list~size ~LTE %~button~index ] ⇒ %~button~list~size ~SET %~button~index ~PLUS 1 ◎ If buttonIndex + 1 is greater than buttonsSize, then set buttonsSize to buttonIndex + 1.
- %~button~list ~LET 新たな`~list$ ◎ Initialize buttons to be an empty list.
- `範囲$ { 0 〜 %~button~list~size ~MINUS 1 } を成す ~EACH( %~button~index ) に対し ⇒ %~button~list に`新たな$ `GamepadButton$I を`付加する$ ◎ For each buttonIndex of the range from 0 to buttonsSize − 1, append a new GamepadButton to buttons.
- ~RET %~button~list ◎ Return buttons.
5. `GamepadMappingType^I 列挙
この列挙は、 ~Gamepad用の既知な対応付けたちが成す集合を定義する。 ◎ This enum defines the set of known mappings for a Gamepad.
enum `GamepadMappingType@I { `""@#dom-gamepadmappingtype-the-empty-string$, `standard$l, `xr-standard$l, };
- ""
- 空~文字列は、 この~gamepad用に利用-中にある対応付けは無いことを指示する。 ◎ The empty string indicates that no mapping is in use for this gamepad.
- `standard@l
- ~gamepadを成す各~controlは、 `標準~gamepad$の~layoutに対応付けられている。 ◎ The Gamepad's controls have been mapped to the Standard Gamepad layout.
- `xr-standard@l
- ~gamepadを成す各~controlは、 `xr-standard^l ~gamepad用の`対応付け@~XRGAMEPAD#xr-standard-gamepad-mapping$ に対応付けられている。 この対応付けは、 `~WebXR~gamepad~module@~XRGAMEPAD$cite【!~level 1】 による利用~用に予約される。 `getGamepads()$m が返す値を成す各 `Gamepad$I は、 `xr-standard^l の対応付けを報告してはナラナイ。 ◎ The Gamepad's controls have been mapped to the "xr-standard" gamepad mapping. This mapping is reserved for use by the WebXR Gamepads Module - Level 1. Gamepads returned by getGamepads() MUST NOT report a mapping of "xr-standard".
6. `GamepadHapticActuator^I ~interface
`GamepadHapticActuator$I は、[ 触覚-~feedbackの目的で~forceを適用できる~motorその他の作動器 ]の環境設定に対応する。 ◎ A GamepadHapticActuator corresponds to a configuration of motors or other actuators that can apply a force for the purposes of haptic feedback.
[`Exposed$=Window] interface `GamepadHapticActuator@I { [`SameObject$] readonly attribute `FrozenArray$<`GamepadHapticEffectType$I> `effects$m; `Promise$<`GamepadHapticsResult$I> `playEffect$m( `GamepadHapticEffectType$I type, optional `GamepadEffectParameters$I params = {} ); `Promise$<`GamepadHapticsResult$I> `reset$m(); };
`GamepadHapticActuator$I の各~instanceは、 次に挙げる内部~slotを伴って作成される (値~型と初期~値~以外の記述は規範的でない): ◎ Instances of GamepadHapticActuator are created with the internal slots described in the following table: ◎ Internal slot|Initial value|Description (non-normative)
- `effects@sl
- `GamepadHapticEffectType$I たちが成す`~list$ — 初期~時は空とする。 ◎ An empty list of GamepadHapticEffectType.
- 当の作動器が~supportする効果たちを表現する。 ◎ Represents the effects supported by the actuator.
- `playingEffectPromise@sl
- ~promise / ~NULL — 初期~時は ~NULL とする。 ◎ null|The Promise\
- 何らかの効果を再生するための~promise。 そのような効果は無い場合は ~NULL になる。 ◎ to play some effect, or null if no effect is playing.
`effects@m 属性は: ◎ effects attribute
- `GamepadHapticEffectType$I 値たちが成す配列を返す — それは、[ 当の作動器が~supportする触覚-効果のうち,その再生を`~UA$が~supportするもの ]すべての種別を表現する。 ◎ Array of GamepadHapticEffectType values representing all the types of haptic effects that the actuator supports. This property lists the GamepadHapticEffectType values that the actuator supports, unless the user agent does not support playing effects of that type.
- その取得子~手続きは ⇒ ~RET コレ.`effects$sl ◎ The effects getter steps are: • Return this.[[effects]].
`playEffect(type, params)@m ~method手続きは: ◎ playEffect() method • The playEffect() method steps, called with GamepadHapticEffectType type and GamepadEffectParameters params, are:
- ~IF[ %type 用に`妥当な効果を述べるか否か検査する$( %params ) ~EQ ~F ] ⇒ ~RET `却下される~promise$( `TypeError$E ) ◎ If params does not describe a valid effect of type type, return a promise rejected with a TypeError.
- %文書 ~LET `現在の設定群~obj$に`関連な大域~obj$に`結付けられた文書$ ◎ Let document be the current settings object's relevant global object's associated Document.
- ~IF[ %文書 ~EQ ~NULL【!余計?】 ]~OR[ %文書 は`全部的に作動中$でない ]~OR[ %文書 の`可視性~状態$doc ~EQ `hidden^l ] ⇒ ~RET `却下される~promise$( `InvalidStateError$E 例外 ) ◎ If document is null or document is not fully active or document's visibility state is "hidden", return a promise rejected with an "InvalidStateError" DOMException.
- %効果~promise ~LET コレ.`playingEffectPromise$sl ◎ ↓
-
~IF[ %効果~promise ~NEQ ~NULL ]: ◎ If this.[[playingEffectPromise]] is not null: • Let effectPromise be this.[[playingEffectPromise]].
- コレ.`playingEffectPromise$sl ~SET ~NULL ◎ Set this.[[playingEffectPromise]] to null.
-
`大域~taskを~queueする$( `~gamepad~task~source$, コレに`関連な大域~obj$, 次の手続き )
手続きは ⇒ `~promiseを解決する$( %効果~promise, `preempted$l )◎ Queue a global task on the relevant global object of this using the gamepad task source to resolve effectPromise with "preempted".
- ~IF[ %type ~NIN コレ.`effects$sl 【!コレの~gamepadの作動器は %type による`効果を再生でき$ない】 ] ⇒ ~RET `却下される~promise$( `NotSupportedError$E 例外 ) ◎ If this's gamepad's actuator cannot play effects with type type, return a promise rejected with reason NotSupportedError.
- `playingEffectPromise$sl ~LET `新たな~promise$() ◎ Let [[playingEffectPromise]] be a new promise.
- %再生-効果~時刻印 ~LET `現在の高分解能~時刻$( %文書 に`関連な大域~obj$ ) ◎ Let playEffectTimestamp be the current high resolution time given the document's relevant global object.
-
この段は`並列的$に走らす: ◎ Do the following steps in parallel:
- 当の作動器に対し,`触覚-効果を発行する$( %type, %params, %再生-効果~時刻印 ) ◎ Issue a haptic effect to the actuator with type, params, and the playEffectTimestamp.
- 効果が完了するまで待機する ◎ When the effect completes,\
-
~IF[ コレ.`playingEffectPromise$sl ~NEQ ~NULL ] ⇒ `大域~taskを~queueする$( `~gamepad~task~source$, コレに`関連な大域~obj$, 次の手続き ) ◎ if this.[[playingEffectPromise]] is not null, queue a global task on the relevant global object of this using the gamepad task source to run\
手続きは: ◎ the following steps:
- ~IF[ コレ.`playingEffectPromise$sl ~EQ ~NULL ] ⇒ ~RET ◎ If this.[[playingEffectPromise]] is null, abort these steps.
- `~promiseを解決する$( コレ.`playingEffectPromise$sl, `complete$l ) ◎ Resolve this.[[playingEffectPromise]] with "complete".
- コレ.`playingEffectPromise$sl ~SET ~NULL ◎ Set this.[[playingEffectPromise]] to null.
- ~RET `playingEffectPromise$sl ◎ Return [[playingEffectPromise]].
`reset()@m ~method手続きは: ◎ reset() method • The reset() method steps are:
- %文書 ~LET `現在の設定群~obj$に`関連な大域~obj$に`結付けられた文書$ ◎ Let document be the current settings object's relevant global object's associated Document.
- ~IF[ %文書 ~EQ ~NULL【!余計?】 ]~OR[ %文書 は`全部的に作動中$でない ]~OR[ %文書 の`可視性~状態$doc ~EQ `hidden^l ] ⇒ ~RET `却下される~promise$( `InvalidStateError$E 例外 ) ◎ If document is null or document is not fully active or document's visibility state is "hidden", return a promise rejected with an "InvalidStateError" DOMException.
- %~reset結果~promise ~LET `新たな~promise$() ◎ Let resetResultPromise be a new promise.
-
~IF[ コレ.`playingEffectPromise$sl ~NEQ ~NULL ] ⇒ 次の手続きを`並列的$に遂行する ◎ If this.[[playingEffectPromise]] is not null, do the following steps in parallel:
手続きは: ◎ the following steps:
- %効果~promise ~LET コレ.`playingEffectPromise$sl ◎ Let effectPromise be this.[[playingEffectPromise]].
- コレの~gamepadの作動器に対し,`触覚-効果を停止する$ ◎ Stop haptic effects on this's gamepad's actuator.
-
~IF[ 当の効果は成功裡に停止された ]: ◎ If the effect has been successfully stopped, do:
- ~IF[ %効果~promise ~EQ コレ.`playingEffectPromise$sl ] ⇒ コレ.`playingEffectPromise$sl ~SET ~NULL ◎ If effectPromise and this.[[playingEffectPromise]] are still the same, set this.[[playingEffectPromise]] to null.
-
`大域~taskを~queueする$( `~gamepad~task~source$, コレに`関連な大域~obj$, 次の手続き )
手続きは ⇒ `~promiseを解決する$( %効果~promise, `preempted$l )◎ Queue a global task on the relevant global object of this using the gamepad task source to resolve effectPromise with "preempted".
- `~promiseを解決する$( %~reset結果~promise, `complete$l ) ◎ Resolve resetResultPromise with "complete"
- ~RET %~reset結果~promise ◎ Return resetResultPromise.
`GamepadHapticActuator$I %作動器 が 所与の %種別 による `効果を再生でき@ るとは、 次が満たされることをいう ⇒ %種別 ~IN %作動器. `effects$sl ◎ A GamepadHapticActuator can play effects with type type if type can be found in the [[effects]] list.
【 この訳では、 この用語を利用せず, 単に “%種別 ~IN %作動器. `effects$sl” と記すことにする。 】
各 `GamepadHapticEffectType$I 用には、 ~parameter群が `妥当な効果を述べるか否か検査する@ 手続きが定義される — それは、 所与の ( `GamepadEffectParameters$I %~params ) に対し,真偽値を返す。 ◎ To check if an effect with GamepadHapticEffectType type and GamepadEffectParameters params describes a valid effect, run the following steps: ↓↓ • Given the value of GamepadHapticEffectType type, switch on: •• "dual-rumble" ••• If params does not describe a valid dual-rumble effect, return false. •• "trigger-rumble" ••• If params does not describe a valid trigger-rumble effect, return false. • Return true
`~UA$は,作動器に対し `触覚-効果を発行する@ ときは、 所与の ( %種別, %~params, %再生-効果~時刻印 ) に対し: ◎ To issue a haptic effect on an actuator,\
- %種別 が成す効果を具現化するための~commandを装置へ送信するモノトスル — それに伴い, %~params を利用させるよう試行するモノトスル。 ◎ the user agent MUST send a command to the device to render an effect of type and try to make it use the provided params.\
- [ %~params[ "`startDelay$mb" ] ~NEQ 0.0 ]ならば、 より精確な再生n計時~用に %再生-効果~時刻印 を利用するベキである。 ◎ The user agent SHOULD use the provided playEffectTimestamp for more precise playback timing when params.startDelay is not 0.0.\
- 互換性を高めるためとして,当の効果を改変してもヨイ。 例えば、[ ~rumble~motorを欠如するが,波形~触覚-効果を~supportする装置 ]用には,~rumble~motor用に意図された効果を波形に基づく効果に変形してもよい。 ◎ The user agent MAY modify the effect to increase compatibility. For example, an effect intended for a rumble motor may be transformed into a waveform-based effect for a device that supports waveform haptics but lacks rumble motors.
`~UA$は, 作動器に対し `触覚-効果を停止する@ ときは: ◎ To stop haptic effects on an actuator,\
- 現在~再生している効果がある場合、 それを中止する~commandを当の装置へ送信するモノトスル。 ◎ the user agent MUST send a command to the device to abort any effects currently being played.\
- 当の作動器は、 触覚-効果が中断された場合には,アリな限り素早く動きが無い状態へ返るベキである。 ◎ If a haptic effect was interrupted, the actuator SHOULD return to a motionless state as quickly as possible.
6.1 可視性~変化の取扱い
%文書 の`可視性~状態$docが `hidden^l になったときは、 ~EACH( `GamepadHapticActuator$I %作動器 ) に対し,次の手続きを走らす: ◎ When the document's visibility state becomes "hidden", run these steps for each GamepadHapticActuator actuator:
- ~IF[ %作動器 .`playingEffectPromise$sl ~EQ ~NULL ] ⇒ ~RET ◎ If actuator.[[playingEffectPromise]] is null, abort these steps.
-
`大域~taskを~queueする$( `~gamepad~task~source$, %作動器 に`関連な大域~obj$, 次の手続き ) ◎ Queue a global task on the relevant global object of actuator using the gamepad task source to run\
手続きは: ◎ the following steps:
- ~IF[ %作動器 .`playingEffectPromise$sl ~EQ ~NULL ] ⇒ ~RET ◎ If actuator.[[playingEffectPromise]] is null, abort these steps.
- `~promiseを解決する$( %作動器 .`playingEffectPromise$sl, `preempted$l ) ◎ Resolve actuator.[[playingEffectPromise]] with "preempted".
- %作動器 .`playingEffectPromise$sl ~SET ~NULL ◎ Set actuator.[[playingEffectPromise]] to null.
- `触覚-効果を停止する$( %作動器 ) ◎ Stop haptic effects on actuator.
6.2. `GamepadHapticActuator^I の構築-法
`Gamepad$I の首な振動~作動器 %作動器 を表現している新たな `GamepadHapticActuator$I を `構築する@hA ときは、 次の手続きを遂行する: ◎ A new gamepadHapticActuator representing a Gamepad's primary vibration actuator is constructed by performing the following steps:
- %~gamepad触覚-作動器 ~LET `新たな$ `GamepadHapticActuator$I ◎ Let gamepadHapticActuator be a newly created GamepadHapticActuator instance.
- %~supportされる効果~群 ~LET 新たな`~list$ ◎ Let supportedEffectsList be an empty list.
- `GamepadHapticEffectType$I を成す ~EACH( 列挙~値 %種別 ) に対し ⇒ ~IF[ `~UA$は %作動器 に対し %種別 用の効果を起動する~commandを送信できる ] ⇒ %~supportされる効果~群 に %種別 を`付加する$ ◎ For each enum value type of GamepadHapticEffectType, if the user agent can send a command to initiate effects of that type on that actuator, append type to supportedEffectsList.
- %~gamepad触覚-作動器 .`effects$sl ~SET %~supportされる効果~群 ◎ Set gamepadHapticActuator.[[effects]] to supportedEffectsList.
7. `GamepadHapticsResult^I 列挙
enum `GamepadHapticsResult@I { `complete@l, `preempted@l };
- `complete$l
- 触覚-効果の再生を完了した。 ◎ The haptic effected completed playing.
- `preempted@l
- 現在の効果は、 停止されたか,別の効果により置換された(すなわち “先取りされた” )。 ◎ The current effect was stopped or replaced (i.e., "preempted") by another effect.
8. `GamepadHapticEffectType^I 列挙
効果~種別は、[ 効果~parameterが作動器によりどう解釈されるか ]を定義する。 ◎ The effect type defines how the effect parameters are interpreted by the actuator.
enum `GamepadHapticEffectType@I { `dual-rumble$l, `trigger-rumble$l };
- `dual-rumble@l ◎ "dual-rumble" effect type
- 触覚-環境設定を[ 標準~gamepadを成す各~handleにおける~ERM ( `eccentric rotating mass^en, 偏心回転質量) 振動~motor ]で述べる。 この環境設定においては、 どちらの~motorも,~gamepad全体を振動させる能力があるが、 それらにより作成される振動~効果は,互いに異なるので、 組合せることで,より複階的な触覚-効果を作成できる。 ◎ "dual-rumble" describes a haptic configuration with an eccentric rotating mass (ERM) vibration motor in each handle of a standard gamepad. In this configuration, either motor is capable of vibrating the whole gamepad. The vibration effects created by each motor are unequal so that the effects of each can be combined to create more complex haptic effects.
-
`dual-rumble$l 効果は、[ ある固定的な所要時間において,強度が一定 ]な[ この種別の作動器~用に意図された振動~効果 ]であり,[ `startDelay$mb, `duration$mb, `strongMagnitude$mb, `weakMagnitude$mb ]により定義される — これらは: ◎ A "dual-rumble" effect is a fixed-duration, constant-intensity vibration effect intended for an actuator of this type. "dual-rumble" effects are defined by startDelay, duration, strongMagnitude, and weakMagnitude,\
- 既定では 0 をとるので,要求されない。 ◎ none of which are required because they default to 0.
- うち[ `strongMagnitude$mb / `weakMagnitude$mb ]は、[ 低-頻度/高-頻度 ]な振動~用に強度~levelを設定する — それは、 範囲 0 以上 1 以下に正規化され, 既定では 0 になる。 ◎ strongMagnitude and weakMagnitude set the intensity levels for the low-frequency and high-frequency vibrations, normalized to the range [0,1], defaulting to 0.
-
`dual-rumble$l 用に`妥当な効果を述べるか否か検査する$ときは、 所与の ( `GamepadEffectParameters$I %~params ) に対し ⇒ ~RET ~IS ~AND↓:
- %~params[ "`duration$mb" ] は妥当である†
- %~params[ "`startDelay$mb" ] は妥当である†
- %~params[ "`strongMagnitude$mb" ] は 0 以上 1 以下である
- %~params[ "`weakMagnitude$mb" ] は 0 以上 1 以下である
【† これらの “妥当” が何を意味するかは、 原文には述べられていない (原文では、 `妥当な効果を述べるか否か検査する$を参照していて,循環している)。 実際には、 次節に述べられる “最大” 以下を意味すると思われる。 】
◎ Given GamepadEffectParameters params, a valid dual-rumble effect must have a valid duration, a valid startDelay, and both the strongMagnitude and the weakMagnitude must be in the range [0,1]. - `trigger-rumble@l ◎ "trigger-rumble" effect type
- 触覚-環境設定を[ `dual-rumble$l 用に利用される 2 個の~handle~motorに加えて, 標準~gamepadを成す[ 左下, 右下 ]前面~button(`正準的~index$ 6, 7 )における振動~motor ]で述べる。 これらの~buttonに最も共通的な形は、 ~spring-loaded引金である。 この環境設定においては、 どちらの~motorも,~button表面に局所~化された触覚-~feedbackを供する能力がある。 ◎ "trigger-rumble" describes a haptics configuration with a vibration motor in each of the bottom front buttons of a Standard Gamepad (buttons with canonical indices 6 and 7) in addition to the two handle motors used for "dual-rumble". These buttons most commonly take the form of spring-loaded triggers. In this configuration, either motor is capable of providing localized haptic feedback on the button's surface.
-
`trigger-rumble$l 効果は、[ ある固定的な所要時間において,強度が一定 ]な[ この種別の作動器~用に意図された振動~効果 ]であり,[ `startDelay$mb, `duration$mb, `strongMagnitude$mb, `weakMagnitude$mb, `leftTrigger$mb, `rightTrigger$mb ]により定義される — これらは: ◎ A "trigger-rumble" effect is a fixed-duration, constant-intensity vibration effect intended for an actuator of this type. "trigger-rumble" effects are defined by startDelay, duration, strongMagnitude, weakMagnitude, leftTrigger, and rightTrigger,\
- いずれも、 既定では 0 をとるので,要求されない。 ◎ none of which are required because they default to 0.
- うち[ `startDelay$mb / `duration$mb / `strongMagnitude$mb / `weakMagnitude$mb ]は、 `dual-rumble$l と同じ定義を共有する。 ◎ startDelay, duration, strongMagnitude, weakMagnitude share the same definition with "dual-rumble".\
- うち[ `leftTrigger$mb / `rightTrigger$mb ]は、[ 左下/右下 ]前面~buttonの振動~用に強度~levelを設定する — それは、 範囲 0 以上 1 以下に正規化され, 既定では 0 になる。 ◎ leftTrigger and rightTrigger, respectively, set the intensity levels for the left and right bottom front buttons vibrations, normalized to the range [0,1], defaulting to 0.
-
`trigger-rumble$l 用に`妥当な効果を述べるか否か検査する$ときは、 所与の ( `GamepadEffectParameters$I %~params ) に対し ⇒ ~RET ~IS ~AND↓:
- %~params[ "`duration$mb" ] は妥当である†
- %~params[ "`startDelay$mb" ] は妥当である†
- %~params[ "`strongMagnitude$mb" ] は 0 以上 1 以下である
- %~params[ "`weakMagnitude$mb" ] は 0 以上 1 以下である
- %~params[ "`leftTrigger$mb" ] は 0 以上 1 以下である
- %~params[ "`rightTrigger$mb" ] は 0 以上 1 以下である
【† これらの “妥当” が何を意味するかは、 `dual-rumble$l のときと同じく,原文には述べられていない。 】
◎ Given GamepadEffectParameters params, a valid trigger-rumble effect must have a valid duration, a valid startDelay, and the strongMagnitude, weakMagnitude, leftTrigger, and rightTrigger must be in the range [0,1].
9. `GamepadEffectParameters^I 辞書
`GamepadEffectParameters^I 辞書は、 触覚-効果に利用される~parameter用の~keyたちを包含する。 各~keyの意味は、 当の触覚-効果【の種別】により定義される。 一部の~keyは、 利用されないこともある。 ◎ A GamepadEffectParameters dictionary contains keys for parameters used by haptic effects. The meaning of each key is defined by the haptic effect, and some keys may be unused.
無用に長く稼働する効果を軽減するため、 `~UA$は,`妥当な効果@#dfn-valid-effect$用の所要時間を何らかの最大までに制限してもヨイ。 `~UA$には、 最大として 5 秒を利用することが推奨される。 ◎ To mitigate unwanted long-running effects, the user agent MAY limit the total effect duration for a valid effect to some maximum duration. It is RECOMMENDED that the user agent use a maximum of 5 seconds.
dictionary `GamepadEffectParameters@I { `unsigned long long$ `duration$mb = 0; `unsigned long long$ `startDelay$mb = 0; `double$ `strongMagnitude$mb = 0.0; `double$ `weakMagnitude$mb = 0.0; `double$ `leftTrigger$mb = 0.0; `double$ `rightTrigger$mb = 0.0; };
- `duration@mb ◎ duration member
- 当の振動~効果の所要時間を~milli秒数で設定する。 ◎ duration sets the duration of the vibration effect in milliseconds.
- `startDelay@mb ◎ startDelay member
- [ `playEffect()$m が~callされてから振動が開始されるまで ]の遅延を成す所要時間を~milli秒数で設定する。 当の作動器は、 遅延されている間は,振動するベキでない。 ◎ startDelay sets the duration of the delay after playEffect() is called until vibration is started, in milliseconds. During the delay interval, the actuator SHOULD NOT vibrate.
- `strongMagnitude@mb ◎ strongMagnitude member
- [ `dual-rumble$l / `trigger-rumble$l ]効果における低-頻度な~rumble用の振動の大きさ。 ◎ The vibration magnitude for the low frequency rumble in a "dual-rumble" or "trigger-rumble" effect.
- `weakMagnitude@mb ◎ weakMagnitude member
- [ `dual-rumble$l / `trigger-rumble$l ]効果における高-頻度な~rumble用の振動の大きさ。 ◎ The vibration magnitude for the high frequency rumble in a "dual-rumble" or "trigger-rumble" effect.
- `leftTrigger@mb ◎ leftTrigger member
- `trigger-rumble$l 効果における[ 左下~前面~button(`正準的~index$ 6 )の~rumble ]用の振動の大きさ。 ◎ The vibration magnitude for the bottom left front button (canonical index 6) rumble in a "trigger-rumble" effect.
- `rightTrigger@mb ◎ rightTrigger member
- `trigger-rumble$l 効果における[ 右下~前面~button(`正準的~index$ 7 )の~rumble ]用の振動の大きさ。 ◎ The vibration magnitude for the bottom right front button (canonical index 6) rumble in a "trigger-rumble" effect.
11. `GamepadEvent^I ~interface
[`Exposed$=Window] interface `GamepadEvent@I: `Event$I { `constructor@~DOM4#concept-event-constructor$(`DOMString$ %type, `GamepadEventInit$I %eventInitDict); [`SameObject$] readonly attribute `Gamepad$I `gamepad$m; };
`gamepad@m 属性は、 この~event用に結付けらている~gamepad~dataへの~accessを供する。 ◎ gamepad • The gamepad attribute provides access to the associated gamepad data for this event.
11.1. `GamepadEventInit^I 辞書
dictionary `GamepadEventInit@I : `EventInit$I { required `Gamepad$I `gamepad$mb; };
`gamepad@mb ~memberは、 当の~eventに結付けられる `Gamepad$I を与える。 ◎ gamepad member • The gamepad associated with this event.
12. 対応付直法
各~装置の製造元は、 多くの異なる製品を作成する — そのそれぞれが、[ ~button/軸 ]の[ ~style, ~layout ]として~~固有のものを備える。 `~UA$は、 これらのうち,アリな限り多くを~supportするものと意図される。 ◎ Each device manufacturer creates many different products and each has unique styles and layouts of buttons and axes. It is intended that the user agent support as many of these as possible.
加えて、 ~game~consoleにより~~普及し,`事実上の標準^emになった~layoutがある。 `~UA$は、 装着された装置を認識するときは,[ アリなときは,正準的な順序付けへ対応付直す/ 認識できない装置であっても,生の形で公開する ]ことが推奨される。 ◎ Additionally there are de facto standard layouts that have been made popular by game consoles. When the user agent recognizes the attached device, it is RECOMMENDED that it be remapped to a canonical ordering when possible. Devices that are not recognized should still be exposed in their raw form.
正準的な~layoutは、 現時点では `標準~gamepad@ ( `Standard Gamepad^en ) 1 つしかない。 対応付直すときは、[ `axes$m, `buttons$m ]内の各~indexは, 下に与える図式における物理的な所在にアリな限り近く対応するベキである。 加えて、 `mapping$m を `standard$l に設定するベキである。 ◎ There is currently one canonical layout, the Standard Gamepad. When remapping, the indices in axes and buttons should correspond as closely as possible to the physical locations in the diagram below. Additionally, mapping SHOULD be set to "standard".
`標準~gamepad$を成す各~buttonは、 次に挙げるものに~lay-outされる: ◎ The Standard Gamepad buttons are laid out in\
- 左~clusterを成す 4 個の~button ◎ a left cluster of four buttons,\
- 右~clusterを成す 4 個の~button ◎ a right cluster of four buttons,\
- 中央~clusterを成す 3 個の~button ◎ a center cluster of three buttons,\
- ~gamepadの~~前方に面した【利用者から見て奥側】, 左右各側に 2 個ずつある~button ◎ and a pair of front facing buttons on the left and right side of the gamepad.\
`標準~gamepad$を成す 4 個の軸は、 左右各側にある~analog~stickに 2 軸ずつ結付けられる。 ◎ The four axes of the "Standard Gamepad" are associated with a pair of analog sticks, one on the left and one on the right.\
下の表tに、 `標準~gamepad$を成す各[ ~button / 軸 ], その物理的な所在を述べる。 ◎ The following table describes the buttons/axes and their physical locations.
所与の[ 軸/~button ]入力の `正準的~index@ は、 当の[ 軸/~button ]が`標準~gamepad$の ある[ 軸/~button ]を “表現する” ならば,後者の[ 軸/~button ]の~index(下の表tを見よ)、 他の場合は ε とする†。 ここでの “表現する” かどうかは、 次に従う: ◎ ↓
-
軸~入力は、 次を満たすならば, `標準~gamepad軸を表現する@ とされる ⇒ ある~thumbstick軸【すなわち,物理的な~stick】用の入力~値を報告していて、[ 当の~thumbstickの所在は,対応している`標準~gamepad$の ある軸とほぼ同じである(下の図) ]かつ[ 当の軸の方位(上下/左右)は`標準~gamepad$の軸の方位に合致する ] ◎ An axis input represents a Standard Gamepad axis if it reports the input value for a thumbstick axis, the thumbstick is located in approximately the same location as the corresponding Standard Gamepad thumbstick, and the orientation of the axis (up-down or left-right) matches the orientation of the Standard Gamepad axis.\
`標準~gamepad$の同じ軸を表現する軸が複数ある場合、 `~UA$は,[ それらのうち一つを`標準~gamepad$の軸として選定した上で, 他の軸には異なる~indexをアテガう ]ベキである。 ◎ If there are multiple axes that represent the same Standard Gamepad axis, then the user agent SHOULD select one to be the Standard Gamepad axis and assign a different index to the other axis.
-
~button入力は、 次を満たすならば `標準~gamepad~buttonを表現する@ とされる ⇒ ある~button(あるいは引金)用の入力~値を報告していて, 当の~buttonの所在は、 対応する`標準~gamepad$の ある~buttonとほぼ同じである(下の図)。 ◎ A button input represents a Standard Gamepad button if it reports the input value for a button or trigger, and the button or trigger is located in approximately the same location as the corresponding Standard Gamepad button. ◎ ↑If an axis or button input represents a Standard Gamepad axis or button, then its canonical index is the index of the corresponding Standard Gamepad axis or button.
【† “他の場合は ε” は、 他所を簡潔に述べるための,この訳による追加。 】
種別 | ~index | 所在 |
---|---|---|
~button | 0 | 右~cluster内の下~button |
1 | 右~cluster内の右~button | |
2 | 右~cluster内の左~button | |
3 | 右~cluster内の上~button | |
4 | 前面~左上~button | |
5 | 前面~右上~button | |
6 | 前面~左下~button | |
7 | 前面~右下~button | |
8 | 中央~cluster内の左~button( “select” / “back” ) | |
9 | 中央~cluster内の右~button( “start” / “forward” ) | |
10 | 左~stickに一体化された~button | |
11 | 右~stickに一体化された~button | |
12 | 左~cluster内の上~button | |
13 | 左~cluster内の下~button | |
14 | 左~cluster内の左~button | |
15 | 左~cluster内の右~button | |
16 | 中央~cluster内の中央~button | |
軸 | 0 | 左~stick用の水平-軸(左側は負/右側は正) |
1 | 左~stick用の垂直-軸(上側は負/下側は正) | |
2 | 右~stick用の水平-軸(左側は負/右側は正) | |
3 | 右~stick用の垂直-軸(上側は負/下側は正) |
12.1. 指紋収集の軽減
`Gamepad$I ~objの能力を検分することは、 能動的な指紋収集の手段として利用され得る。 ~UAは、 ~APIを通して公開される装置~情報を,指紋収集~表口を抑制するよう改めてもヨイ。 例えば,実装は、 `Gamepad$I ~objが有する[ ~button, 軸 ]の個数を`標準~gamepad$の~layoutにて定義されるものと正確に同じにするよう要求できる — 当の接続された装置に在る入力は,もっと[ 多い/少ない ]場合でも。 `FINGERPRINTING-GUIDANCE$r ◎ Inspecting the capabilities of Gamepad objects can be used as a means of active fingerprinting. The user agent MAY alter the device information exposed through the API to reduce the fingerprinting surface. As an example, an implementation can require that a Gamepad object have exactly the number of buttons and axes defined in the Standard Gamepad layout even if more or fewer inputs are present on the connected device. [FINGERPRINTING-GUIDANCE]
13. 用法~例
◎非規範的代表的な~gamepadへの~accessを,次の例にデモる。 `requestAnimationFrame()$m ~methodとの関係性に注意。 ◎ The example below demonstrates typical access to gamepads. Note the relationship with the requestAnimationFrame() method. ◎ Example 2
function %runAnimation() {
window.requestAnimationFrame(%runAnimation);
for (const %pad of navigator.getGamepads()) {
/*
%pad`.axes^c, %pad`.buttons^c を表示する単純なデモをここに記す
◎
todo; simple demo of displaying pad.axes and pad.buttons
*/
console.log(%pad);
}
}
window.requestAnimationFrame(%runAnimation);
最善な実施: `requestAnimationFrame()^m との協調 ◎ Best Practice 1: Coordination with requestAnimationFrame()
`requestAnimationFrame()$m ~methodを利用している対話的な~appは、 概して,~animationを駆動して,~animationを利用者の~gamepad入力と協調したいと求めることになる。 そのようなわけで,~gamepad~dataは、 アリな限り~animation~callbackが実行される直前近くに~pollして, ~animationの更新周期に合致させるベキである。 すなわち,~animation~callbackが 60Hz で稼働しているなら、 ~gamepad入力も,その~rateで標本化されるベキである。 ◎ Interactive applications will typically be using the requestAnimationFrame() method to drive animation, and will want coordinate animation with user gamepad input. As such, the gamepad data should be polled as closely as possible to immediately before the animation callbacks are executed, and with frequency matching that of the animation. That is, if the animation callbacks are running at 60Hz, the gamepad inputs should also be sampled at that rate.
14. `gamepadconnected@et ~event
ある~gamepad装置 %~gamepad装置 が~system上で可用になったときは、 次の手続きを走らす: ◎ When a gamepad becomes available on the system, run the following steps:
- %文書 ~LET `現在の大域~obj$に`結付けられた文書$ — 他の場合【?】は ~NULL ◎ Let document be the current global object's associated Document; otherwise null.
- ~IF[ %文書 ~NEQ ~NULL ]~AND[ %文書 には `gamepad$l 特能【!permission】の`利用は許容されて$いない ] ⇒ ~RET ◎ If document is not null and is not allowed to use the "gamepad" permission, then abort these steps.
-
`~taskを~queueする$( `~gamepad~task~source$, 次の手続き ) ◎ Queue a task on the gamepad task source to perform the following steps:
手続きは: ◎ ↑
- %~gamepad ~LET %~gamepad装置 を表現している`新たな~gamepad$() ◎ Let gamepad be a new Gamepad representing the gamepad.
- %~navigator ~LET %~gamepad に`関連な大域~obj$に`結付けられた~Navigator$ ◎ Let navigator be gamepad's relevant global object's Navigator object.
- %~navigator.`gamepads$sl[ %~gamepad.`index$m ] ~SET %~gamepad ◎ Set navigator.[[gamepads]][gamepad.index] to gamepad.
-
~IF[ %~navigator.`hasGamepadGesture$sl ~EQ ~T ]: ◎ If navigator.[[hasGamepadGesture]] is true:
- %~gamepad.`exposed$sl ~SET ~T ◎ Set gamepad.[[exposed]] to true.
- ~IF[ %文書 ~NEQ ~NULL ]~AND[ %文書 は`全部的に作動中$である ] ⇒ `~eventを発火する$( %~gamepad に`関連な大域~obj$, `gamepadconnected$et, `GamepadEvent$I ) — 次のように初期化して ⇒ `gamepad$m 属性 ~SET %~gamepad ◎ If document is not null and is fully active, then fire an event named gamepadconnected at gamepad's relevant global object using GamepadEvent with its gamepad attribute initialized to gamepad.
この仕様を実装している~UAは、 `gamepadconnected$et と命名される新たな~DOM~eventを供するモノトスル。 対応する~eventは、[ `GamepadEvent$I ~interfaceを利用する, および `Window$I ~objに向けて発火する ]モノトスル。 ◎ User agents implementing this specification must provide a new DOM event, named gamepadconnected. The corresponding event MUST be of type GamepadEvent and MUST fire on the Window object.
`~UA$は,利用者が~gamepadを接続したときは、 `gamepadconnected$et ~eventを配送して,それを指示するモノトスル。 ~pageが読込まれた時点で,~gamepadはすでに接続されていた場合、 利用者が~buttonを押すか軸を動かしたとき,この~eventを配送するベキである。 ◎ A user agent MUST dispatch this event type to indicate the user has connected a gamepad. If a gamepad was already connected when the page was loaded, the gamepadconnected event SHOULD be dispatched when the user presses a button or moves an axis.
15. `gamepaddisconnected@et ~event
ある~gamepadが~system上で可用でなくなったときは、 次の手続きを走らす: ◎ When a gamepad becomes unavailable on the system, run the following steps:
- %~gamepad ~LET 可用でなくなった装置を表現している `Gamepad$I ◎ Let gamepad be the Gamepad representing the unavailable device.
-
`~taskを~queueする$( `~gamepad~task~source$, 次の手続き ) ◎ Queue a task on the gamepad task source to perform the following steps:
手続きは: ◎ ↑
- %~gamepad.`connected$sl ~SET ~F ◎ Set gamepad.[[connected]] to false.
- %文書 ~LET %~gamepad に`関連な大域~obj$に`結付けられた文書$ — 他の場合【?】は ~NULL ◎ Let document be gamepad's relevant global object's associated Document; otherwise null.
- ~IF[ %~gamepad.`exposed$sl ~EQ ~T ]~AND[ %文書 ~NEQ ~NULL ]~AND[ %文書 は`全部的に作動中$である ] ⇒ `~eventを発火する$( %~gamepad に`関連な大域~obj$, `gamepaddisconnected$et, `GamepadEvent$I ) — 次のように初期化して ⇒ `gamepad$m 属性 ~SET %~gamepad ◎ If gamepad.[[exposed]] is true and document is not null and is fully active, then fire an event named gamepaddisconnected at gamepad's relevant global object using GamepadEvent with its gamepad attribute initialized to gamepad.
- %~navigator ~LET %~gamepad に`関連な大域~obj$に`結付けられた~Navigator$ ◎ Let navigator be gamepad's relevant global object's Navigator object.
- %~gamepad群 ~LET %~navigator.`gamepads$sl ◎ ↓
- %~gamepad群[ %~gamepad.`index$m ] ~SET ~NULL ◎ Set navigator.[[gamepads]][gamepad.index] to null.
- ~WHILE[ %~gamepad群 は`空$でない ]~AND[ %~gamepad群 を成す最後の`~item$ ~EQ ~NULL ] ⇒ %~gamepad群 から最後の`~item$を`除去する$ ◎ While navigator.[[gamepads]] is not empty and the last item of navigator.[[gamepads]] is null, remove the last item of navigator.[[gamepads]].
この仕様を実装している~UAは、 `gamepaddisconnected$et と命名される新たな~DOM~eventを供するモノトスル。 対応する~eventは、[ `GamepadEvent$I ~interfaceを利用する, および `Window$I ~objに向けて発火する ]モノトスル。 ◎ User agents implementing this specification must provide a new DOM event, named gamepaddisconnected. The corresponding event MUST be of type GamepadEvent and MUST fire on the Window object.
`~UA$は,~gamepadが切断されたときは、[ 以前に,その~gamepad用の `gamepadconnected$et ~eventを `Window$I に向けて配送していた ]ならば,同じ `Window$I に向けて `gamepaddisconnected$et ~eventを配送するモノトスル。 ◎ When a gamepad is disconnected from the user agent, if the user agent has previously dispatched a gamepadconnected event for that gamepad to a Window, a gamepaddisconnected event MUST be dispatched to that same Window.
16. 他の~event
軸や~buttonの変化-用の~eventも含めるかどうか,もっと論が必要である。 含める場合、 それらを一緒に転がすか( `gamepadchanged^et ?),または[ 多少,あるいは[ 軸/~button ]ごとに個別に ]分離するか( `gamepadaxischanged^et ?)についても。 ◎ More discussion needed, on whether to include or exclude axis and button changed events, and whether to roll them more together ("gamepadchanged"?), separate somewhat ("gamepadaxischanged"?), or separate by individual axis and button.
17. `WindowEventHandlers^I ~interface~mixinに対する拡張
この仕様は、 ~HTMLの `WindowEventHandlers$I ~interface~mixinを拡張して, ~event~handlerの登録を手助けするための`~event~handler~IDL属性$を追加する。 ◎ This specification extends the WindowEventHandlers interface mixin from HTML to add event handler IDL attributes to facilitate the event handler registration.
partial interface mixin `WindowEventHandlers$I { attribute `EventHandler$I `ongamepadconnected@m; attribute `EventHandler$I `ongamepaddisconnected@m; };
【 名前から明らかなように、 順に[ `gamepadconnected$et, `gamepaddisconnected$et ]~event用。 】
18. 許可~施策との統合
この仕様は、 文字列 `gamepad@l で識別される`施策により制御される特能$を定義する。 その`既定の許容list$は、 `全~生成元$i とする。 ◎ This specification defines a policy-controlled feature identified by the string "gamepad". Its default allowlist is *.
注記: `文書$ %文書 の`許可~施策$docは、[ %文書 内の内容には、 `getGamepads()$m への~accessは許容されるかどうか ]を決定する。 %文書 内で不能化された場合、[ %文書 内のどの内容にも `getGamepads()$m の`利用は許容され$ない ]ことに加え,[ `gamepadconnected$et / `gamepaddisconnected$et ]~eventは発火されない。 ◎ Note A document’s permissions policy determines whether any content in that document is allowed to access getGamepads(). If disabled in any document, no content in the document will be allowed to use getGamepads(), nor will the gamepadconnected and gamepaddisconnected events fire.
謝辞
◎非規範的この文書の開発に貢献された次に挙げる方々に: ◎ The following people contributed to the development of this document.
【 各氏に伴われる~link先は、 省略する(原文を参照されたし)。 】