【问题标题】:strategy game help: fog of war策略游戏帮助:战争迷雾
【发布时间】:2013-06-30 16:40:11
【问题描述】:

我正在尝试制作一款实时战略游戏,例如星际争霸或帝国时代。我的地图必须支持多达 1500 个实体。我的问题是如何在不滞后游戏的情况下实现战争迷雾。我最初尝试的方法是简单地计算一个单位每次移动时到所有周围区域的距离,但正如我预期的那样,这是滞后的,因为许多单位会不断移动。如果有人知道战争迷雾的更快算法,请提供帮助。地图将基于图块并存储在数组中。

【问题讨论】:

    标签: java algorithm


    【解决方案1】:

    一个非常基本的实现可以如下:

    • 可见性由每个图块(i,j) 的值v[i,j] 给出。任何低于某个阈值的值都在雾中。

    • 使用以下两个步骤以定期时间步长更新值(注意:对于这种情况,除了非常特殊的情况外,不需要高精度或高频率):

      1. 模糊当前地图v[i,j]
      2. 对于每个unit,将值v[unit_i, unit_j] 增加一个常数。您还可以添加一个恒定的数量如果一个单位在一个正方形上(不管它们有多少)。

    【讨论】:

    • 我没有完全按照。我了解您的基本概念,我认为最终会使用它,但是您所说的模糊地图是什么意思,unit_i 和 unit_j 应该是什么?
    • @stas 模糊或多或少是应用于您的阵列的过滤器(参见例如en.wikipedia.org/wiki/Box_blur)。您可能已经在图像被涂抹的图像中看到它。使用 unit_i 和 unit_j 我只是想描述一个单位实际站立的地图图块。
    • 我为什么要模糊它?
    • @stas 为了在单位影响可见性的地方有一定的半径。例如。在一维情况下,该单元会将地图设置为[0,0,0,1,0,0,0],在一步之后看起来例如喜欢[0,0,0.25,1,0.25,0,0]。因此,根据阈值,您可以拥有一个可见的地图图块(单位所在的位置)或三个。模糊是一种在地图上“散布”单位而不实际计算距离的简单方法。
    【解决方案2】:

    另一种解决方案:为您的实体分箱。

    您创建了一个相对空闲的网格,甚至是一个四叉树。给定坐标(x,y),它允许您在log(d) 步骤中找到位于相同(或相邻)单元格中的所有实体,其中d 是您的四叉树的深度。

    借助绳索(叶节点指向相邻单元的指针),可以在恒定时间内访问邻居。

    要了解给定的地图图块是否可见,您只需查询四叉树即可。

    此外,四叉树可能对与战争迷雾无关的其他任务有用。例如。你可能想找到离给定坐标(x,y)最近的“工人”,或者你想对一个地区的所有单位施加一些区域伤害。

    【讨论】:

    • 静止。编写自己的东西(例如游戏)是学习新东西的好机会 :) 只需 google 或查看 wiki 即可开始。那里有很多编程的东西。
    【解决方案3】:

    每当一个单位移动时,您可能会认为它会移动到相邻的图块,不是吗?在这种情况下,您还可以假设该单元的可见区域也沿同一方向移动一个格子,因此您应该可以轻松确定或更新应该可见的区域。根据单位的视线半径,仅更新需要更新的值可能会节省大量 CPU 资源。

    问题应该是应该被模糊的区域 - 可以有更多的单位看到同一个图块,但这可以通过按照霍华德的建议来解决。

    【讨论】:

    • 这可能会起作用,但是我将不得不存储每个单元的前一个点,因为它们不会按图块移动,但图块就像地图碎片一样,它们可以在它们内部和之间移动。
    • 这真的取决于瓷砖有多大。您是否只能在单位移动到另一个图块而不是在一个图块内时更新 FOW?如果没有,那么我在这里写的内容对你没有多大帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-05
    • 2018-10-24
    • 2017-11-08
    相关资源
    最近更新 更多