#rogue-like #fov #shadowcasting

symmetric-shadowcasting

阴影投射视野算法的简单实现

3 个不稳定版本

0.2.0 2020年11月1日
0.1.1 2020年8月16日
0.1.0 2020年8月16日

#1592算法


用于 areaportal2d

CC0 许可证

13KB
213

对称阴影投射

这个存储库只是将此处显示的 Python 实现的阴影投射算法翻译成 Rust。这是一篇非常好的文章,包含视觉和解释。

这个实现已经针对文章中的示例进行了测试,并产生了相同的结果。

使用方法

此包的使用很简单——只公开了一个函数

pub type Pos = (isize, isize);

pub fn compute_fov<F, G>(origin: Pos, is_blocking: &mut F, mark_visible: &mut G)
    where F: FnMut(Pos) -> bool,
          G: FnMut(Pos), {

此函数接受一个位置,这是一个 isizes 对(你可能需要将其转换为和转换回此类型),以及两个闭包。

闭包 _blocking 会告诉算法何时一个瓦片被阻挡,例如由墙壁阻挡。它可能在其环境中捕获某种用户结构,例如网格或地图。

对于每个可见的瓦片,会调用闭包 mark_visible,允许用户处理该瓦片。它可能在其环境中捕获一些可变状态,通过指示可见瓦片来修改它。

请参阅测试用例以了解如何使用此功能。

限制

我希望这个接口提供一种查找阻挡瓦片并修改同一结构的方法,但我无法解决生存期问题。因此,你将不得不在 _blocking 中不可变地捕获你的地图结构,并在 mark_visible 中可变地捕获其他结构以跟踪结果。我预计这个突变的结构将被用来修改地图或网格,也许如果我们在这个结构内部标记可见性,我们可能需要首先克隆它。

类似包

已经有了 shadowcast 包。这个包似乎实现了额外的算法,可能是一个很好的选择。它似乎提供了某些附加功能,例如投射不同形状,这很酷。它还似乎做出了一些额外的假设,需要更多的依赖项,并提供了一个更复杂的 API。如果你在寻找不同类型的投射,可以查看它。

别名

我的兄弟建议给这个包取另一个名字——我不吃投射阴影的任何东西。这很有趣,但我选择了标题中算法来源的乏味选项。

许可证

与原始算法一样,此许可证为 CC0。

依赖项

~320KB