2D层面上的战争迷雾逻辑设计

视野迷雾

起始需求:创建场景

创建场景如下 :

1.后缀为“_occ”的视野阻挡(此步是为了之后根据_occ字符串从场景中拿到所有场景中对视野有障碍的节点数组)。

2.无后缀的阻挡(即高度不足以遮挡视野的阻挡)。

3.在构建地图地形时,让所有多边形阻挡都是凸多边形,(凹多边形也可以做成几个凸多边形的组合)

正式迷雾遮挡过程:

第一步要做的事是将场景中的障碍物都用一个个的外包圆包装起来,

这一步的目的是:通过外包圆来保证障碍的位置数组(多边形障碍的端点位置数组)可以完全完整的放进场景中划分的格子中,不会出现某些漏放的情况出现。场景格子的存在是为了优化(经典优化方式)

步骤如下:

1.遍历场景所有阻挡(数组),遍历这个阻挡所有端点,将所有端点的x, y坐标取平均值, 作为圆心,然后再取这个圆心到阻碍上最远的点作为半径,这样就可以将整个障碍放进外包圆中。

2.我用的阻碍的存储格式是数组(可以根据实际使用情况进行更改),我们这个外包圆也以数组的形式存储,circleBox[ i ] = { center = {x, y}, radius = R }, i 对应的是对应阻挡数组的index, 这样就可以将外包圆与阻挡数组产生联系了。

第二步要做的事是将场景中的阻碍在预加载的过程中放入场景中的格子中,

这一步的目的是:因为在游戏中玩家时时刻刻都处于移动的过程中,所以要通过格子来进行第一步筛选玩家附近的阻碍,优化效率。

步骤如下:

1.在预加载的过程中,先在每个格子的遍历过程中对所有阻碍的外包圆进行一次遍历,并判断该格子是否任意端点在外包圆中,如果在,说明这个格子中有这个外包圆。并将这个外包圆和障碍数组放进这个格子中,便于将来玩家判断周围格子的阻碍。

第三步要做的事就是将视野范围内的阻碍(多边形)切割开,如图所示。

图1.1.视野切割后的多边形阻碍

切割后的新多边形组成的点为在视野内的点,以及多边形与视野圆的交点,按顺序逐个连接的多边形。

这一步的目的是,去除会影响视野线判断的多余形状,只拿到真正对自己视野判断有影响的形状,可以避免视野外的阻碍形状产生错误的干扰。

步骤如下:

1.遍历周围的阻碍数组,先拿到玩家附近的格子。然后从格子中拿到障碍数组,判断该障碍数组的外包圆圆心到玩家位置是否比玩家视野范围半径与外包圆圆心半径之和小,如果大于则说明该障碍与人物距离过远不必判断。然后遍历障碍数组的每一条边(线段),

2.创建新的临时障碍数组,遍历障碍数组中的所有端点(障碍数组的端点是按照顺时针或逆时针逐个存储的),如果有任意一个点在我的视野里就放入这个新的阻碍表中,并将之视为起始点。然后判断以这个点为端点的线段是否会与圆相交,这个方法会返回三种情况:

没有点,一个点,两个点。

没有点就说明两个端点全都在视野圆中,就逐个放进临时数组中。

一个点就将交点放进数组另一个端点说明没影响。

两个点就将交点按顺序放进数组(线段起点到终点顺序),这个方法会返回一个临时用的数组,这个数组储存所有一会将要判断视野的障碍。

3.判断凸多边形的影响视野情形

实际上的凸多边形阻挡视野的判断方法是从实际视野判断阻挡取得的灵感,具体操作上用到了非常多的线段相交。

我们在视野中能看见一个障碍物所有端点是因为我们的视线到这些端点之间没有阻挡,所以只要连接玩家位置到端点,然后判断是否与障碍数组的多边形有交点(要排除端点邻近的两条线段),有交点说明这个障碍点看不见,没有交点说明看得见。至于拿到最终的影响视野的两个端点方法是,在计算端点时将所有从人物坐标点开始到障碍多边形的端点的连接线延长,至于延长距离与玩家的视野范围相同即可,这样拿到的没有交点的两个端点即为要拿到的点。

通过以上步骤,我们可以拿到周围所有障碍物的影响视野的两个关键点了,接下来是视野内覆盖迷雾,因为我用的引擎中没有提供一个多边形中某个边是弧这样的异形多边形(观测王者荣耀也这样,因为赵云戳戳戳的技能两侧比中间长,梯形无疑),因此,我用了六边形(直接梯形也行)来盖住目标区域,样子如图,1-6线是垂直于1-2的,,,我画的有点歪,2-3也是垂直于1-2的。

图1.2.多边形视野阻碍

计算1,2点位置的方法有很多,一种思路是连接6-3然后做平行线,偏移距离是3-6中点与圆心相连到圆上的点到3-6中点的距离。

以上,一个障碍物对于人视野中阻挡的迷雾范围就有了,只要先将整个地图覆盖迷雾,再玩家附近迷雾全部打开,最后用以上所述方法将附近障碍物引起的视野阻碍全部盖住即可。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值