如何在父节点中包含SKEmitterNode粒子?

时间:2016-01-16 19:07:47

标签: sprite-kit skemitternode

我想在SKNode中添加一个SKEmitterNode,但是它的粒子会留在父节点的框架内。有点像UIView上的clipsToBounds属性。

示例:发射器中的粒子不应该留下黑色正方形SKSpriteNode:

enter image description here

1 个答案:

答案 0 :(得分:0)

您可以使用SKCropNode执行此操作。像这样:

if let particles = SKEmitterNode(fileNamed: "rain.sks") {

            let cropNode = SKCropNode()
            cropNode.position = CGPoint(x: CGRectGetMidX(frame), y: CGRectGetMidY(frame))
            cropNode.zPosition = 3

            cropNode.maskNode = SKSpriteNode(color: SKColor.blackColor(), size: CGSize(width: 150, height: 150))
            cropNode.addChild(particles)

            addChild(cropNode)

        }

不幸的是,这仅适用于iOS8 ...当您尝试在iOS9中将发射器添加到裁剪节点时,您可能会遇到一些问题,例如。什么都不会呈现,可能会出现fps下降。这已经为人所知issue

就像它在那个链接中所说的那样,没有实际发生任何事情而是渲染粒子。就个人而言,我没有遇到过fps问题,但绝对没有渲染粒子。

解决方法是添加一个包含发射器的节点,然后屏蔽该容器节点。所以,让我们添加一个SKSpriteNode来制作黑色背景,就像你的例子一样。我们称之为背景:

if let particles = SKEmitterNode(fileNamed: "rain.sks") {

        let cropNode = SKCropNode()
        cropNode.position = CGPoint(x: CGRectGetMidX(frame), y: CGRectGetMidY(frame))
        cropNode.zPosition = 3

        let blackNode = SKSpriteNode(color: .blackColor(), size: CGSize(width: 200, height: 200))
        blackNode.addChild(particles)

        cropNode.maskNode = SKSpriteNode(color: SKColor.blackColor(), size: CGSize(width: 200, height: 200))

        cropNode.addChild(blackNode)

        addChild(cropNode)

    }