返回

多层地图的表述

一般的游戏地图通常使用一个2维数组来描述,在每个格子里填上属性。即使在 3d 技术制
作的游戏中,这种方法也普遍存在。

当一个地图上出现类似桥梁的东西时,这种方法遇到的困难,桥上和桥下的空间的 x,y 值
完全相同,如果在每个格子中保留一个高度的链表,又不适应一些算法的设计。

在地图上少量存在分层地形时,云风这里提出如下方案描述地图:

首先给大地图分块,比如 128x128 为一块。只在块中需要分层的地方有链表保存两个块。
基本层称为 1 层,高出的层依次为 2 层,3层...,0层保留

每个地图最小单位的格子上保留 4 个基本数据描述和四个方向的通路,比如以下两层地图


-------------------------         -------------------------
|   |   |   |   |   |   |  	  |///|///|///|///|///|///|
|   |   | | | | |   |   |  	  |///|///|///|///|///|///|
|   |   | V | V |   |   |  	  |///|///|///|///|///|///|
-------------------------	  ----------V---V----------
|   |   |///|///|   |   |  	  |///|///|   |   |///|///|
|   |   |///|///|   |   |  	  |///|///|   |   |///|///|
|   |   |///|///|   |   |  	  |///|///|   |   |///|///|
-------------------------	  -------------------------
|   |   |///|///|   |   |  	  |///|///|   |   |///|///|
|   |   |///|///|   |   |  	  |///|///|   |   |///|///|
|   |   |///|///|   |   |  	  |///|///|   |   |///|///|
-------------------------	  ----------V---V----------
|   |   | | | | |   |   |  	  |///|///|///|///|///|///|
|   |   | V | V |   |   |  	  |///|///|///|///|///|///|
|   |   |   |   |   |   |  	  |///|///|///|///|///|///|
-------------------------	  -------------------------

左边为第一层,中间有4格是一个上下贯通的桥梁,第2层显示了这个桥梁的桥面。桥的上下
两端是桥面的入口,而桥底是可以左右通行的。那么我们就可以这样描述这个 6x4x2 的地
图:

-------------------------         -------------------------
| 0 | 0 | 0 | 0 | 0 | 0 |  	  | 0 | 0 | 0 | 0 | 0 | 0 |
|0 1|1 1|1 1|1 1|1 1|1 0|  	  |0 0|0 0|0 0|0 0|0 0|0 0|
| 1 | 1 | 2 | 2 | 1 | 1 |  	  | 0 | 0 | 0 | 0 | 0 | 0 |
-------------------------	  -------------------------
| 1 | 1 | 0 | 0 | 1 | 1 |  	  | 0 | 0 | 1 | 1 | 0 | 0 |
|0 1|1 1|1 1|1 1|1 1|1 0|  	  |0 0|0 0|0 2|2 0|0 0|0 0|
| 1 | 1 | 1 | 1 | 1 | 1 |  	  | 0 | 0 | 2 | 2 | 0 | 0 |
-------------------------	  -------------------------
| 1 | 1 | 1 | 1 | 1 | 1 |  	  | 0 | 0 | 2 | 2 | 0 | 0 |
|0 1|1 1|1 1|1 1|1 1|1 0|  	  |0 0|0 0|0 2|2 0|0 0|0 0|
| 1 | 1 | 0 | 0 | 1 | 1 |  	  | 0 | 0 | 1 | 1 | 0 | 0 |
-------------------------	  -------------------------
| 1 | 1 | 2 | 2 | 1 | 1 |  	  | 0 | 0 | 0 | 0 | 0 | 0 |
|0 1|1 1|1 1|1 1|1 1|1 0|  	  |0 0|0 0|0 0|0 0|0 0|0 0|
| 0 | 0 | 0 | 0 | 0 | 0 |  	  | 0 | 0 | 0 | 0 | 0 | 0 |
-------------------------	  -------------------------

注意每个格子里的四个数字,应该能看出一些门道,它实际描述的是上下左右四个方向和和
第几层连接。当然,连接的肯定是对应方向坐标的格子,只是图层不同。0 作为保留值,表
示了障碍。

下面我们要处理远程武器飞行障碍,有或者是视线可达区域的问题。这在网络游戏服务端很
有价值,通常我们需要知道一个实体会看到那些区域,以方便将自身的信息广播给相关的其
他实体。

这样我们需要继续为每个格子添加一个属性,也就是是否能遮挡住某种信息,比如箭矢是不
能通过的,或者视线会被遮挡。同一层里只用使用直线判定,看两格直线间是否有遮挡物。

越层的稍微复杂一些,要视具体应用来决定算法,比如在只有2层的世界里,可以粗略的认
为,两格的直线上,先以高层的格子属性判定为准,只有在高层悬空碰到无属性格时在查询
低层的格子。这些方法需要根据实际情况去发挥。

云风 04 年 5 月作,谢绝转载

名字: 自动排版 密码:

回复 | (306) | 云风 | 2004-05-11 03:00:23