目前地图编辑器已经能够对地图图片进行切片了,那么接下来我们需要做的是对切好的地图片进行拼装从而取代整张大地图。需要特别说明的是,如果一次性将所有的切片加载进游戏中并显示出来,那么效果与使用一张整的地图几乎没区别,性能上甚至可能会更差;本节我们最终要达到的目的是利用这些切片自适应的填充游戏窗口区域,即用最少的地图片实现窗口的无缝填充,从而提升游戏的整体性能。
教程示例游戏窗口模式时的窗体尺寸为800*600,那么我们首先根据此尺寸以400*300为单位利用地图编辑器切割出若干地图切片:
此时我们回过头来对照一下地图原图的容量与现在切好片的地图片的容量总和即会发现,在保持画质不变的前提下,切片后的总容量比之前减少了近一半。如果您做的是网络版,那么通过切片来实现按需下载,将缩短用户加载程序的时间同时降低服务器的负担:
接下来是关键了,游戏窗口800*600,地图切片每张为400*300,那么每次最少需要显示多少张切片才能在主角无论处于何位置时都能填满游戏窗口呢?大家不妨先看下图:
主角始终处于游戏窗口的正中,那么它距离左边400像素,距离顶端300像素,因此,我们通过边缘法可以得出,只需要根据主角的x,y坐标计算出主角当前所处的地图切片代号。以上图为例,此时主角所处的切片为2_3.jpg,那么我们只需加载2_3以及它周边的9张切片:1_2.jpg、2_2.jpg、3_2.jpg、1_3.jpg、2_3.jpg、3_3.jpg、1_4.jpg、2_4.jpg、3_4.jpg即可完美填充整个游戏窗口。当然,填充用地图切片必须是自适应的,即时时根据主角所处位置来更换所需要切片。
理解原理后,代码实现起来就简单多了,首先我们需要修改地图Surface初始化代码:
Canvas MapSurface;
int mapSectionWidth, mapSectionHeight, mapSectionXNum, mapSectionYNum;
/// <summary>
/// 初始化地图地表层
/// </summary>
private void InitMapSurface(XElement args) {
MapSurface = new Canvas() {