绕过这个问题来解决问题

今天班里的女同学突然问了我一个问题。

 

有一个画板,上面有一个小人,通过鼠标的点击实现小人在画板上的移动。

使用的代码是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参数。

            实质上是一样的,但是从思考上去分析,我就绕过了参数必须是时间的这个问题了。

           挺有意思的,嘿嘿!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值