WEB开发网
开发学院软件开发C语言 C#开发WPF/Silverlight动画及游戏系列教程(Game C... 阅读

C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(十九) 完美精灵之八面玲珑(WPF Only)③

 2009-06-29 07:07:44 来源:WEB开发网   
核心提示: 由于Math.Tan()函数的参数为弧度单位,因此需要将角度通过公式换算成弧度,C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(十九) 完美精灵之八面玲珑(WPF Only)③(3),并且至于之中的比较算法逻辑是否为最优,仍然那句老话:仁者见仁,Y序

由于Math.Tan()函数的参数为弧度单位,因此需要将角度通过公式换算成弧度,并且至于之中的比较算法逻辑是否为最优,仍然那句老话:仁者见仁,智者见智。或许你写的算法更优秀呢?

有了该方法,接下来就是在鼠标左键点击事件中获取目标点,并且将主角的当前动作切换成跑步状态,并启动A*寻路:

        private void Carrier_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) {
            Point p = e.GetPosition(Map); //点击的地方在Map中的坐标点
            Spirit.Action = Actions.Run; //主角动作切换成跑步状态
            AStarMoveTo(p); //开始寻路
        }

上两节的AstarMoveTo()方法中的Storyboard动画只创建X,Y序列点,而为了实现角色时时朝向,我们还需要创建对应的角色方向(Direction)序列点,因此我们还需要对本节中的AstarMoveTo()方法进行如下改进:

        private void AStarMoveTo(Point p) {
                ……
                //创建X轴方向逐帧动画
                DoubleAnimationUsingKeyFrames keyFramesAnimationX = new DoubleAnimationUsingKeyFrames();
                //总共花费时间 = path.Count * cost
                keyFramesAnimationX.Duration = new Duration(TimeSpan.FromMilliseconds(path.Count * cost));
                Storyboard.SetTarget(keyFramesAnimationX, Spirit);
                Storyboard.SetTargetProperty(keyFramesAnimationX, new PropertyPath("X"));
                //创建Y轴方向逐帧动画
                DoubleAnimationUsingKeyFrames keyFramesAnimationY = new DoubleAnimationUsingKeyFrames();
                keyFramesAnimationY.Duration = new Duration(TimeSpan.FromMilliseconds(path.Count * cost));
                Storyboard.SetTarget(keyFramesAnimationY, Spirit);
                Storyboard.SetTargetProperty(keyFramesAnimationY, new PropertyPath("Y"));
           //创建朝向动画
           DoubleAnimationUsingKeyFrames keyFramesAnimationDirection = new DoubleAnimationUsingKeyFrames();
           keyFramesAnimationDirection.Duration = new Duration(TimeSpan.FromMilliseconds(path.Count * cost));
           Storyboard.SetTarget(keyFramesAnimationDirection, Spirit);
           Storyboard.SetTargetProperty(keyFramesAnimationDirection, new PropertyPath("Direction"));
                for (int i = 0; i < framePosition.Count(); i++) {
                    //加入X轴方向的匀速关键帧
                    LinearDoubleKeyFrame keyFrame = new LinearDoubleKeyFrame();
                    //平滑衔接动画(将寻路坐标系中的坐标放大回地图坐标系中的坐标)
                    keyFrame.Value = i == 0 ? Spirit.X : framePosition[i].X * GridSize;
                    keyFrame.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(cost * i));
                    keyFramesAnimationX.KeyFrames.Add(keyFrame);
                    //加入X轴方向的匀速关键帧
                    keyFrame = new LinearDoubleKeyFrame();
                    keyFrame.Value = i == 0 ? Spirit.Y : framePosition[i].Y * GridSize;
                    keyFrame.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(cost * i));
                    keyFramesAnimationY.KeyFrames.Add(keyFrame);
                    //加入朝向匀速关键帧
                    keyFrame = new LinearDoubleKeyFrame();
                    keyFrame.Value = i == framePosition.GetUpperBound(0)
                     ? Super.GetDirectionByTan(framePosition[i].X, framePosition[i].Y, framePosition[i - 1].X, framePosition[i - 1].Y)
                     : Super.GetDirectionByTan(framePosition[i + 1].X, framePosition[i + 1].Y, framePosition[i].X, framePosition[i].Y)
                    ;
                    keyFrame.KeyTime = KeyTime.FromTimeSpan(TimeSpan.FromMilliseconds(cost * i));
                    keyFramesAnimationDirection.KeyFrames.Add(keyFrame);
                }
                storyboard.Children.Add(keyFramesAnimationX);
                storyboard.Children.Add(keyFramesAnimationY);
                storyboard.Children.Add(keyFramesAnimationDirection);
……
         }

上一页  1 2 3 4  下一页

Tags:开发 WPF Silverlight

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接