2010-12-28 12 views

答えて

11

問題が2Dである場合、それは非常に簡単です

  1. あなたは経過時間を取得する必要があり、各フレームで
  2. あなたonTouch関数はあなたの指の加速を見つけるでしょう。私は距離から加速を得る方法についての式を忘れていました。これは、時間変数を持つ位置の二次導関数でなければなりません。しかし、デルタX、デルタYを常に加速に変換する必要があります。簡単にするには、そこに正確なものを置く必要はありません。編集:私はそれを見ていない理由は分かっていませんが、機能はすべてそこにありました...

    アクセラレータx = 2(newposition.x - 位置x - 速度x * elapsedTime)/(elapsedTime * elapsedTime);

  3. アクセラレーションを取得したら、そのコードで新しい位置を設定できます。これは2dの単純な物理力学です。あなたの加速であなたのスピードを見つけることができ、スピードで次のポジションを見つけることができます。

    speed.x = (float) (mass * acceleration.x * elapsed + speed.x); 
    speed.y = (float) (mass * acceleration.y * elapsed + speed.y); 
    
    
    position.x += mass * acceleration.x/2 * elapsed * elapsed + speed.x * elapsed; 
    position.y += mass * acceleration.y/2 * elapsed * elapsed + speed.y * elapsed; 
    
    
    speed.x *= friction; 
    speed.y *= friction; 
    

質量と摩擦があなたはそれがどのようになる速く定義できますし、それ自体が遅くなりますどのくらいの速。あなたはおそらくコードを微調整しなければならないでしょう。なぜなら、このダイナミックは、スローダウンするために後方にスクロールしなければならない場合にはうまくいきません。

各フレームの最後に、アクセラレーションを(0,0)にリセットする必要があります。タッチした後の新しいフレームごとに、アクセラレーションを何かに設定する必要があります。それは非常にうまくいくはずです:)

+1

あなたの答えを見ていて、あなたのスピードフォーミュラが加速を必要とするときに、あなたが加速のスピードをどのように得るのか疑問に思っています。 – Dan

+0

速度を直接計算するのではなく、加速度を使用する方が良い結果をもたらす場合があります。最初のスピードとアクセラレーションは0です。したがって、次のフレームにスピードを追加するためにスピードをどこかで保存する必要があります。加速は、各フレーム間の変化以外は何もありません。加速はデルタX、デルタYとすることができる。実際の速度はdeltaX * elapsedTime + lastSpeedになります。このようにして、フレームが時間がかかっても時間がかかっても、速度は正しく計算されます。 他のパラメータは、物理的なビットを偽って不活性と摩擦を付加します。あなたは本当にそれが永遠にスクロールすることを望んでいません。 –

1
  1. ビューがスクロールしている速度を測定します。
  2. ユーザーがスクロールを停止したときに検出します。
  3. スクロールビューがスクロールしている速度を徐々に減少させます。

このような何か:

public void redraw() { 
    myScrollView.ySpeed = myScrollView.lastY-myScrollView.y; 
    myScrollView.xSpeed = myScrollView.lastX-myScrollView.x; 
    if (!userIsScrolling && ySpeed > 0) { 
     ySpeed--; 
    } 
    if (!userIsScrolling && xSpeed > 0) { 
     xSpeed--; 
    } 
    myScrollView.lastY = myScrollView.y; 
    myScrollView.y += ySpeed; 
    myScrollView.lastX = myScrollView.x; 
    myScrollView.x += xSpeed; 
} 

public void userStoppedScrolling() { 
    userIsScrolling = false; 
} 
+0

ありがとう、あなたはどのくらい正確に私はユーザーがスクロールしている速度を制御できるか知っていますか?今は、ユーザーの指の開始位置と終了位置の間のデルタを計算し、それを行列に入れます。 – jfisk

+0

申し訳ありませんが、私はAndroidを知っていないので、タッチ位置などのような詳細を助けてくれます。 – Jumhyn

関連する問題