C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  117 Posts :: 2 Stories :: 61 Comments :: 0 Trackbacks

常用链接

留言簿(8)

搜索

  •  

最新评论

阅读排行榜

评论排行榜

 

    游戏地图的画面是游戏中不可缺少的重要环节之一,要产生游戏地图,除了可以直接使用已经绘制好的地图外,对于一些画面不太复杂,且具有重复性质的地图或场景,有一个比较好的解决办法,那就是利用地图拼接的方法,将一小块一小块的小地图组合成较大的地图。
    地图拼接的优点在于节省系统资源,因为一张大型的地图会占用比较多的内存空间,且加载速度较慢,如果游戏中使用了为数较多的大型地图,那么势必会降低程序运行时的性能,而且需要相当可观的内存空间。

    本篇随笔从最基本的平面地图贴图开始讲起,这种贴图方法相当直观,即利用一张张四方形的小图块组成同样是四方形的大地图。下图便是一张由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++游戏编程基础》学习笔记——索引随笔

posted on 2010-04-09 09:26 烟皑 阅读(1530) 评论(2)  编辑 收藏 引用 所属分类: 《Visual C++游戏编程基础》学习笔记

Feedback

# re: 游戏地图制作——平面地图贴图[未登录] 2010-08-02 18:09 cliz
你好 我登入msn 也下载不了你的代码啊。。
能不能发给我一份啊。。谢谢了。。
souliz@live.cn  回复  更多评论
  

# re: 游戏地图制作——平面地图贴图 2013-07-23 23:36 求學
你好,登入後代碼已經消失,能否寄給我一份?謝謝
sa39390419@yahoo.com.tw
(ps:其它講解的代碼也已消失)  回复  更多评论
  


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理