phinajs / phina.js

phina.js is game library
http://phinajs.com
MIT License
308 stars 48 forks source link

指を離すと同時にタップをするとtouchStart判定が二重になってしまう #244

Open pentamania opened 6 years ago

pentamania commented 6 years ago

タッチパネル端末で、指を離すと同時にタップを行うとタッチ開始判定が二重になってしまうバグがありました。

// Sceneクラス
update: (app) {
  app.pointers.forEach(function(p) {
    if (p.getPointingStart()) {
      // ここの処理が2フレームに渡って実行され、結果二重判定になる
    }
  });
},

調べてみるとTouchList.updateで、離れたtouchに対してspliceで配列操作をしてしまっているため、ループがうまく回らずtouchstartした方のtouchオブジェクトが更新されないのが原因のようです。

https://github.com/phinajs/phina.js/blob/4cc88515d4dfbedefd6a812f2829458819db265c/src/input/touch.js#L153-L174

色々解決法はあると思いますが、とりあえずforEachではなく、ネガティブforループにすることで解決できましたのでご参考までに。

    update: function() {
      if (this.touches.length > 0) {
        for (var i = this.touches.length - 1; i >= 0; i--) {
          var touch = this.touches[i];
          if (!touch.released) {
            touch.update();

            if (touch.flags === 0) {
              touch.released = true;
            }
          }
          else {
            touch.released = false;
            this.removeTouch(touch);
          }
        }
      }
    },

(自分でPRを出すかもしれませんが、一応issueとして上げときます。)