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

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

 2009-06-22 08:32:49 来源:WEB开发网   
核心提示: 接着,我将自己写好的曼哈顿A*寻径所有代码封装在QX.Game.PathFinder这个命名空间中,C#开发WPF/Silverlight动画及游戏系列教程(Game Course):(七)传说中的A*寻径算法(2),那么到此才进入本文的关键,如何通过C#来模拟角色寻路: 首先当然是引用:

接着,我将自己写好的曼哈顿A*寻径所有代码封装在QX.Game.PathFinder这个命名空间中,那么到此才进入本文的关键,如何通过C#来模拟角色寻路:

首先当然是引用:using QX.Game.PathFinder;

接着我们初始化需要的变量:

        Rectangle rect;
        private IPathFinder PathFinder = null;
        private byte[,] Matrix = new byte[1024, 1024]; //寻路用二维矩阵
        private int GridSize = 20; //单位格子大小
        private System.Drawing.Point Start = System.Drawing.Point.Empty; //移动起点坐标
        private System.Drawing.Point End = System.Drawing.Point.Empty; //移动终点坐标

这里要特别讲解一下GridSize这个变量,它定义了窗口坐标系中以多大一个尺寸来确定游戏坐标系的一个单元格(大家可以这样理解这两种不同的坐标系:假如游戏窗口大小为800*600像素,那么窗口坐标系中的(80,100)这个坐标,根据GridSize = 20来换算,在游戏坐标系中的坐标则为(80/20,100/20)=(4,5))。大家同时可以联想一下SLG类型游戏,人物处于的每个单元格都是由N*N像素组成的方块,GridSize就相当于N了;而该格子在游戏坐标系中的显示坐标则为((N/20), (N/20)),这样应该很好理解了吧。这样根据不同的需要来使用GridSize对坐标系进行缩小(/GridSize)和放大(*GridSize)操作,从而可以非常方便的实现各种效果并且被不同的情况所调用,后面的内容及章节会涉及到相关知识。

那么接下来我们在窗体构造函数中初始化二维矩阵,代码如下:

        public Window7() {
            InitializeComponent();
            ResetMatrix(); //初始化二维矩阵
        }
        private void ResetMatrix() {
            for (int y = 0; y < Matrix.GetUpperBound(1); y++) {
                for (int x = 0; x < Matrix.GetUpperBound(0); x++) {
                    //默认值可以通过(非障碍物)在矩阵中用1表示
                    Matrix[x, y] = 1;
                }
            }
            //构建障碍物(举例)
            for (int i = 0; i < 18; i++) {
                //障碍物在矩阵中用0表示
                Matrix[i, 12] = 0;
                rect = new Rectangle();
                rect.Fill = new SolidColorBrush(Colors.Red);
                rect.Width = GridSize;
                rect.Height = GridSize;
                Carrier.Children.Add(rect);
                Canvas.SetLeft(rect, i * GridSize);
                Canvas.SetTop(rect, 12 * GridSize);
            }
            //构建其他障碍物……(省略)
            Start = new System.Drawing.Point(1, 1); //设置起点坐标
        }

Tags:开发 WPF Silverlight

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