2011-12-13 174 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_x <- v_x + acceletation_x* 5d * step_size 
v_y <- v_y + acceletation_y* 5d * 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

你設法找到兩個類似的問題,並回答他們兩個。謝謝您的意見。然而,你的解決方案並不是我希望你會去的地方。我正在尋找如何動態應用緩出功能。 – 2012-02-07 02:59:02