我有一张collsion地图,有些地方我想成为光源。光源提供的光实际上是我可以看到地面的形状。它现在看起来像这样:
所以光线穿过墙壁。我想让它看起来像这样:
(我标记了墙壁与深黄色的碰撞)
因此光线在遇到墙壁时会停止。我想得到正确光线的形状,最好的是包含它的位图)
我的第一个想法是从光源投射光线并检查它们何时与墙壁碰撞(我知道如何做到这一点),但是我需要每隔0.001度投射一次光线,所以它太多时间了发光。接下来的事情是光的形状并不总是圆形,有时它可以是椭圆形或半椭圆形,甚至是三角形或圆形的一部分。一般来说,我的光点位图不会碰到任何东西,我想稍微减去它,使它看起来像第二张图像。
最后一点,我使用了allegro 4.2.1,但之前提到的所有位图都是2维度阵列,0和1。
Thanx任何帮助,对不起长问题和我的英语不好。
答案 0 :(得分:7)
基本的想法是你计算墙壁的阴影区域而不是那个颜色。
This article应该给你一个良好的开端。
答案 1 :(得分:2)
在您的特定示例中,您可以通过检查每个(空)像素到光源中心的视线来轻松强制它。如果你有视线并且距离在衰减范围内,那么你在那里有光。如果没有,那就太黑了。
答案 2 :(得分:2)
MadKeithV解决方案需要O(像素数^ 2)时间。
我的解决方案是扩展的MadKeithV想法,但以O(像素数)时间运行。通过一些改进,它将工作在O(光线中的像素数)
首先,从包含光源的像素开始。然后使用BFS程序'感染'最近的像素与光和存储角度范围,光从哪个方向可以从每个点前进。
在以下BFS实例中,重复此过程,仅考虑“感染范围”中的像素。