Spritekit在对象前面传递时的剪影效果

时间:2015-07-19 20:50:49

标签: ios sprite-kit skspritenode

我正在开发一个精灵套件游戏,我正试图在物体经过一个特定物体(在这种情况下是红太阳)时创建一个特定的轮廓灯光效果。我希望它前面的任何东西看起来都是黑色的,而其他一切看起来都是正常的(所以如果一个物体部分在前面,那么只有那部分应该是黑色的)。 但我不确定如何以有效的方式做到这一点。我尝试过使用不同的SKBlendModes但到目前为止还没有取得多大成功。主要挑战似乎是在保持背后的太阳颜色的同时实现效果。

我不确定是否可以使用现有的SKBlendModes实现这一目标,或者是否需要其他东西。

我附上了一张图表来说明我的目标,以及当前最适合的图像。

Target

Best fit so far

2 个答案:

答案 0 :(得分:2)

您可以使用SKCropNode,蒙版节点和背景节点创建轮廓效果。 SKCropNode选择性地屏蔽其节点树中的精灵节点的像素。在这里,它将通过隐藏/显示黑色圆圈的部分来提供轮廓效果。

首先,创建以下对象:

  1. 形状节点(黄色圆圈),其zPosition设置为-1
  2. 与黄色相同尺寸的精灵节点(黑色圆圈)
  3. 裁剪节点(SKCropNode)和掩码节点(SKNode
  4. 接下来,

    1. 在场景中心添加黄色圆圈
    2. 将黑色精灵添加为裁剪节点的子项
    3. 将掩码节点分配给裁剪节点的maskNode属性
    4. 在场景中心添加裁剪节点
    5. 由于蒙版节点当前没有子节点,黑色圆圈将完全隐藏,其下方的整个黄色圆圈将可见。当我们将精灵添加到蒙版节点时,与精灵相交的黑色圆圈的像素将被取消遮罩(以黑色显示),从而产生轮廓效果。

      剩下的就是添加一个"演示文稿"当掩码节点的精灵位于黑色圆圈之外时将显示的节点。表示节点将镜像掩码节点的精灵位置和旋转。这应该在didSimulatePhysics中完成,以确保在物理和动作更新后同步表示和掩码节点精灵。

      但是等等......如果演示节点在黄色圆圈上移动,它会不会遮挡太阳?如果我们将其演示节点zPosition设置为-2。

      ,则不会

      以下显示了上述实现:

      enter image description here

答案 1 :(得分:1)

这个问题对我很有意思,所以我提出了一个简单的解决方案。它并不完美,也不能很好地扩展,但基础知识满足了我的需求,我相信它可能会指向其他人正确的方向。

我不使用任何特殊的SKBlendMode。相反,我正在为在太阳前移动的对象使用重复对象。使用具有sun的副本作为maskNode的SKCropNode裁剪此重复对象。所以,我的节点树如下:

  • SKSpriteNode(sun)(白太阳)
  • SKSpriteNode(object1)(旋转的紫色方块,带有alpha 0.25)
  • SKCropNode
    • maskNode:SKSpriteNode(sunDuplicate = [sun copy]
    • SKSpriteNode(object1duplicate,大小与object1相同,但[SKColor blackColor]}

在更新方法中,将副本与原件对齐以确保正确转发动画。

- (void)update:(CFTimeInterval)currentTime {
  self.object1duplicate.position = self.object1.position;
  self.object1duplicate.zRotation = self.object1.zRotation;
}

正如我所说,这不能很好地扩展,因为你手动必须添加重复的对象,并为在太阳对象前面移动的每个对象跟踪它们。也许SKShader可以更优雅地使用。

Rendered output from an iPad Air