目标是为来自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)
答案 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)表明,但同时它们的行为应该像精灵一样:
“为了对粒子使用动作,你可以将粒子视为精灵。这意味着你可以执行其他有趣的技巧,例如动画粒子的纹理。”