MANGOS中的地图管理
从蚊子叮blog上转载的,但是这儿是老家。
这里所说的地图管理是指服务器端的地图管理以及地图上的对象管理。
在魔兽中,一组服务器为一个世界,一个世界内同时存在着多个游戏场景,如东部王国,卡利姆多,监狱副本,战场等。每个游戏场景都对应着一幅地图,但一幅地图却并不一定能确定一个场景,这是因为有副本的存在。在一个场景地图里,还会分区域,比如东部王国里会有艾尔文森林区域、西部荒野区域等。
从wow客户端的adt及wdt数据里可以大致了解到地图相关数据。每张地图最多有64*64个格子【重剑注:看了下朝哥的worldEditor,果然是左下角(0,0)右上角(63,63) 】,每个格式大小为533.33333*533.33333(即1600/3,为什么设定成这个数字?)除了东部王国和卡利姆多外,大部分的地图都比较小,不会真正占用这么多个格子。每个格子用一个adt文件来描述其详细信息,另外有一个wdt文件来指出该地图中哪些编号的格子存在。
再来看mangos中是如何表示这种结构的。一张地图就是一个Map对象,对于可以创建出多个场景的副本地图,多个副本也就对应着多个Map对象,里面记录了当前管理的是哪个副本,另外再有一个MapInstanced组件来维护副本地图列表。地图内分成的64*64的格子,每个格子的信息包括区域标志、地形类型、水位层级和高度数据,用GridMap结构体来表示,由Map来维护这个GridMap二维数组。另外Map内还维护了该地图内所有的WorldObject和GridObject列表,当然也是以Grid为单位来保存。
由于一个Grid的实际大小为533*533,其范围还是非常大的,一般玩家也不需要关注这么大范围内的所有对象,所以mangos又将一个Grid分为了8*8个Cell,每个对象都同时关注当前所在Cell及周围的八个Cell内的对象。这种划分格子来管理地图区域的方法在以前基于TILE的2D游戏中差不多为最通用的方法。
现在的服务器地图有些也引入了客户端场景管理的方法,使用四叉树、八叉树的方式,云风与地图管理有关的两篇文章可以看一下:
http://blog.codingnow.com/2006/10/quadtree.html
http://blog.codingnow.com/2006/12/collision.html
posted on 2009-05-05 15:01
七星重剑 阅读(1981)
评论(5) 编辑 收藏 引用 所属分类:
Game Engine