参考我目前正在制作的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_X
和Animator_Body_Y
的类型为DoubleAnimation
,然后应用于机器人的TranslateTransform
对象:Translate_Body
我面临的问题是机器人(画布)根据输入的距离以不同的速度移动。因此,距离越长,机器人移动得越快!因此,为了让您了解,如果输入的距离是20
,机器人的移动速度相当慢,但如果输入的距离是800
,它就会从屏幕上射出。
我需要使此速度保持恒定,与输入的距离无关。
我想我需要根据输入的距离调整一些Animator_Body_X
和Animator_Body_Y
属性,但我不知道要完全调整什么(我认为必须完成一些数学运算)同样)。
这是一个list of the DoubleAnimation
properties,你可能想看看这个。{/ p>
答案 0 :(得分:2)
您是否有理由使用DoubleAnimation? DoubleAnimation设计用于在特定时间段内使用A到B的值,如果需要,在该周期的开始/结束时使用线性插值加速/减速(这就是为什么它对于更长的距离“更快”的原因..它还有更长的路要走在同一时间!)。根据事物的外观,你要做的是将每个“框架”移动一个固定的距离,具体取决于它面向的方向?这似乎不适合我。
您可以根据距离计算动画的长度,因此长距离的长度更长,然后项目始终以相同的“速度”移动。对我来说,自己移动物品更有意义。您可以根据角度标准计算物体速度,然后每个“框架”您可以根据速度手动移动物品。使用这种方法,如果需要,您还可以轻松地对速度施加摩擦等。
答案 1 :(得分:1)
你需要做的数学是:速度*时间=距离
因此,为了保持速度不变,你必须改变动画的持续时间:
double pixelsPerSecond = 5;
animation.Duration = TimeSpan.FromSeconds(distance/pixelsPerSecond);
顺便说一句,我不认为动画是移动机器人的最佳解决方案。