(“射线追踪”)
我正在写一个基于平铺的小游戏,为此我想支持光源。 但是我的算法太弱,所以我来找你帮忙。
情况是这样的:有一个基于瓦片的地图(保存为二维数组),包含一个光源和几个项目。 我想计算哪些瓦片由光源照亮,哪些瓦片在阴影中。
大概是什么样子的视觉辅助。 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