(“射线追踪”)

我正在写一个基于平铺的小游戏,为此我想支持光源。 但是我的算法太弱,所以我来找你帮忙。

情况是这样的:有一个基于瓦片的地图(保存为二维数组),包含一个光源和几个项目。 我想计算哪些瓦片由光源照亮,哪些瓦片在阴影中。

大概是什么样子的视觉辅助。 L是光源,X是阻挡光线的物品,0是点亮的瓷砖,而-s是阴影中的瓷砖。

0 0 0 0 0 0 - - 0
0 0 0 0 0 0 - 0 0
0 0 0 0 0 X 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 L 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 X X X X 0 0
0 0 0 - - - - - 0
0 0 - - - - - - -

当然,分数系统会更好,因为由于部分遮挡,瓦片可能处于半影状态。 该算法不一定非常完美 - 只是没有明显的错误和相当快的速度。

(当然,会有多个光源,但这只是一个循环。)

任何接受者?


roguelike开发社区对视线,视野算法有一点点痴迷。

这里有一个关于这个主题的roguelike wiki文章的链接:http://roguebasin.roguelikedevelopment.org/index.php?title=Field_of_Vision

对于我的roguelike游戏,我使用Python实现了阴影投射算法(http://roguebasin.roguelikedevelopment.org/index.php?title=Shadow_casting)。 把它放在一起有点复杂,但是运行起来非常有效(即使是在纯Python中)并且生成了很好的结果。

“宽容视野”似乎越来越受欢迎:http://roguebasin.roguelikedevelopment.org/index.php?title=Permissive_Field_of_View


你可以通过计算遮挡等来解决各种复杂问题,或者你可以使用简单的强力方法:对于每个单元,使用线绘制算法,如Bresenham线算法来检查当前单元和光线之间的每个单元资源。 如果任何已填充的细胞或(如果您只有一个光源)细胞已经过测试并发现处于阴影中,则您的细胞处于阴影中。 如果您遇到已知点亮的细胞,您的细胞也会同时点亮。 一个简单的优化就是设置沿线所遇到的任何单元格的状态,以达到最终结果。

这或多或少是我在2004年IOCCC获奖作品中使用的。 显然,这并不是很好的示例代码。 ;)

编辑:正如洛伦指出的那样,通过这些优化,你只需要选择沿着地图边缘的像素来追踪。


这里介绍的算法似乎在做比我认为需要的更多的计算。 我没有测试过这个,但我认为它会工作:

最初,将所有像素标记为点亮。

对于地图边缘的每个像素:正如Arachnid所建议的那样,使用Bresenham来追踪从像素到光线的线条。 如果该线遇到障碍物,则将所有像素从边缘标记为仅在遮挡物之外,因为它处于阴影中。

链接地址: http://www.djcxy.com/p/40201.html

上一篇: based game ("raytracing")

下一篇: Algorithmic solution of card puzzle