从SKEmitterNode动画化粒子

时间:2017-03-19 22:09:55

标签: ios animation sprite-kit skaction

目标是为来自SKEmitterNode,的粒子制作动画,但以下代码不起作用。颗粒不会改变纹理。它们仅在生命周期中显示第一个纹理 - 或者更具体地说是Xcode粒子编辑器中使用的原始图像。

粒子寿命比帧持续时间长,所以这不是问题。

            // Create animation textures
            let animationAtlas = SKTextureAtlas(named: atlasFilename)
            var animationFrames = [SKTexture]()

            // Set number of animation frames
            let numImages = animationAtlas.textureNames.count

            // Load texture array
            for i in 0..<numImages {
                let textureName = "\(texturePrefix)\(i)"
                animationFrames.append(animationAtlas.textureNamed(textureName))
            }

            // Create emitter node w/ animation on each particle
            let emitterNode = SKEmitterNode(fileNamed: EmitterFilename)!
            let animation = SKAction.animate(with: animationFrames, timePerFrame: 0.05)                
            emitterNode.particleAction = animation

            // Define fade out sequence
            let fadeOut = SKAction.fadeOut(withDuration: sparkleFadeOutDur)
            let remove = SKAction.removeFromParent()
            let sequence = SKAction.sequence([fadeOut, remove])

            // Add emitter node to scene
            addChild(emitterNode)
            emitterNode.run(sequence)

1 个答案:

答案 0 :(得分:0)

虽然你的代码看起来完美无缺,这可能是粒子引擎的一个错误,但值得假设你的动画在粒子变大或足够可见之前耗尽帧,这样你才能看到动画的表现。如果是这种情况,在动画完成后,纹理可能会恢复到您所看到的原始纹理。

要检查是否存在问题,您可能需要将动画操作包装成repeatForever操作:

repeatAction = SKAction.repeatForever(animation)

然后按如下所示更改particleAction分配:

emitterNode.particleAction = repeatAction

值得注意的是Apple的文档似乎是矛盾的。在此页面(https://developer.apple.com/reference/spritekit/skaction/1417828-animate),我们看到:“此操作只能由SKSprite节点对象执行。”

粒子显然是不可访问的精灵节点,因为这个页面(https://developer.apple.com/reference/spritekit/skemitternode)表明,但同时它们的行为应该像精灵一样:

“为了对粒子使用动作,你可以将粒子视为精灵。这意味着你可以执行其他有趣的技巧,例如动画粒子的纹理。”