2011-12-13 148 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