上一节我们制作好了地图编辑器,并初步实现了导出地图中的障碍物信息及实现A*模拟寻路。那么当我们得到了包含有障碍物数据信息的xml文件后,又该如何将之应用到本教程的示例游戏中呢?

本节还是以上一节的那幅地图为例,我们首先通过编辑器载入该地图并在上面描绘出所有障碍物:

然后点击导出障碍物按钮,我们将得到一个包含有类似如下信息的xml障碍物数据文件:

<Item ID="Obstruction" Value="240_0,241_0,238_1,239_1,240_1,236_2,237……>

接下来打开示例游戏项目中的Config.xml配置文件,并找到<Map Sign="1">这个代表1号地图的节点。在此节点中增加一个名为Obstruction的属性,并将刚才导出的障碍物数据信息xml文件里的Value值复制到Obstruction属性值内,最后的修改结果如下:

<Map Sign="1" Obstruction="240_0,241_0,238_1,239_1,240_1,236_2,237……>

障碍物设定完后,我们还需要在地图障碍物初始化中读取它:

        //障碍物固定值与变动值(二维矩阵)

        byte[,] FixedObstruction = new byte[256, 256], VaryObstruction;

        /// <summary>

        /// 初始化障碍物

        /// </summary>

        private void InitObstruction() {

            for (int y = 0; y < FixedObstruction.GetUpperBound(1); y++) {

                for (int x = 0; x < FixedObstruction.GetUpperBound(0); x++) {

                    //设置默认值,可以通过的均在矩阵中用1表示

                    FixedObstruction[x, y] = 1;

                }

            }

            string[] obstruction = Super.GetTreeNode(

Super.SystemConfig, "Map", "Sign", "1").Attribute("Obstruction").Value.Split(',');

            string[] str;

            for (int i = 0; i < obstruction.Count(); i++) {

                str = obstruction[i].Split('_');

                FixedObstruction[Convert.ToInt32(str[0]), Convert.ToInt32(str[1])] = 0;

            }

            VaryObstruction = (byte[,])FixedObstruction.Clone();

        }

由于障碍物数据信息是以”,”号和”_”号分隔,因此我们可以很轻松的通过string.Split()这个函数将之分离出来,并对它们赋值=0作为障碍物标记。

地图编辑器还有个小功能,即能时时的显示鼠标正处于地图上的坐标值。别小看它,有了它我们可以轻松的实现遮挡物的定位。我们首先通过第十一节的方法切割出地图中的遮挡物,由于地图过大,遮挡物很多,我暂时只切割出部分遮挡物为大家做演示:

我们将这些遮挡物切割出来保存为png格式,然后根据编辑器中显示的该遮挡物左小角点所处于地图中的坐标作为X,Y值,该图片的尺寸作为WidthHeight值,然后设置进Config.xml文件中:

……

<Masks>

   <Mask Src="Map\1\0.png" Width="180" Height="191" X="658" Y="609" CenterY="191" Opacity="0.7"></Mask>

   <Mask Src="Map\1\1.png" Width="327" Height="208" X="342" Y="863" CenterY="208" Opacity="0.7"></Mask>

   <Mask Src="Map\1\2.png" Width="498" Height="515" X="367" Y="1106" CenterY="515" Opacity="0.7"></Mask>

   <Mask Src="Map\1\3.png" Width="1235" Height="938" X="701" Y="1004" CenterY="938" Opacity="0.7"></Mask>

</Masks>

……

嘿嘿~大功告成啦。让我们运行测试一下吧:

    嘿嘿,就是这么简单。一套完整全新的地图包括障碍物、遮挡物及地图背景图片布局就这么完成了,地图编辑器的作用还真不小呢。这还仅仅是个开始,目前的教程示例游戏使用的还是整图,这对性能影响是很大的,为地图编辑器加入切片功能并在游戏中实现区域性加载看来已迫在眉睫,下一节的内容将更加精彩,关注哦。

WPF/Silverlight
作者:深蓝色右手
出处:http://alamiye010.cnblogs.com/
教程目录及源码下载:点击进入(欢迎加入WPF/Silverlight小组 WPF/Silverlight博客团队)
本文版权归作者和博客园共有,欢迎转载。但未经作者同意必须保留此段声明,且在文章页面显著位置给出原文连接,否则保留追究法律责任的权利。
posted on 2009-10-01 22:35  深蓝色右手  阅读(7188)  评论(9编辑  收藏  举报