何かの箱

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.ゲームにする