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

C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(七)传说中的A*寻径算法

 2009-06-22 08:32:49 来源:WEB开发网   
核心提示: 那么有了我们前面6节的知识基础并结合相应的注释,这些代码应该很容易可以接受,C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(七)传说中的A*寻径算法(3),主要作用是定义起点,初始化矩阵中所有元素(默认都是可以通行的赋值1),找到的路径同样如此的完美

那么有了我们前面6节的知识基础并结合相应的注释,这些代码应该很容易可以接受。主要作用是定义起点,初始化矩阵中所有元素(默认都是可以通行的赋值1),然后我们可以设置些障碍物来测试我们寻径的效果,即根据需要将矩阵中需要变成障碍物的元素赋值0,这样我们就将所有的准备工作做好了。

最后就是如何实现寻径啦,代码如下:

        private void Carrier_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) {
            Point p = e.GetPosition(Carrier);
            int x = (int)p.X / GridSize;
            int y = (int)p.Y / GridSize;
            End = new System.Drawing.Point(x, y); //计算终点坐标

            PathFinder = new PathFinderFast(Matrix);
            PathFinder.Formula = HeuristicFormula.Manhattan; //使用我个人觉得最快的曼哈顿A*算法
            PathFinder.SearchLimit = 2000; //即移动经过方块(20*20)不大于2000个(简单理解就是步数)

            List<PathFinderNode> path = PathFinder.FindPath(Start, End); //开始寻径

            if (path == null) {
                MessageBox.Show("路径不存在!");
            } else {
                string output = string.Empty;
                for (int i = path.Count - 1; i >= 0; i--) {
                    output = string.Format(output
                        + "{0}"
                        + path[i].X.ToString()
                        + "{1}"
                        + path[i].Y.ToString()
                        + "{2}",
                        "(", ",", ") ");
                    rect = new Rectangle();
                    rect.Fill = new SolidColorBrush(Colors.Green);
                    rect.Width = GridSize;
                    rect.Height = GridSize;
                    Carrier.Children.Add(rect);
                    Canvas.SetLeft(rect, path[i].X * GridSize);
                    Canvas.SetTop(rect, path[i].Y * GridSize);
                }
                MessageBox.Show("路径坐标分别为:" + output);
            }
        }

这里我将鼠标左键点击的点作为寻径的动态终点,然后创建寻径类PathFinder,接着定义好参数后就可以通过List<PathFinderNode> path = PathFinder.FindPath(Start, End);来实现寻径了。最后通过MessageBox将我们找到的路径点逐一打印出来,至此就完成了我们完美的曼哈顿A*寻径了。

C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(七)传说中的A*寻径算法

图片看不清楚?请点击这里查看原图(大图)。

上图为程序运行图,绿色代表找到的路径,红色代表障碍物,找到的路径同样如此的完美!是不是很有成就感?

有了这A*算法寻径类,可以说地图引擎就好比完成了一半不为过;那么下一节我将介绍如何通过此节获取的List<PathFinderNode> path列表来实现按照此列表实现的动态关键帧动画,敬请期待。

上一页  1 2 3 

Tags:开发 WPF Silverlight

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