眠気の夜の後、私はこの質問について、少なくとも私にとっては根本的に頭がおかしいと思う何かを発見しました.
上記の私のコードのように、マウスの座標は正確ではありません(移動が発生したときにキャンバス全体を再作成する必要がある高速処理であると思います)。このコードを少しずつテストしたところ、問題はループにあるのではなく、精度にあることがわかりました。
if ((newMouseX !== mouseX) && (newMouseY !== mouseY)).
コードのこの部分をより遅い時間でテストした場合 (「停止」したときに目が座標の違いを検出できるようになりますnewMouseX
) mouseX
9% の確率で、約 1% の確率でしかありません (統計は測定していませんが、数回のテストで選んだものです)。
私はそれをフィドルで動作させることはできませんが、それをテスト場にコピーして、私の意味を確認できると思います. フィドルで動作させることができれば素晴らしいので、専門家はそれを短くすることができます:)
これは、マウスが「停止」する必要がある場合でも、コードによって「動いている」と見なされ、その間に数回「停止」するため、ループを1秒間に何度も呼び出すことを意味します。これが問題です持っています。
これをテストし、統計的な精度/アドバイスを思いつくことができる人を含む、他の専門家からのコメントを喜んで聞きます.
私のアドバイスと当面の解決策は、いずれかの座標の差が 10 ピクセルを超える場合の動きを考慮することです。もちろん、これには問題がありますが、より良い解決策が見つかるまで、そのままにしておくことができます。
だから代わりに
if ((newMouseX !== mouseX) && (newMouseY !== mouseY))
利用した
if (( Math.abs(newMouseX - mouseX) > 10) || ( Math.abs(newMouseY != mouseY) > 10) )
考慮すべきもう1つのことは、マウスの位置がターゲットキャンバス領域から外れるときの対処方法です...現時点では無限の動きのように見えます!
質問:
mouseX
&を比較できるように、正確なマウス座標を取得するにはどうすればよいnewMouseX
ですか?
ありがとう。