Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
pentamania opened this issue May 30, 2018 · 0 comments

Comments

@pentamania
Copy link
Contributor

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

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

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

phina.js/src/input/touch.js

Lines 153 to 174 in 4cc8851

removeTouch: function(touch) {
var i = this.touches.indexOf(touch);
this.touches.splice(i, 1);
},
update: function() {
this.touches.forEach(function(touch) {
if (!touch.released) {
touch.update();
if (touch.flags === 0) {
touch.released = true;
}
}
else {
touch.released = false;
this.removeTouch(touch);
}
}, this);
},

色々解決法はあると思いますが、とりあえず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として上げときます。)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant