2

我目前正在使用 SKLightNode,屏幕上有一些精灵。我希望这些精灵根据灯光的位置投射阴影,但我希望显示由灯光直接照亮的精灵,并隐藏另一个精灵后面的精灵。

我有这个代码:

let light = SKLightNode()

override func didMove(to view: SKView)
{        
    light.categoryBitMask = 1
    light.falloff = 1.0
    light.shadowColor = SKColor.black
    light.zPosition = 2
    addChild(light) // I add the light

    for _ in 0...10
    {
        let object = SKSpriteNode(imageNamed: "stone")
        object.position = CGPoint(x: CGFloat.random(min: playableRect.minX, max: playableRect.maxX), y: CGFloat.random(min: playableRect.minY, max: playableRect.maxY))
        object.shadowCastBitMask = 1
        object.zPosition = 2
        addChild(object) // I add 10 wall sprites
    }
}

这导致:在此处输入图像描述

如您所见,问题在于阴影中的精灵没有隐藏。

当我将墙壁的 zPosition 更改为 1(低于灯光的 zPosition)时,我有这个:

在此处输入图像描述

这里一切都隐藏了,仍然不好。

我在 2015 年的一个旧 stackoverflow 问题中读到 SpriteKit 不支持这种情况。还是这样吗?无论如何,有解决方法吗?

4

1 回答 1

0

我遇到了同样的问题并找到了解决方案。

  1. 添加 shadowedBitMask 响应精灵
  2. 确保 zposition 中的光高于应该被阴影覆盖的精灵

这是一个例子:

sprite.shadowedBitMask = 0b0001
sprite.zPosition = 1
light.zPosition = 2
light.categoryBitMask = 0b0001
于 2021-10-11T09:56:35.003 回答