游戏地图的画面是游戏中不可缺少的重要环节之一,要产生游戏地图,除了可以直接使用已经绘制好的地图外,对于一些画面不太复杂,且具有重复性质的地图或场景,有一个比较好的解决办法,那就是利用地图拼接的方法,将一小块一小块的小地图组合成较大的地图。
地图拼接的优点在于节省系统资源,因为一张大型的地图会占用比较多的内存空间,且加载速度较慢,如果游戏中使用了为数较多的大型地图,那么势必会降低程序运行时的性能,而且需要相当可观的内存空间。
本篇随笔从最基本的平面地图贴图开始讲起,这种贴图方法相当直观,即利用一张张四方形的小图块组成同样是四方形的大地图。下图便是一张由3种不同图块组合而成的平面地图。
事实上,这张地图是由4×3张小图块组成的,列方向是4张图块,行方向是3张图块,这里使用列与行这样的字眼,是因为随后将使用数组来定义地图中出现图块的内容。
从这张图中可以看到,一共出现了3中不一样的地图,这是因为程序中会事先以数组定义哪个位置上要出现哪一种地图,使得拼接出来的地图能够符合需求。现在假设图中3种不同图块的编号分别为0、1和2,那么可以以下面的这个一维数组来定义出上图中的地图。
int mapblock[12]={0,1,1,1, //第1列
2,0,1,2, //第2列
2,2,2,2}; //第3列
//为什么用一维数组而不是二维数组呢?
将这个一维数组以行列的方式排列,可以看出每个数组元素对应图中的哪个图块。
需要提醒的是,由于使用的是一位数组来定义地图内容,因此上面这个数组的每个元素的索引值是0……11.但是,由于程序里不论计算图块贴图的位置还是计算整张地图的长宽尺寸,都是以行列来进行换算的,所以需要将数组的索引值转换成相应的列编号与行编号,转换公式如下:
列编号 = 索引值 / 每一列的图块个数(行数);
行编号 = 索引值 % 每一列的图块个数(行数);
下图验证上面的公式,方格中的编号是一维数组的元素索引值。
这里需要注意的是,列编号与行编号的起始值都是从0开始算起,而一旦算出了列编号与行编号之后,便可以按照图块的宽与高来求出图块贴图的位置,下面是计算图块左上点贴图坐标的公式。
左上点X坐标 = 行编号 × 图块的宽度;
左上点Y坐标 = 列编号 × 图块的高度;
范例ch2_9:运用不同小图块,示范平面地图拼接的技巧。
下载地址:ch2_9(上传到windows live空间,可能需要MSN账号登陆)
说明:程序源代码中有相关的注释。
程序运行结果如下图:
PS:如想获得更多关于Visual C++游戏开发的内容,可点击随笔:《Visual C++游戏编程基础》学习笔记——索引随笔。