Акселерометр с BounceEase - PullRequest
2 голосов
/ 14 декабря 2011

У меня есть прямоугольник на моей странице Windows Phone.Когда пользователь наклоняет свой телефон, положение прямоугольника изменяется (я использую TranslateTransform) в зависимости от наклона.Это прекрасно работает.

Примерно так:

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 Ответ

1 голос
/ 24 января 2012

Ваш текущий код не имеет ускорения, отделенного от скорости.

скорость должна обновляться на основе ускорения, а не обновлять местоположения на основе ускорения.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
...