上一节我们制作好了地图编辑器,并初步实现了导出地图中的障碍物信息及实现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值,该图片的尺寸作为Width和Height值,然后设置进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>

……

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

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

作者:深蓝色右手
出处: http://blog.csdn.net/alamiye010/
教程目录及源码下载: 点击进入
本文版权归作者和CSDN共有,欢迎转载。但未经作者同意必须保留此段声明,且在文章页面显著位置给出原文连接,否则保留追究法律责任的权利。

C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(三十五)地图编辑器的初步使用相关推荐

  1. C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(十)斜度α地图的构造及算法...

    在当前的网络游戏中,地图基本都是采取一定斜度的拼装地图,这其中存在两种斜度地图的构造方式: 第一种我称之为伪斜度地图:该类型地图表现层图片为斜度的,但地图基底障碍物等的构造则实为正方形,如下图: 其实 ...

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

    紧接着上一节,首先得解释一下为什么需要将这272张图片合成为一张大图.因为如果游戏中还有装备.坐骑等其他设置,那么我们就需要对图片源进行时时的合成:同时对272张甚至更多的图片进行合成效率高还是对2张 ...

  3. C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(十四) 精灵控件横空出世!①

    在上一节中,我们实现了地图牵引式移动,同时还遗留着一个小尾巴:主角和障碍物该如何跟随着地图的移动而移动? 上节中有点到,只要在地图移动的同时,时时根据主角等对象物体的X,Y坐标进行相对于地图的X,Y坐 ...

  4. C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):目录

    本系列教程的示例代码下载(感谢 银光中国 提供资源分流): 第一部分源码:WPFGameTutorial_PartI(1-20节) 第二部分源码:WPFGameTutorial_PartII(21-2 ...

  5. C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(二)让物体动起来②

    第二种方法,CompositionTarget动画,官方描述为:CompositionTarget对象可以根据每个帧回调来创建自定义动画.其实直接点,CompositionTarget创建的动画是基于 ...

  6. C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(一)让物体动起来①

    序:自从QXGame(WPF GAME ENGINE)游戏引擎公布以来,受到很多朋友的热切关注,于是乎有了写教程的想法.那么从今天开始,我将带领大家一步一步的学会如何使用纯C#开发WPF/Silver ...

  7. C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(三十三) 锦上添花之魔法特效装饰

    上一节,我们实现了6大系魔法的附加属性,并赋予了不同的颜色加以区别:但是在实际的游戏开发中,特别是Q版或追求艺术表现的网络游戏中,为了能够更加突显魔法的绚丽与雍华,设计师们会为魔法增加大量的画面体现: ...

  8. C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(二十五)完美捕捉精灵之神器 -- HitTest...

    怪物们都出现了,如何选中自己心仪的怪是主角目前首要做的事. 为了进行鼠标状态区别,我首先对鼠标变化规则进行约束:当鼠标在屏幕上空旷地图区域移动时,鼠标光标形态表现为默认光标 (0号光标图片),当鼠标经 ...

  9. C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(四)实现2D人物动画①

    通过前面的学习,我们掌握了如何动态创建物体移动动画,那么接下来我将介绍WPF中如何将物体换成2D游戏角色,并通过使用前面所讲的DispatcherTimer计时器来实现2D人物角色的各种动作动画. 动 ...

  10. C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(四十九) 落雷!治疗!陷阱!连锁闪电!多段群伤!魔法之终极五重奏②...

    本节,我将完成本教程示例游戏的最终两个魔法:传说中的连锁闪电与暴风雪.如此经典与华丽的家伙无论在哪款好游戏中都少不了它们的踪影. 首先是连锁闪电,在<英雄无敌>中体现得尤为出色,击中一个怪 ...

最新文章

  1. C语言两种查找方式(分块查找,二分法)
  2. java并发环境安全初始化
  3. tomcat启动报错
  4. 数据结构与算法之--高级排序:shell排序和快速排序
  5. LeetCode 20 Valid Parentheses (C++)
  6. PHP Curl 多线程实现
  7. 201612-1-中间数
  8. git 更换密码后,pull代码 fatal: Authentication failed for '
  9. HDU2526 浪漫手机【模拟】
  10. CF1093D Beautiful Graph
  11. 神器webssh学习笔记
  12. lammps教程:薄膜渗透过滤模拟(1)
  13. c# – 强制硬件加速渲染
  14. 【Java 代码实例 14】BeanUtils用法详解,附源码分析
  15. C# 中国大陆二代身份证号生成及格式验证
  16. Pr:导出设置之编码设置
  17. 罗切斯特计算机官网,罗切斯特
  18. 算法工程师应该具备哪些工程能力
  19. 给你一个团队,你应该怎么管?制度是绝情的,管理是无情的,执行是合情的
  20. 专注云原生落地,星汉未来成为开源 GitOps 产业联盟会员

热门文章

  1. 程序设计-判断数独是否有效(C)
  2. Reverse Unreal Shader memorandum
  3. 基于jquery的相册预览gallery
  4. 支持英文/汉字/emoji长度计算的输入框实现
  5. Oracle-创建用户,创建表空间(绝对干货)
  6. 巨峰科技: H.265新起点
  7. 【换季谨防死“肌”】
  8. 服务器3D场景建模(七):四叉树的邻居关系
  9. Flutter项目——静态页面布局
  10. C# 委托(Delegate)和事件(Event)总结