WPF: скорость движения (перевод) зависит от расстояния - PullRequest
1 голос
/ 15 февраля 2009

Применительно к этой программируемой игре Я сейчас строю.

Я написал следующий метод для перемещения (перевода) холста на определенное расстояние и в соответствии с его текущим углом:

private void MoveBot(double pix, MoveDirection dir)
    {
        if (dir == MoveDirection.Forward)
        {
            Animator_Body_X.To = Math.Sin(HeadingRadians) * pix;
            Animator_Body_Y.To = ((Math.Cos(HeadingRadians) * pix) * -1);
        }
        else
        {
            Animator_Body_X.To = ((Math.Sin(HeadingRadians) * pix) * -1);
            Animator_Body_Y.To = Math.Cos(HeadingRadians) * pix;
        }

        Animator_Body_X.To += Translate_Body.X;
        Animator_Body_Y.To += Translate_Body.Y;

        Animator_Body_X.From = Translate_Body.X;
        Translate_Body.BeginAnimation(TranslateTransform.XProperty, Animator_Body_X);

        Animator_Body_Y.From = Translate_Body.Y;
        Translate_Body.BeginAnimation(TranslateTransform.YProperty, Animator_Body_Y);

        TriggerCallback();
    }

Одним из параметров, который он принимает, является количество пикселей, которое должно быть покрыто при переводе.

Что касается приведенного выше кода, Animator_Body_X и Animator_Body_Y относятся к типу DoubleAnimation, которые затем применяются к объекту TranslateTransform робота: Translate_Body


Проблема, с которой я сталкиваюсь, заключается в том, что робот (который является холстом) движется с различной скоростью в соответствии с введенным расстоянием. Таким образом, чем больше расстояние, тем быстрее движется робот! Таким образом, чтобы представить вас в перспективе, если введенное расстояние равно 20, робот движется довольно медленно, но если введенное расстояние равно 800, он буквально снимает экран.

Мне нужно сделать эту скорость постоянной, не зависящей от введенного расстояния.

Я думаю, что мне нужно настроить некоторые свойства Animator_Body_X и Animator_Body_Y в соответствии с введенным расстоянием, но я не знаю, что именно нужно настроить (я думаю, что некоторые математические функции также должны быть выполнены).

Вот список DoubleAnimation свойств , на которые вы, возможно, захотите взглянуть, чтобы понять это.

Ответы [ 2 ]

2 голосов
/ 15 февраля 2009

Есть ли причина, по которой вы используете DoubleAnimation? DoubleAnimation разработан, чтобы принимать значение от A до B в течение определенного периода времени, используя линейное интерполяционное ускорение / замедление в начале / конце этого периода, если это необходимо (вот почему это «быстрее» для более длинного расстояния. в то же время!). Судя по всему, вы пытаетесь продвинуть что-то на фиксированное расстояние в каждом «кадре» в зависимости от того, в каком направлении он смотрит? Это мне не подходит.

Вы можете рассчитать длину анимации в зависимости от расстояния, чтобы длина была больше для более длинных расстояний, тогда элемент всегда движется с одинаковой «скоростью». Для меня более логично просто переместить предмет самостоятельно. Вы можете рассчитать скорость объекта на основе ваших угловых критериев, затем каждый «кадр» можно вручную перемещать, насколько это необходимо, исходя из этой скорости. С помощью этого метода вы также можете легко применить трение и т. Д. К скорости, если требуется.

1 голос
/ 16 февраля 2009

Математика, которую вы должны сделать: скорость * время = расстояние

Итак, чтобы сохранить постоянную скорость, вы должны изменить продолжительность анимации:

double pixelsPerSecond = 5;
animation.Duration = TimeSpan.FromSeconds(distance/pixelsPerSecond);

Кстати, я не думаю, что анимация - лучшее решение для перемещения ваших роботов.

...