终于到了地图处理的最后一节,本节我将为大家讲解如何通过传送点实现主角在地图间的传送以及地图之间的切换。地图转换的关键在于把握好移除与添加:即移除之前地图上除主角之外的所有对象,然后再重新加载新地图上的所有对象。本教程示例游戏中,每张地图的信息都详细的记录于Config.xml配置文件中,包括每张地图的表层、遮挡层、障碍物层等等,然后再附加上本节后面将向大家讲解的传送点信息;这样,在地图转换时,我们只需根据配置文件来读取加载相应的地图数据即可。

实现的第一步,首先新建传送点控件:QXTeleport,该控件包含一些传送用的参数类属性,例如传送点的描述Tip、传送点的地图索引Key、传送点对应传送到的地图代号To、传送点传送主角后主角出现的新坐标以及朝向等;并且该传送点控件自带有一个DispatcherTimer,用于传送点动画形式呈现。

接下来,我们要为每张地图配置参数中添加传送点信息:

     <Teleports>

       <Teleport Code="6" Key="10" To="1" ToX="530" ToY="1040" ToDirection="1" X="600" Y="600" CenterX="64" CenterY="50" SingleWidth="128" SingleHeight="100" Tip="东海龙宫" FrameNum="15"/>

</Teleports>

这些参数对应着地图信息以及传送点自身的属性信息,在本节示例游戏的逻辑中,我将传送点的Key值记录到障碍物数组中(目前该数组仅存的值为01,分别代表障碍物与非障碍物,而其他2-255之间的数均可以为我们另当别用),时时判断主角当前所处在障碍物数组的值为某传送点的Key值时,则触发传送点的传送事件,将主角传送到它指定的地图:

传送到新地图后,通过一些逻辑将之前地图的资源移除掉,由于目前的示例游戏整体结构已趋于复杂,在新内容不断添加下,显得尤为冗乱,因此具体代码就不列出来了,大家可从源码中自行体会。另外的,一张地图可以包含若干传送点负责承接多张地图间的传送,同样的,我们只需在配置文件中添加多个节点即可,以下为第二张地图的传送点配置:

     <Teleports>

       <Teleport Code="6" Key="10" To="0" …… Tip="云海仙境" ……/>

       <Teleport Code="6" Key="11" To="2"…… Tip="天龙港" ……/>

</Teleports>

接下来让我们将主角移动到传送点,此时画面即会切换到第二张地图:

 

大家可以看到,此张名为“东海龙宫”的地图上分布着两个传送点,可分别将主角传送到“云海仙境”与“天龙港”。当然,这些传送都是能自由往返的:

需要特别说的是,本节示例源码中并未为传送添加过程(Progress)。在正式的游戏开发中,特别是网络游戏的开发中,地图的切换伴随着较多的新地图数据加载(下载),此过程比较常见的做法就是显示一张背景图附加一个进度条。实现起来还是比较简单的,例如可以通过将画布透明掉,并禁掉所有的输入来实现。

最后,本节的地图传送在原理上是实现了,但逻辑方面存在着BUG,这些BUG主要因为画布中资源的管理问题而引起,这又要回溯到整个游戏框架架设的问题。就像本文开头说的那样,由于不断的为游戏添加新功能,最终的结果誓必造成整体结构的冗乱繁杂,看来第二次重构势在必行。

而这次重构,我打算建立在Silverlight平台上,这标志着WPF游戏教程就此终结;未来我将展示给大家的是基于Silverlight3.0的全新教程,且在完美继承之前WPF下示例游戏的所有功能的基础上,继续往下写,这是一个全新的开始。我也希望能在大家共同的的协助与探讨下,将此Silverlight游戏引擎做得越来越棒!

历史的进步永远都包含着激情与渴望,让我们一同迎接来自东方的第一线曙光!

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