2011-12-13 9 views
2

私のWindows Phoneページには長方形があります。ユーザーが携帯電話を傾けると、傾きに基づいて矩形の位置が変更されます(私はTranslateTransformを使用します)。それはうまく動作します。このようBounceEaseを使用した加速度計

void CurrentValueChanged(object sender, 
    SensorReadingEventArgs<AccelerometerReading> e) 
{ 
    // respond to the accelerometer on the UI thread 
    Dispatcher.BeginInvoke(new Action(() => 
    { 
     // left, right 
     var _LeftDelta = e.SensorReading.Acceleration.X * 5d; 
     var _NewLeft = m_Transform.X + _LeftDelta; 
     var _PanelWidth = ContentPanel.RenderSize.Width; 
     var _RectangleWidth = m_Rectangle.RenderSize.Width; 
     if (_NewLeft > 0 && _NewLeft < _PanelWidth - _RectangleWidth) 
      m_Transform.X = _NewLeft; 

     // up, down 
     var _RightDelta = e.SensorReading.Acceleration.Y * -5d; 
     var _NewTop = m_Transform.Y + _RightDelta; 
     var _PanelHeight = ContentPanel.RenderSize.Height; 
     var _RectangleHeight = m_Rectangle.RenderSize.Height; 
     if (_NewTop > 0 && _NewTop < _PanelHeight - _RectangleHeight) 
      m_Transform.Y = _NewTop; 
    })); 
} 

私がやりたい何か、しかし、ユーザーはページの横に当たったときにバウンスを追加することです。

誰でも知っていますか?

答えて

1

あなたの現在のコードには速度から速度が分離されていません。

加速度に基づいて位置を更新するのではなく、加速度に基づいて速度を更新する必要があります。 http://en.wikipedia.org/wiki/Acceleration

あなたの値5dがマスの代わりになります。それは与えられた力に対してどのくらいのことが起こっているかを伝えます。あなたが場所の変数を

X、Y

及び速度

v_x、v_y

を維持する必要

は次に

x <- x+ v_x* step_size 
y <- y+ v_y* step_size 

と位置を更新し、更新します速度:

今、バウンスは簡単です。上端または下端に達すると、ベロシティの符号を反転するだけです:v_y - > - v_y、そして、ある側を押すと、v_x - > -v_xです。

バウンス時に定数を掛けて、元のベロシティより遅くすることができます。たとえば、v_x - > -v_x * 0.7 は、最初の速度の70%のバウンス速度になります。

また、摩擦や物事が永遠に跳ね返ることがあります。どちらかを学習して実際のモデルを実装するか、ダミー方法を使って各ステップの速度をわずかに減らしてください。このような何かを与えることができる最も簡単なことは、各ステップでです:

v_x <- v_x * 0.95 
v_y <- v_y * 0.95 
+0

あなたは2つの同様の質問を見つけて両方に対応することができました。あなたのご意見ありがとうございます。あなたの解決策は、しかし、私があなたが行くことを望んでいた場所ではありません。私は、イージングアウト機能を動的に適用する方法を探していました。 –

関連する問題