WPF 旋转动画

Dear200892 2019-09-02 11:20:16

蹭着空闲期,自己编写了一个垃圾飞行棋
现在蓝色棋子停在坐标点(4,12)
下一格方格坐标为(6,11)

通过Math.Atan2函数求得两点之间的角度(map为下格方格坐标,postion为当前停落的坐标)
double angle = Math.Atan2((map.PointY - postion.Y), (map.PointX - postion.X)) * 180 / Math.PI;

现在旋转的角度错误,朝向应该是橙色箭头。
旋转动画代码如下:

//设置旋转方向
RotateTransform rotate = new RotateTransform();
//绑定旋转中心
chess.RenderTransform = rotate;
//设置旋转中心百分比
chess.RenderTransformOrigin = new Point(0.5, 0.5);
Storyboard story = new Storyboard();
DoubleAnimation doubleAnimation = new DoubleAnimation(chess.Angle, angle, new Duration(TimeSpan.FromSeconds(100)));
Storyboard.SetTarget(doubleAnimation, chess);
Storyboard.SetTargetProperty(doubleAnimation, new PropertyPath("RenderTransform.Angle"));
story.Children.Add(doubleAnimation);
story.Begin();

chess为棋子,chess.Angle初始角度,angle目标角度,动画执行事件100ms

不知道哪里出错了!!!若能解决,可加分!!!
...全文
3056 点赞 收藏 62
写回复
62 条回复
切换为时间正序
请发表友善的回复…
发表回复
Dear200892 2019-09-09
引用 61 楼 皮皮熊_1989 的回复:
好多年不撸wpf了。。。忘的差不多了,当年能写很多酷炫特效几年不撸现在费了
从开始读书到现在,一直都没有绘画天赋
回复
皮皮熊_1989 2019-09-09
好多年不撸wpf了。。。忘的差不多了,当年能写很多酷炫特效几年不撸现在费了
回复
Dear200892 2019-09-05
引用 59 楼 陶玉霖 的回复:
Atan2计算得出的单位是弧度值吗
结果是需要旋转的角度,比如145°
回复
Dear200892 2019-09-04
引用 54 楼 窦性心律心动过速 的回复:
6666666666666666666
回复
Dear200892 2019-09-04
引用 53 楼 Re-Defining 的回复:
哇你这个好棒耶
回复
Dear200892 2019-09-04
引用 55 楼 weixin_44789622 的回复:
弧度值与角度值的转换问题??!
不是,动画绑定的时候错了缺少 button.XX
回复
陶玉霖 2019-09-04
Atan2计算得出的单位是弧度值吗
回复
疯子突击 2019-09-04
弧度值与角度值的转换问题??!
回复
Dear200892 2019-09-03
最终解决方案:

 chess.Dispatcher.Invoke(() =>
            {
                //设置旋转方向
                RotateTransform rotate = new RotateTransform();
                //绑定旋转中心
                chess.RenderTransform = rotate;
                //设置旋转中心百分比
                chess.RenderTransformOrigin = new Point(0.5, 0.5);
                //创建故事板
                Storyboard story = new Storyboard();
                //实例化一个Double类型的动画
                DoubleAnimation doubleAnimation = new DoubleAnimation(chess.Angle, angle + 90, new Duration(TimeSpan.FromSeconds(FromMilliseconds / 5)));
                //给动画指定对象
                Storyboard.SetTarget(doubleAnimation, chess);
                //给动画指定依赖的属性
                Storyboard.SetTargetProperty(doubleAnimation, new PropertyPath("(Button.RenderTransform).(RotateTransform.Angle)"));
                //将动画添加到动画板中
                story.Children.Add(doubleAnimation);
                //启动动画
                story.Begin();
            });
            chess.Angle = angle;
对比原始:

                //实例化一个Double类型的动画
                DoubleAnimation doubleAnimation = new DoubleAnimation(chess.Angle, angle + 90, new Duration(TimeSpan.FromSeconds(FromMilliseconds / 5)));
               //给动画指定依赖的属性
                Storyboard.SetTargetProperty(doubleAnimation, new PropertyPath("(Button.RenderTransform).(RotateTransform.Angle)"));
回复
qq84628151 2019-09-03
引用 48 楼 Dear200892 的回复:
[quote=引用 47 楼 qq84628151 的回复:] 要不你把代码发给我看看好了,我帮你搞好
联系方式[/quote] qq 1018720141
回复
Dear200892 2019-09-03
引用 47 楼 qq84628151 的回复:
要不你把代码发给我看看好了,我帮你搞好
联系方式
回复
qq84628151 2019-09-03
要不你把代码发给我看看好了,我帮你搞好
回复
qq84628151 2019-09-03
我试了一下,其实你的公式没错,也不是y轴问题,应该是你面向角度搞错了吧
回复
qq84628151 2019-09-03
引用 44 楼 Dear200892 的回复:
[quote=引用 42 楼 qq84628151 的回复:] 上面的+270,应该是因为0度,向上的。正常是0度,是向右。所以你+270,或者-90。都无所谓的
你这里就比我多了一个【+270】[/quote] 因为我是高度350,宽为3,角度0是向上的。假如宽度和高度换一下,就不需要+270或者-90了
回复
Dear200892 2019-09-03
引用 42 楼 qq84628151 的回复:
上面的+270,应该是因为0度,向上的。正常是0度,是向右。所以你+270,或者-90。都无所谓的
你这里就比我多了一个【+270】
回复
6666666666666666666
回复
Re-Defining 2019-09-03
哇你这个好棒耶
回复
Dear200892 2019-09-03
引用 51 楼 weixin_45601378 的回复:
回帖,新人报道,想赚几个积分,不知道咋操作
每天水回复就有积分
回复
SAGW~小员工 2019-09-03
回帖,新人报道,想赚几个积分,不知道咋操作
回复
wpf不熟,不要再邀请我回答了
回复
发动态
发帖子
C#
创建于2007-09-28

10.4w+

社区成员

.NET技术 C#
申请成为版主
社区公告

全世界最好的语言,没有之一.