WPF:移动速度(翻译)随距离而变化

时间:2009-02-15 11:57:34

标签: c# wpf math canvas physics

参考我目前正在制作的this programming game

我编写了以下方法将画布移动(平移)到特定距离并根据其当前角度:

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_XAnimator_Body_Y的类型为DoubleAnimation,然后应用于机器人的TranslateTransform对象:Translate_Body


我面临的问题是机器人(画布)根据输入的距离以不同的速度移动。因此,距离越长,机器人移动得越快!因此,为了让您了解,如果输入的距离是20,机器人的移动速度相当慢,但如果输入的距离是800,它就会从屏幕上射出。

我需要使此速度保持恒定,与输入的距离无关。

我想我需要根据输入的距离调整一些Animator_Body_XAnimator_Body_Y属性,但我不知道要完全调整什么(我认为必须完成一些数学运算)同样)。

这是一个list of the DoubleAnimation properties,你可能想看看这个。{/ p>

2 个答案:

答案 0 :(得分:2)

您是否有理由使用DoubleAnimation? DoubleAnimation设计用于在特定时间段内使用A到B的值,如果需要,在该周期的开始/结束时使用线性插值加速/减速(这就是为什么它对于更长的距离“更快”的原因..它还有更长的路要走在同一时间!)。根据事物的外观,你要做的是将每个“框架”移动一个固定的距离,具体取决于它面向的方向?这似乎不适合我。

您可以根据距离计算动画的长度,因此长距离的长度更长,然后项目始终以相同的“速度”移动。对我来说,自己移动物品更有意义。您可以根据角度标准计算物体速度,然后每个“框架”您可以根据速度手动移动物品。使用这种方法,如果需要,您还可以轻松地对速度施加摩擦等。

答案 1 :(得分:1)

你需要做的数学是:速度*时间=距离

因此,为了保持速度不变,你必须改变动画的持续时间:

double pixelsPerSecond = 5;
animation.Duration = TimeSpan.FromSeconds(distance/pixelsPerSecond);
顺便说一句,我不认为动画是移动机器人的最佳解决方案。