Baseline Widely available *
HTML ã¯ãªããã§ã¤ã³ã¿ã©ã¯ãã£ããªã²ã¼ã ãéçºããããã«å¿
è¦ãªã³ã³ãã¼ãã³ããå¤ãæè¼ãã¦ãã¾ãã <canvas>
ã WebGLã <audio>
ã« <video>
ãªã©ã®æè¡ã¯ãä»ã¾ã§ãã¤ãã£ãã³ã¼ããæ¸ãå¿
è¦ã®ãã£ãæ©è½ã«å¯¾å¿ã§ããã»ã©ã«æé·ãã¾ãããã²ã¼ã ããã API ã¯éçºè
ã¨ãã¶ã¤ãã¼ã«ã²ã¼ã ããããã³ã³ããã¼ã©ã¼ã¸ã®ã¢ã¯ã»ã¹ãæä¾ãããã®ã§ãã
ã²ã¼ã ããã API 㯠Window
ãªãã¸ã§ã¯ãã«ã²ã¼ã ãããã¨ã³ã³ããã¼ã©ã¼ï¼ä»¥ä¸ãã²ã¼ã ãããï¼ã®ç¶æ
ãèªã¿åãæ°ããã¤ãã³ããããã¤ã追å ãã¾ããããã«ã Gamepad
ã¨ããã²ã¼ã ãããã®æ¥ç¶ç¶æ
ãå¾ããããªãã¸ã§ã¯ã㨠navigator.getGamepads()
ã¨ããã²ã¼ã ãããã®ä¸è¦§ãåå¾ã§ããã¡ã½ããã追å ããã¾ãã
æ°ããã²ã¼ã ããããæ¥ç¶ãããæãã¢ã¯ãã£ããªãã¼ã¸ã¯ gamepadconnected
ã¤ãã³ããåãåãã¾ãããã¼ã¸èªã¿è¾¼ã¿æã«ã²ã¼ã ãããããã§ã«æ¥ç¶ããã¦ããå ´åãã²ã¼ã ãããã®ãã¿ã³ãæ¼ããªã©ã®æä½ãããæã« gamepadconnected
ã¤ãã³ããã¢ã¯ãã£ããªãã¼ã¸ã«å¯¾ãã¦çºçãã¾ãã
ã¡ã¢: Firefox ã§ã¯ããã¼ã¸ãè¦ããç¶æ ã§ãã¤ã¦ã¼ã¶ã¼ã«ããã²ã¼ã ãããã®æä½ãåãä»ããã¨ãã«ã®ã¿ãã²ã¼ã ããããå©ç¨å¯è½ã«ãªãã¾ããããã«ãã£ã¦ãã¦ã¼ã¶ã¼ãç¹å®ãããã£ã³ã¬ã¼ããªã³ãã£ã³ã°ã«å©ç¨ããããã¨ã鲿¢ãã¦ãã¾ãããã£ããä¸ã¤ã®ã³ã³ããã¼ã©ã¼ãæä½ãããã°ãä»ã®ã³ã³ããã¼ã©ã¼ãèªåã§æ¥ç¶ããå©ç¨å¯è½ã«ãªãã¾ãã
以ä¸ã®ããã«ã㦠gamepadconnected
ã使ç¨ãã¾ãã
window.addEventListener("gamepadconnected", (e) => {
console.log(
"Gamepad connected at index %d: %s. %d buttons, %d axes.",
e.gamepad.index,
e.gamepad.id,
e.gamepad.buttons.length,
e.gamepad.axes.length,
);
});
ã²ã¼ã ãããã¯ããããåºæã® ID ãã¤ãã³ãã® gamepad
ããããã£ã®ä¸ã«æã£ã¦ãã¾ãã
ã²ã¼ã ããããåæãããã¨ãããã¼ã¸ã«ä»¥åãã®ã²ã¼ã ãããã®ããã«åä¿¡ãããã¼ã¿ï¼ä¾: gamepadconnected
ï¼ãããã¨ã 2 çªç®ã®ã¤ãã³ãã gamepaddisconnected
ããã©ã¼ã«ã¹ã®ããã¦ã£ã³ãã¦ã«é
ä¿¡ããã¾ãã
window.addEventListener("gamepaddisconnected", (e) => {
console.log(
"Gamepad disconnected from index %d: %s",
e.gamepad.index,
e.gamepad.id,
);
});
ã²ã¼ã ãããã® index
ããããã£ã¯ãåã種é¡ã®è¤æ°ã®ã³ã³ããã¼ã©ã¼ã使ç¨ããã¦ããå ´åã§ãã£ã¦ããã·ã¹ãã ã«æ¥ç¶ãããæ©å¨ãã¨ã«åºæã«ãªãã¾ãã index
ããããã£ãã¾ã Navigator.getGamepads()
ããè¿ããã Array
ã®ã¤ããã¯ã¹ã¨ãã¦æ©è½ãã¾ãã
const gamepads = {};
function gamepadHandler(event, connected) {
const gamepad = event.gamepad;
// Note:
// gamepad === navigator.getGamepads()[gamepad.index]
if (connected) {
gamepads[gamepad.index] = gamepad;
} else {
delete gamepads[gamepad.index];
}
}
window.addEventListener(
"gamepadconnected",
(e) => {
gamepadHandler(e, true);
},
false,
);
window.addEventListener(
"gamepaddisconnected",
(e) => {
gamepadHandler(e, false);
},
false,
);
ãã®åã®ä¾ã§ã¯ã¤ãã³ããå®äºããå¾ã« gamepad
ããããã£ãã©ã®ããã«ä¿æã§ãããã示ãã¦ãã¾ã - å¾ã§ããã¤ã¹ã®ç¶æ
ç
§ä¼ã®ããã«ä½¿ç¨ããæè¡ã¨ãªãã¾ãã
ã覧ã®ããã«ãä¸è¿°ã® gamepad ã¤ãã³ã㯠Gamepad
ãªãã¸ã§ã¯ããè¿ãã¤ãã³ããªãã¸ã§ã¯ããä¸ã® gamepad
ã®ããããã£ãå«ã¾ãã¦ãã¾ããè¤æ°ã®ã²ã¼ã ãããï¼ããªãã¡ããã® IDï¼ãä¸åº¦ã«æ¥ç¶ãããå¯è½æ§ããããããã¤ãã³ããçºçãããã®ã¯ã©ã®ã²ã¼ã ããããæ±ºå®ããããã«ãããã使ç¨ãããã¨ãã§ãã¾ããããã¸ã®åç
§ãä¿æããããããã¿ã³ã軸ã®ããããã®æç¹ã§æ¼ããã¦ããããç¥ãããã«ç
§ä¼ãããªã©ãGamepad
ãªãã¸ã§ã¯ãããæ§ã
ãªãã¨ãè¡ããã¨ãã§ãã¾ãããããããã¨ã§ãå¤ãã®å ´åãä»åã¨æ¬¡åã®ã¤ãã³ãçºçã¨ã²ã¼ã ãããã®ç¶æ
ãç¥ã£ã¦ããå¿
è¦ããããã²ã¼ã ããã®ä»ã®ã¤ã³ã¿ã©ã¯ãã£ããªã¦ã§ããã¼ã¸ã§ãããã¨ãæã¾ããã§ãã
ãã®ãããªãã§ãã¯ãå®è¡ããã¨ãéçºè
ã¯ã²ã¼ã ããããã²ã¼ã ãããã®ç¶æ
ã«åºã¥ãã¦ãç¾å¨ã®ãã¬ã¼ã ã®ããã®æææ±ºå®ãè¡ãããã«å¿
è¦ãªã¢ãã¡ã¼ã·ã§ã³ã«ã¼ã (ä¾ : requestAnimationFrame
) ã¨ä¸ç·ã« Gamepad
ãªãã¸ã§ã¯ãã使ç¨ãã¦é¢ä¸ããå¾åãããã¾ãã
Navigator.getGamepads()
ã¡ã½ããã¯ç¾å¨ã¦ã§ããã¼ã¸ããè¦ãã Gamepad
ãªãã¸ã§ã¯ã (ã²ã¼ã ããããç¹ãã£ã¦ããªãæã¯æ¯å null ãè¿ããã ) ã®ãããªããã¹ã¦ã®ããã¤ã¹ãé
åã¨ãã¦æ»ãã¾ããããã¯ãåãæ
å ±ãå¾ãããã«ä½¿ç¨ãããã¨ãã§ãã¾ããä¾ãã°ãä¸è¨ã®æåã®ã³ã¼ãä¾ã¯ä¸è¨ã«ç¤ºãããã«æ¸ãæãããã¨ãã§ãã¾ãã
window.addEventListener("gamepadconnected", (e) => {
const gp = navigator.getGamepads()[e.gamepad.index];
console.log(
"Gamepad connected at index %d: %s. %d buttons, %d axes.",
gp.index,
gp.id,
gp.buttons.length,
gp.axes.length,
);
});
Gamepad
ãªãã¸ã§ã¯ãã®æ©è½ã¯ä»¥ä¸ã®éãã§ãã
id
: ã³ã³ããã¼ã©ã¼ã«é¢ããæ
å ±ãå«ãã æååã§ããããã¯å³å¯ã«ã¯æå®ããã¦ããªããFirefox ã§ã¯ãã³ã³ããã¼ã©ã¼ã® USB ãã³ãã¼ã¨è£½å ID ãå«ãã§ãã 2 ã¤ã® 4 æ¡ 16 鲿°ååãããã³ãã©ã¤ãã¼ããæä¾ããããããªã³ã³ããã¼ã©ã¼ã®ååã¨ãã£ã 3 ã¤ã®æ
å ±ããããã·ã¥ (-
) ã«ããåé¢ããå«ã¾ãã¦ãã¾ãããã®æ
å ±ã¯ã¦ã¼ã¶ã¼ã¸ã®æçãªãã£ã¼ãããã¯ã表示ããã¨ã¨ãã«ãããã¤ã¹ã®ã³ã³ããã¼ã«ã®ãããã³ã°ãè¦ã¤ãããã¨ãã§ããããã«ãã¾ãã
index
: ç¾å¨ã·ã¹ãã ã«æ¥ç¶ããã¦ããã²ã¼ã ããããã¨ã«åºæã®æ´æ°ããã®å¤ã¯è¤æ°ã®ã³ã³ããã¼ã©ã¼ãåºå¥ããããã«ä½¿ç¨ã§ãã¾ããããã¤ã¹ãåæãã¦ããæ°ããããã¤ã¹ãæ¥ç¶ããã¨ã以åã®ã¤ã³ããã¯ã¹ãåå©ç¨ããããã¨ã«æ³¨æãã¦ãã ããã
mapping
: ãã©ã¦ã¶ã¼ãããã¤ã¹ä¸ã®ã³ã³ããã¼ã«ãæ¢ç¥ã®ã¬ã¤ã¢ã¦ãã«åããããããã©ããã示ãæååãç¾å¨ããµãã¼ãããã¦ããæ¢ç¥ã®ã¬ã¤ã¢ã¦ã - æ¨æºã®ã²ã¼ã ããã㯠1 ã¤ããããã¾ããããã©ã¦ã¶ã¼ãããã¤ã¹ä¸ã®ã³ã³ããã¼ã«ããã®ã¬ã¤ã¢ã¦ãã«ãããã³ã°ã§ããå ´åã mapping
ããããã£ã¯æåå standard
ã«è¨å®ããã¾ãã
connected
:ã²ã¼ã ããããã·ã¹ãã ã«æ¥ç¶ããã¦ãããã©ããã示ããã¼ã«å¤ãããæ¥ç¶ããã¦ããå ´å㯠True
ãæ¥ç¶ããã¦ããªãå ´å㯠False
ãè¨å®ããã¾ãã
buttons
: ããã¤ã¹ä¸ã«åå¨ãããã¿ã³ã表ã GamepadButton
ãªãã¸ã§ã¯ãã®é
åãå GamepadButton
ã«ã¯ãpressed
ããããã£ã¨ value
ã®ããããã£ãããã¾ãã
pressed
ããããã£ã¯ããã¿ã³ãç¾å¨æ¼ããã¦ãã (true
) ãæ¼ããã¦ããªã (false
) ãã示ããã¼ã«å¤ã§ãã>value
ããããã£ã¯ãç¾ä»£ã®å¤ãã®ã²ã¼ã ãããã®ããªã¬ãªã©ãã¢ããã°ãã¿ã³ã®è¡¨ç¤ºãæå¹ã«ããããã«ä½¿ç¨ãããæµ®åå°æ°ç¹å¤ã§ããå¤ã¯ 0.0..1.0 ã®ç¯å²ã«æ£è¦åããã 0.0 ã¯æ¼ããã¦ããªããã¿ã³ã表ãã 1.0 ã¯å®å
¨ã«æ¼ããããã¿ã³ã表ãã¾ããaxes
: ããã¤ã¹ä¸ã«è»¸ãããã³ã³ããã¼ã«ã表ãé
å (ä¾ï¼ã¢ããã°ãµã ã¹ãã£ãã¯)ã é
åã®åã¨ã³ããªã¼ã¯-1.0ã1.0 ã®ç¯å²ã®æµ®åå°æ°ç¹å¤ã§ãæå°å¤ (-1.0) ããæå¤§å¤ (1.0) ã¾ã§ã®è»¸ã®ä½ç½®ã表ãã¾ãã
timestamp
: ãã®ã²ã¼ã ãããã®ãã¼ã¿ãæå¾ã«æ´æ°ãããæå»ã表ã DOMHighResTimeStamp
ãè¿ãã¾ãããã®å¤ã«ãããéçºè
㯠axes
㨠button
ã®ãã¼ã¿ããã¼ãã¦ã§ã¢ããæ´æ°ããããã©ããã夿ã§ãã¾ãã å¤ã¯ã PerformanceTiming
ã¤ã³ã¿ã¼ãã§ã¤ã¹ã® navigationStart
屿§ã¨ã®ç¸å¯¾å¤ã§ãªããã°ãªãã¾ããã å¤ã¯å調ã«å¢å ãã¾ããã¤ã¾ããæ´æ°ã®é åºã決å®ããããã«æ¯è¼ãããã¨ãã§ãã¾ããæ°ããå¤ã¯å¸¸ã«å¤ãå¤ããã大ãããçããããã§ãããã®ããããã£ã¯ç¾å¨ Firefox ã§ã¯ãµãã¼ãããã¦ãã¾ããã
ã¡ã¢: Gamepad ãªãã¸ã§ã¯ãã¯ãã»ãã¥ãªãã£ä¸ã®çç±ãã Window
ãªãã¸ã§ã¯ãã§ã¯ãªã gamepadconnected
ã¤ãã³ãã§ä½¿ç¨ã§ãã¾ããä¸åº¦åç
§ãåå¾ããã¨ããã®ããããã£ã§ã²ã¼ã ãããã®ç¾å¨ã®ç¶æ
ã«é¢ããæ
å ±ãç
§ä¼ã§ãã¾ãã ãã®ãªãã¸ã§ã¯ãã¯ãã²ã¼ã ãããã®ç¶æ
ãå¤ãããã³ã«æ´æ°ããã¾ãã
1 ã¤ã®ã²ã¼ã ãããã®æ¥ç¶æ å ±ã表示ããç°¡åãªä¾ãè¦ã¦ã¿ã¾ããã (å¾ç¶ã®ã²ã¼ã ãããæ¥ç¶ãç¡è¦ãã¾ã)ãã²ã¼ã ãããã®å³å´ã«ãã 4 ã¤ã®ã²ã¼ã ããããã¿ã³ã使ç¨ãã¦ãã¼ã«ãç»é¢ã®å¨ãã«ç§»åã§ãã¾ãããã¢ãã©ã¤ãã§è¦ããã¨ãã§ããã¨ãã§ããGithub ã§ã½ã¼ã¹ã³ã¼ããè¦ã¤ãããã¨ãã§ãã¾ãã
ã¾ããããã¤ãã®å¤æ°ã宣è¨ãã¾ããæ¥ç¶æ
å ±ãæ¸ãè¾¼ã¾ãã gamepadInfo
ã®ãã©ã°ã©ããç§»åãã ball
ãrequestAnimation Frame
ã® ID ã¨ãã¦æ©è½ãã start
夿°ããã¼ã«ãç§»åããããã®ä½ç½®å¤æ´åã¨ãã¦æ©è½ãã a ããã³ b 夿°ãããã³çç¸®å½¢å¤æ° ããã¯ã requestAnimationFrame()
ããã³ cancelAnimationFrame()
ã¯ãã¹ãã©ã¦ã¶ã¼ãã©ã¼ã¯ã§ä½¿ç¨ããã¾ãã
const gamepadInfo = document.getElementById("gamepad-info");
const ball = document.getElementById("ball");
let start;
let a = 0;
let b = 0;
次㫠gamepadconnected
ã¤ãã³ãã使ç¨ãã¦ãæ¥ç¶ããã¦ããã²ã¼ã ãããã確èªãã¾ããæ¥ç¶ããã㨠Navigator.getGamepads()
[0]
ã使ç¨ãã¦ã²ã¼ã ããããåå¾ããã²ã¼ã ãããã«é¢ããæ
å ±ãã²ã¼ã ãããã®æ
å ± div
ã«åºåããå
¨ä½ã®ãã¼ã«ã®åããå§ã¾ã gameLoop()
颿°ãå¼ã³åºããã¾ãã
window.addEventListener("gamepadconnected", (e) => {
const gp = navigator.getGamepads()[e.gamepad.index];
gamepadInfo.textContent = `Gamepad connected at index ${gp.index}: ${gp.id}. It has ${gp.buttons.length} buttons and ${gp.axes.length} axes.`;
gameLoop();
});
ããã§ gamepaddisconnected
ã¤ãã³ãã使ç¨ãã¦ãã²ã¼ã ããããåã³åæããããã©ããã確èªãã¾ãã ãããããªãã°ã requestAnimationFrame()
ã«ã¼ã (ä¸è¨åç
§) ã忢ããã²ã¼ã ãããã®æ
å ±ãå
ã®ç¶æ
ã«æ»ãã¾ãã
window.addEventListener("gamepaddisconnected", (e) => {
gamepadInfo.textContent = "Waiting for gamepad.";
cancelAnimationFrame(start);
});
ä»åº¦ã¯ã¡ã¤ã³ã®ã²ã¼ã ã«ã¼ãã§ããã«ã¼ããå®è¡ããããã³ã«ã4 ã¤ã®ãã¿ã³ã® 1 ã¤ãæ¼ããã¦ãããã©ããããã§ãã¯ããã¾ããããããã¨ãa
㨠b
ã®ç§»å夿°ã®å¤ãé©åã«æ´æ°ãã left
㨠top
ã®ããããã£ãæ´æ°ãããã®å¤ã a
ããã³ b
ã¨ãããããã¯ãã¼ã«ãç»é¢ã®å¨ãã«åãã广ãããã¾ãã
ãã®ä½æ¥ããã¹ã¦å®äºãããã requestAnimationFrame()
ã使ç¨ã㦠gameLoop()
ãåã³å®è¡ãã¦æ¬¡ã®ã¢ãã¡ã¼ã·ã§ã³ãã¬ã¼ã ãè¦æ±ãã¾ãã
function gameLoop() {
const gamepads = navigator.getGamepads();
if (!gamepads) {
return;
}
const gp = gamepads[0];
if (gp.buttons[0].pressed) {
b--;
}
if (gp.buttons[2].pressed) {
b++;
}
if (gp.buttons[1].pressed) {
a++;
}
if (gp.buttons[3].pressed) {
a--;
}
ball.style.left = `${a * 2}px`;
ball.style.top = `${b * 2}px`;
start = requestAnimationFrame(gameLoop);
}
å®å
¨ãªä¾: ã²ã¼ã ãããã®ç¶æ
ã®è¡¨ç¤º
ãã®ä¾ã§ã¯ã Gamepad
ãªãã¸ã§ã¯ããgamepadconnected
ã¤ãã³ãã gamepaddisconnected
ã¤ãã³ãã使ç¨ãã¦ã·ã¹ãã ã«æ¥ç¶ããã¦ãããã¹ã¦ã®ã²ã¼ã ãããã®ç¶æ
ã表示ãã¾ãããã®ä¾ã¯ Gamepad demo ã«åºã¥ãã¦ãããGitHub ã§å©ç¨ã§ããã½ã¼ã¹ã³ã¼ã ãããã¾ãã
let loopstarted = false;
window.addEventListener("gamepadconnected", (evt) => {
addgamepad(evt.gamepad);
});
window.addEventListener("gamepaddisconnected", (evt) => {
removegamepad(evt.gamepad);
});
function addgamepad(gamepad) {
const d = document.createElement("div");
d.setAttribute("id", `controller${gamepad.index}`);
const t = document.createElement("h1");
t.textContent = `gamepad: ${gamepad.id}`;
d.append(t);
const b = document.createElement("ul");
b.className = "buttons";
gamepad.buttons.forEach((button, i) => {
const e = document.createElement("li");
e.className = "button";
e.textContent = `Button ${i}`;
b.append(e);
});
d.append(b);
const a = document.createElement("div");
a.className = "axes";
gamepad.axes.forEach((axis, i) => {
const p = document.createElement("progress");
p.className = "axis";
p.setAttribute("max", "2");
p.setAttribute("value", "1");
p.textContent = i;
a.append(p);
});
d.appendChild(a);
// See https://github.com/luser/gamepadtest/blob/master/index.html
const start = document.querySelector("#start");
if (start) {
start.style.display = "none";
}
document.body.append(d);
if (!loopstarted) {
requestAnimationFrame(updateStatus);
loopstarted = true;
}
}
function removegamepad(gamepad) {
document.querySelector(`#controller${gamepad.index}`).remove();
}
function updateStatus() {
for (const gamepad of navigator.getGamepads()) {
if (!gamepad) continue;
const d = document.getElementById(`controller${gamepad.index}`);
const buttonElements = d.getElementsByClassName("button");
for (const [i, button] of gamepad.buttons.entries()) {
const el = buttonElements[i];
const pct = `${Math.round(button.value * 100)}%`;
el.style.backgroundSize = `${pct} ${pct}`;
if (button.pressed) {
el.textContent = `Button ${i} [PRESSED]`;
el.style.color = "#42f593";
el.className = "button pressed";
} else {
el.textContent = `Button ${i}`;
el.style.color = "#2e2d33";
el.className = "button";
}
}
const axisElements = d.getElementsByClassName("axis");
for (const [i, axis] of gamepad.axes.entries()) {
const el = axisElements[i];
el.textContent = `${i}: ${axis.toFixed(4)}`;
el.setAttribute("value", axis + 1);
}
}
requestAnimationFrame(updateStatus);
}
仿§æ¸ ãã©ã¦ã¶ã¼ã®äºææ§
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4