08.ゲームパッドも使う
上:t, 下:b, 左:f, 右:h *操作が反映されない場合、画面部分を一度クリックしてみてください
ゲームパッドも使う
おまけです。
キーボードで遊べるようになりましたが、やはりゲームパッドも使いたい。
キー操作実装のときにワンクッションとして作っておいた evStat に活躍していただきましょう。
gconsole2.js に手をいれるので、これまでの内容に不整合が起きないように、gconsole3.js とします。
const screen = (function () {
/* 中略 */
// pad
let padStat = 0;
function mergePadKeys() {
const pad = (navigator.getGamepads() || []).shift();
if (pad) {
const axes = pad.axes;
const buttons = pad.buttons;
const limit = 0.5;
Key.evStat &= (padStat ^ 0xFF);
padStat = 0;
if (axes[0] < -limit || axes[0] > limit) {
padStat |= (axes[0] > 0) ? Key.map.R : Key.map.L;
}
if (axes[1] < -limit || axes[1] > limit) {
padStat |= (axes[1] > 0) ? Key.map.D : Key.map.U;
}
if (buttons[0].pressed) {
padStat |= Key.map.Z;
}
if (buttons[1].pressed) {
padStat |= Key.map.X;
}
Key.evStat |= padStat;
Key.update();
}
};
/* 中略 */
return {
/* 中略 */
padRefresh: function () {
mergePadKeys();
},
/* 以下略 */
かなり乱暴な感じでゲームパッドの判定を行っていますが、たぶんだいたい動きます。一人用。
※追記:axisについては接続機器によってはaxis[6],axis[7]だったりとかするようです。
キーコンフィグとかで設定できるようにすると良さそうですが、面倒ならとりあえず偶数・奇数とか
そういうので全走査しても何とかなるかも知れません。
意味があるかどうかは別として、キー入力と共存するためにパッドの入力状況は保持しておき、その前回状態をもとにクリアしてから処理しています。
このため、キーとパッドで同じ意味の操作をしている場合、押下解除はパッドのほうが優先判定されることになります。
キーを押しっぱなしにしていても、このために一瞬だけ押下していないような振る舞いになりますが、前提となる操作をそもそもしないでしょうから、困ることはないでしょう。
キー入力と違って、操作のイベントリスナーが設定されていませんので、ループ中に処理してあげる必要があります。g08.js に組み込みます。
/* 前略 */
function gameFrame() {
const t = performance.now();
let loop = true;
screen.padRefresh(); // ←ここに差し込みました
myship.move();
/* 以下略 */
キー入力判定が行われる前ならどこでも大丈夫です。
リソース
gconsole.css
gconsole3.js
g08.js
関連
00.画面表示
01.文字出力
02.無限ループ
03.画像出力
04.キー操作
05.速度を調整
06.敵の配置
07.ゲームにする