如何在基于块的2D游戏中实现遮挡照明?


11

我想要2D照明可以被游戏中的物体阻挡。我的游戏具有自顶向下的视图,所有游戏对象均由矩形描述。

假设我有一个10x10的世界,我在1x1处放置了一个灯光,并在该灯光周围放置了墙壁。我希望能够看到1x1的光源,但看不到其他任何地方,因为它被墙壁挡住了。

我听说过投射光线有效,但实际上如何运作?


1
希望看到一些与该语言无关的答案。
Dashto

2
@Dashto:您需要使用所使用语言的一段代码吗?那是错误的地方
。.– Kromster

你尝试了什么?当您说“其他任何地方都没有光源”时,您是什么意思?只是照亮您1,1块就可以了。也许我没收到您的问题,您可以张贴插图吗?
Laurent

1
@Krom Stern:实际上,我要的是完全相反的问题–一个不依赖语言的概念性答案。作为重复链接的两个线程并没有太多讨论这些概念。实际上,此站点上的大多数类似问题都只是回答“使用此库!”。对于想了解其工作原理的人来说,它的帮助较小。
Dashto

@Dashto:这是重要的信息,您应该将其添加到问题中;)
Kromster

Answers:


13

阿米特·帕特尔(Amit Patel)写了一篇非常好的 2D射线投射文章

这涉及到将光线投射到光源范围内的每个顶点以建立光网格。

在此处输入图片说明

帖子中的所有可视示例都是交互式的,非常易于理解。

您也不必将自己限制在盒子内,您所跟踪的周边可以是您喜欢的任何形状。


1

您应该使用光线投射算法,这意味着,您应该能够计算光线(场景中的任何物体)(线,正方形,圆形,三角形等)与光线(半线)的交点,并选择最接近的交点。您向各个方向投射光线,然后仅“绘制”光线到最近的物体。

这是可能的样子


我只是问我将如何使用射线投射。我知道
LiquidFeline

0

如果您知道什么是射线投射,那么您真正需要做的就是对其进行硬编码。只要每个顶点都有坐标,它就不会太复杂。

首先,创建一个发光物体。将光源放置在x,y坐标处。

#include <math.h>
int i = 0;
if ( sqrt( abs( light.x - vertex.x )^2 + abs( light.y - vertex.y )^2 ) <= light.radius)
{
    lightOccludingVertices[i] = vertex;
    i++;
}

//If two or more vertices are both a member of an individual wall,
//illuminate the triangular area between the light, the furthest 
//vertex on the x-axis, and the furthest vertex on the y-axis

这不能保证对凹面多边形有效,但是对任何凸面多边形都可以正常工作。

如果在应用照明后将您的遮挡对象(墙壁,角色,飞行的紫色食者)涂在屏幕上,则此方法将起作用。否则,墙壁的一半看上去会比另一半明显更亮。如果您的点光源与同一壁的两对顶点等距(恰好是壁高的一半),则将三角形应用于最近的两个顶点,而不是两个更远的顶点。

我还应该提到,此方法需要动态创建的顶点,在顶点处,光线半径的边缘与遮挡对象的表面相交。这将为任何遮挡对象创建至少3个顶点,并允许延伸到超出光线半径(或超出屏幕半径)的墙也阻挡任何光线。

有关凹凸多边形的更多信息

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.