2D瓷砖照明

时间:2012-03-25 23:06:07

标签: c# xna 2d hlsl lighting

我正在为基于XNA 2D tile的游戏添加照明。

我发现this文章很有用,但它完成它的方式不支持碰撞。我想要的是一种方法来执行以下操作

  • 一直点亮
  • 碰撞(如果光线撞击一个块,然后将下一个块调暗任何数量,直到暗处模拟阴影)

我一直在寻找相当长的一段时间但没有运气(我确实找到了Catalin的教程,但它对我来说似乎有点先进,并且因为重新绘制每个点的整个游戏而不适用于瓷砖)

2 个答案:

答案 0 :(得分:1)

我将分享将平滑照明效果应用于2D平铺网格的方法。 ClassicThunder的answer为阴影提供了一个很好的链接。

首先,我们需要计算每个瓷砖的光照值,以后会模糊。让我在进入代码之前说明这是如何工作的。

Lighting

基本上我们所做的是遍历所有切片,从顶部开始,如果切片为空白,则将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游戏不需要法线,因此该公式应该相对容易。