使用SKEmitterNode动画粒子

3
目标是使来自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

虽然你的代码看起来完美无缺,这可能是粒子引擎的一个bug,但值得假设的是,在粒子变得足够大或可见之前,你的动画就已经用完了所有帧数。如果是这种情况,动画完成后,纹理可能会恢复到你所看到的原始纹理。

为了检查是否存在这个问题,你可以将你的动画操作包装在一个repeatForever操作中:

repeatAction = SKAction.repeatForever(animation)

然后将particleAction分配更改如下:

emitterNode.particleAction = repeatAction

值得注意的是,苹果的文档似乎有矛盾之处。在这个页面(https://developer.apple.com/reference/spritekit/skaction/1417828-animate),我们看到:“此操作只能由SKSpriteNode对象执行。”
粒子显然不是可访问的sprite节点,如此页面(https://developer.apple.com/reference/spritekit/skemitternode)所述,但同时它们应该像sprites一样运作:
“为了在粒子上使用动作,您可以将粒子视为sprite。这意味着您可以执行其他有趣的技巧,例如对粒子的纹理进行动画处理。”

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接