【发布时间】:2012-03-25 23:06:06
【问题描述】:
我正在为基于 XNA 2D 瓦片的游戏添加光照。
我发现this 文章很有用,但它的完成方式不支持碰撞。我想要的是一种执行以下操作的方法
- 始终点亮点
- 碰撞(如果光线击中一个方块,则将下一个方块调暗,直到其变暗以模拟阴影)
我已经搜索了很长一段时间,但没有运气(我确实找到了 Catalin 的教程,但对我来说似乎有点高级,并且由于每个点都重新绘制了整个游戏,因此不适用于瓷砖)
【问题讨论】:
我正在为基于 XNA 2D 瓦片的游戏添加光照。
我发现this 文章很有用,但它的完成方式不支持碰撞。我想要的是一种执行以下操作的方法
我已经搜索了很长一段时间,但没有运气(我确实找到了 Catalin 的教程,但对我来说似乎有点高级,并且由于每个点都重新绘制了整个游戏,因此不适用于瓷砖)
【问题讨论】:
我将分享我将平滑光照效果应用于 2D 平铺网格的方法。 ClassicThunder 的answer 提供了一个很好的阴影链接。
首先,我们需要计算每个图块的光照值,这些图块稍后会被模糊。在进入代码之前,让我先说明一下这是如何工作的。
基本上我们所做的是循环遍历所有的瓷砖,从顶部开始,如果瓷砖是空白的,将CurrentLight变量设置为最大亮度,如果我们找到一个实心瓷砖,将其设置为CurrentLight变量并从CurrentLight 中减去“吸收”量。这样,在我们的下一个实心拼贴上,当我们将拼贴设置为CurrentLight 值时,它会稍微少一些。重复这个过程,直到数组被迭代。
现在会有一个很好的从上到下的照明效果,但不是那么好。我们必须再重复这个过程 3 次,从下到上,从左到右,从右到左。并且可以重复多次以获得更好的质量。
基本上在循环中的每个图块上运行此代码
if (tile.Light > CurrentLight) //If this tile is brighter than the last, set the current light to the tiles light
CurrentLightR = tile.Light;
else if (CurrentLight != 0f) //If it is less, and isnt dark, then set the tile to the current light
tile.Light = CurLightR;
if (tile.Light == CurLightR) //If it is the same, subtract absorb values
CurrentLight -= tile.Absorb;
你去了,漂亮的瓷砖照明。但是,如果您想要一个不那么“像素化”的外观,您可以查看我的question on gamedev。
【讨论】:
对于每像素照明,您可能需要寻找其他地方,因为我不知道。 对于每瓦照明,
在 SpriteBatch.draw 中,一些重载方法采用颜色。使用 Color.White 时,SpriteBatch 绘制的精灵是正常颜色的。
通过创建新的 Color(Color.yourcolor.r*float, Color.yourcolor.y*float, Color.yourcolor.z*float, 255) 来使用颜色乘法
基本上,要获得浮点数,请尝试找出一个公式来计算由于附近灯光引起的块的亮度(可能存储在数组或列表中)。由于 2D 游戏不需要法线,所以这个公式应该相对简单。
【讨论】: