C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(三十八)2010-02-23 博客园 深蓝色右手C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(三十八)地图间的传送与切换终于到了地图处理的最后一节,本节我将为大家讲解如何通过传送点实现主角在地图间的传送以及地图之间的切换。地图转换的关键在于把握好移除与添加:即移除之前地图上除主角之外的所有对象,然后再重新加载新地图上的所有对象。本教程示例游戏中,每张地图的信息都详细的记录于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值记录到障碍物数组中(目前该数组仅存的值为0或1,分别代表障碍物与非障碍物,而其他2-255之间的数均可以为我们另当别用),时时判断主角当前所处在障碍物数组的值为某传送点的Key值时,则触发传送点的传送事件,将主角传送到它指定的地图:

传送到新地图后,通过一些逻辑将之前地图的资源移除掉,由于目前的示例游戏整体结构已趋于复杂,在新内容不断添加下,显得尤为冗乱,因此具体代码就不列出来了,大家可从源码中自行体会。另外的,一张地图可以包含若干传送点负责承接多张地图间的传送,同样的,我们只需在配置文件中添加多个节点即可,以下为第二张地图的传送点配置:
<Teleports>
<Teleport Code="6" Key="10" To="0" …… Tip="云海仙境" ……/>
<Teleport Code="6" Key="11" To="2"…… Tip="天龙港" ……/>
</Teleports>
接下来让我们将主角移动到传送点,此时画面即会切换到第二张地图: