今天班里的女同学突然问了我一个问题。
有一个画板,上面有一个小人,通过鼠标的点击实现小人在画板上的移动。
使用的代码是C#加上WPF。
出现的问题是,小人的移动速度不一样。
拿过程序后,我运行了一下,发现点击不同的地方,小人的移动速度确实不一样。
当点击的比较近的时候,小人的行走就会非常的缓慢,
当点击的比较远的时候,小人的行走就会非常的快。
通过观察发现,小人在x轴坐标上的移动时间总是3秒,而在y轴的移动时间总是2秒
这是出现问题的代码。
p是鼠标点击的点,Canvas大概就是WPF的某个画布吧。
DoubleAnimation daX = new DoubleAnimation(Canvas.GetLeft(person), p.X, new Duration(TimeSpan.FromSeconds(3)));
DoubleAnimation daY = new DoubleAnimation(Canvas.GetTop(person), p.Y, new Duration(TimeSpan.FromSeconds(2)));
程序运行的原理大概是用某个类库里的函数,然后设一个时间,在这个时间段内画动画,也就是画小人运动。
由于这个函数的参数是时间,所以x位置时间就变成了3秒,y位置就变成了4秒
问题就是,由于s=V·T。
当T固定时,S位移不同时,速度V必然是不同的。
接着我解决问题的思路就变成了这样。
能不能点击鼠标后,取得鼠标的坐标,然后和小人的坐标进行运算,计算出来一个距离。
让小人的 x y 坐标 每次增加或减少一个固定的数值。 不用这个函数了。
可是后来发现,由于同学是用了这个类库来实现动画的,所以不用这个类库的话,完全程序就没法写了、(其实代码是同学在培训班里,老师留下来的-_-)
这个函数的参数里,必须有画动画的时间time。所以我们必须要去使用这个函数。
----------------------------------------------------
扯淡的一幕出现了。
通过和同学的分析,突然明白了。 s=V·T T=S/V
我们可以通过计算位移,并且把速度设置成一个定值。
然后每次小人运动时,把不同的时间传给画动画的函数。
double x;//改动部分
double y;//改动部分
double timeX;//改动部分
double timeY;//改动部分
double speed = 100;//改动部分
x = Canvas.GetLeft(person);//改动部分
y = Canvas.GetTop(person);//改动部分
timeX = (Math.Abs(p.X - Canvas.GetLeft(person))) / speed;//改动部分
timeY = (Math.Abs(p.Y - Canvas.GetTop(person))) / speed;//改动部分
DoubleAnimation daX = new DoubleAnimation(Canvas.GetLeft(person), p.X, new Duration(TimeSpan.FromSeconds(timeX)));//改动部分
DoubleAnimation daY = new DoubleAnimation(Canvas.GetTop(person), p.Y, new Duration(TimeSpan.FromSeconds(timeY)));//改动部分
后记:解决问题真的很简单。 这个函数只能接受时间参数。 我却给他传了一个S/V参数。
实质上是一样的,但是从思考上去分析,我就绕过了参数必须是时间的这个问题了。
挺有意思的,嘿嘿!