我正在为基于XNA 2D tile的游戏添加照明。
我发现this文章很有用,但它完成它的方式不支持碰撞。我想要的是一种方法来执行以下操作
我一直在寻找相当长的一段时间但没有运气(我确实找到了Catalin的教程,但它对我来说似乎有点先进,并且因为重新绘制每个点的整个游戏而不适用于瓷砖)
答案 0 :(得分:1)
我将分享将平滑照明效果应用于2D平铺网格的方法。 ClassicThunder的answer为阴影提供了一个很好的链接。
首先,我们需要计算每个瓷砖的光照值,以后会模糊。让我在进入代码之前说明这是如何工作的。
基本上我们所做的是遍历所有切片,从顶部开始,如果切片为空白,则将CurrentLight
变量设置为最大亮度,如果找到实体切片,则将其设置为{{ 1}}变量并从CurrentLight
中减去“吸收”量。这样,在我们的下一个实体图块上,当我们将图块设置为CurrentLight
值时,它会略微减少。重复此过程,直到迭代数组。
现在会有一个很好的从上到下的照明效果,但它并不是那么好。我们必须再重复这个过程3次,从下到上,从左到右,从右到左。它可以重复多次以获得更好的质量。
基本上在循环中的每个tile上运行此代码
CurrentLight
你去,漂亮的瓷砖照明。但是,如果您想要更少的“像素化”外观,可以查看我的question on gamedev。
答案 1 :(得分:0)
对于每像素照明,您可能需要查看其他地方,因为我不知道这一点。 对于每瓦照明,
在SpriteBatch.draw中,一些重载方法需要一种颜色。当您使用Color.White时,SpriteBatch绘制的精灵是正常颜色。
通过创建新颜色使用颜色乘法(Color.yourcolor.r * float,Color.yourcolor.y * float,Color.yourcolor.z * float,255)
基本上,为了获得浮动,尝试找出一个公式来计算由于附近的灯(可能存储在数组或列表中)导致的块的亮度。由于2D游戏不需要法线,因此该公式应该相对容易。