我正在开发一个精灵套件游戏,我正试图在物体经过一个特定物体(在这种情况下是红太阳)时创建一个特定的轮廓灯光效果。我希望它前面的任何东西看起来都是黑色的,而其他一切看起来都是正常的(所以如果一个物体部分在前面,那么只有那部分应该是黑色的)。 但我不确定如何以有效的方式做到这一点。我尝试过使用不同的SKBlendModes但到目前为止还没有取得多大成功。主要挑战似乎是在保持背后的太阳颜色的同时实现效果。
我不确定是否可以使用现有的SKBlendModes实现这一目标,或者是否需要其他东西。
我附上了一张图表来说明我的目标,以及当前最适合的图像。
答案 0 :(得分:2)
您可以使用SKCropNode
,蒙版节点和背景节点创建轮廓效果。 SKCropNode
选择性地屏蔽其节点树中的精灵节点的像素。在这里,它将通过隐藏/显示黑色圆圈的部分来提供轮廓效果。
首先,创建以下对象:
zPosition
设置为-1 SKCropNode
)和掩码节点(SKNode
)接下来,
maskNode
属性由于蒙版节点当前没有子节点,黑色圆圈将完全隐藏,其下方的整个黄色圆圈将可见。当我们将精灵添加到蒙版节点时,与精灵相交的黑色圆圈的像素将被取消遮罩(以黑色显示),从而产生轮廓效果。
剩下的就是添加一个"演示文稿"当掩码节点的精灵位于黑色圆圈之外时将显示的节点。表示节点将镜像掩码节点的精灵位置和旋转。这应该在didSimulatePhysics
中完成,以确保在物理和动作更新后同步表示和掩码节点精灵。
但是等等......如果演示节点在黄色圆圈上移动,它会不会遮挡太阳?如果我们将其演示节点zPosition
设置为-2。
以下显示了上述实现:
答案 1 :(得分:1)
这个问题对我很有意思,所以我提出了一个简单的解决方案。它并不完美,也不能很好地扩展,但基础知识满足了我的需求,我相信它可能会指向其他人正确的方向。
我不使用任何特殊的SKBlendMode。相反,我正在为在太阳前移动的对象使用重复对象。使用具有sun的副本作为maskNode的SKCropNode裁剪此重复对象。所以,我的节点树如下:
sun
)(白太阳)object1
)(旋转的紫色方块,带有alpha 0.25)sunDuplicate = [sun copy]
)object1duplicate
,大小与object1
相同,但[SKColor blackColor]
} 在更新方法中,将副本与原件对齐以确保正确转发动画。
- (void)update:(CFTimeInterval)currentTime {
self.object1duplicate.position = self.object1.position;
self.object1duplicate.zRotation = self.object1.zRotation;
}
正如我所说,这不能很好地扩展,因为你手动必须添加重复的对象,并为在太阳对象前面移动的每个对象跟踪它们。也许SKShader可以更优雅地使用。