SKEmitterNode粒子动画在iOS9测试版上无法运行

5

我正在iOS9 Beta 4中测试我的应用程序,并发现很多在iOS8中能够运行的代码在iOS9上不再按预期执行。另一个例子是SpriteKit的SKEmitterNode“particleAction”属性。以下代码在iOS8中有效,但在iOS9上无效:

// create the particle movement action
SKAction *move = [SKAction moveByX:100 y:100 duration:5]; // also, I've tested several other SKActions, such as scaleBy, fade, rotate, to no effect here        

// create a target node and add to the SKScene
SKNode *targetNode = [SKNode node];
targetNode.position = origin;
[mySKSceneNode addChild:targetNode];

// add an emitter node that has a target and an SKAction
SKEmitterNode *flameTrail = [NSKeyedUnarchiver unarchiveObjectWithFile:[[NSBundle mainBundle]pathForResource:@"FlameAttack" ofType:@"sks"]];
flameTrail.position = origin;
flameTrail.particleAction = move; // TODO iOS9 compatibility issues!
flameTrail.targetNode = targetNode;
[mySKSceneNode addChild:flameTrail];

在iOS8中,上述代码会生成一个看起来像火花飞舞的SKEmitterNode。但是在iOS9中,SKEmitterNode完全不可见(在SKScene中根本没有出现)。如果我注释掉以下行:
flameTrail.particleAction = move; // TODO iOS9 compatibility issues!

然后我将在场景中看到SKEmitterNode,但是我不会看到任何与粒子相关的运动。

我还尝试了几个其他SKActions,没有看到任何结果上的变化。我已向苹果提交了一个错误报告;同时,有人可以确认/否认这个问题或者看到代码中的问题吗?


1
当设置particleAction属性时,SKEmitterNode在OS X El Capitan (GM)上也会消失。 - Milos
1
事实上,发射器节点并没有消失,“只有”粒子… - Milos
1
错误仍然存在于El Capitan的公共版本中... - Milos
6个回答

3

iOS9 SKEmitterNode的targetNode属性问题。

当设置targetNode属性时,粒子将会在zPosition 0处发射。无论您是否设置了其他任何zPosition值,粒子仍将在zPosition 0处渲染。如果将zPosition的值打印到控制台上,它将报告您设置的任何值。如果将targetNode = nil,则粒子将在正确的图层上呈现。

解决方法:将所有背景精灵重新排序为<= -1

希望这可以帮助您,我将提交一个错误报告,并在github上添加了一个示例repo。https://github.com/fromkey/iOS9_BUG_SKEmitterNode_targetNode/tree/master


1
我尝试改变zPosition并添加/删除targetNode,但是我仍然在particleAction方面遇到问题。如果particleAction属性为nil,则我的SKEmitterNode可以正常工作。将任何SKAction添加到particleAction会导致SKEmitterNode从SKScene中消失... - user2821647
@user2821647,在 OS X El Capitan (GM) 中,当设置了 particleAction 属性时,SKEmitterNode 也会消失。 - Milos
我发现这个想法的问题是,除了它的效果不是很好之外,如果你在一个负的zPosition节点中包含一个触摸敏感节点,触摸事件将无法传递到触摸敏感节点。我的下面的答案似乎可以避免这个问题。 - PKCLsoft

1

我可以确认这个问题在iOS 9 beta 5上存在。.particleAction似乎完全停止工作了!希望苹果在下一个beta/GM版本中修复。

我的一款新游戏依赖于此,所以现在有点紧张!


哈利,你设法让 particleAction 能工作了吗?我还没有在 iOS9 Beta 6 上尝试过。你有什么成功经验吗? - user2821647
还没有发布 iOS 9 Beta 6 :( - HarryGT

0

当我在创建一个嵌套在场景文件中的SKEmitterNode时,我遇到了同样的问题。最终我迭代了所有节点,找到了发射器并复制了它们。然后它又开始工作了。

for (SKNode *node in containerNode.children) {
    if ([node isKindOfClass:[SKEmitterNode class]]) {
      SKEmitterNode *e = (SKEmitterNode *)node;
      [e removeFromParent];

       SKEmitterNode *new = [e copy];
       [containerNode addChild:new];
    }
 }

谢谢你的答案,我得尝试一下。你在什么时候迭代?每次更新还是场景呈现后? - user2821647
我只是在场景中第一次呈现节点。 - jervine10

0

我在iOS 9中遇到了同样的问题。

只需删除targetNode属性,它就能再次正常工作。


你能否使用particleAction属性让SKEmitterNode跟随SKAction?你使用了哪个SKAction? - user2821647
是的,我会编辑我的答案并很快分享一个例子。 - Tony Peng
我正在尝试让粒子显示出来,但这并没有解决我的问题,调整zPosition也没有用。 - Chris Paveglio

0

我自己也遇到过类似的问题,不过对我来说问题是因为我的代码设置了targetNode属性,就像这样:

class GameScene : SKScene {
    func addEmitter(fileName: String, position: CGPoint) {
        let particle = SKEmitterNode(fileNamed: fileName)!
        particle.position = position
        //particle.targetNode = self // DOES NOT WORK ON iOS 9 BETA
        self.addChild(particle)
        // Don't forget to remove the emitter node after the explosion
        self.runAction(SKAction.waitForDuration(2), completion: { particle.removeFromParent() })
    }
}

删除 particle.targetNode 这一行后,粒子重新渲染。 在 iOS 9 beta 6 上测试通过。 更新:显示在 SKScene 中的完整用法。

你能在iOS9 beta 6上成功使用particleAction吗?你能否发布整个可工作的代码,以便我可以在我的设备上测试?我的目标节点不是像你回答中的父节点。但我真的很想看到particleAction工作,只是为了进行一次健全性检查! - user2821647
我根本没有使用particleAction - 我使用我的用例更新了示例代码 - 所有粒子属性都在粒子编辑器中预设。 - bizz84
如果你也删掉了 targetNode 这一行会怎样呢?这可能导致你的粒子出现,但是你需要另外找到一种方法来使它在你的层次结构中正常工作。 - bizz84
1
抱歉耽搁了,我最终进行了一些严格的测试,但仍然无法在iOS9 Beta 5上使particleAction正常工作。我尝试删除targetNode,但没有看到任何结果。对我来说问题似乎出在particleAction属性上。如果我将particleAction保留为nil,则节点会出现。如果我将任何SKAction分配给particleAction,则SKEmitterNode就会从屏幕上消失... - user2821647

0
如果您不想失去targetNode提供的功能,则我发现的解决方法是为发射器和发射的粒子分配zPosition值。 我通常设置枚举来为所有节点提供Z位置值,例如:
typedef enum {
  kZBG = 0,
  kZSpaceship = 10,
  kZBullets = 15,
  kZSpark = 20,
} NodeZOrder;

然后我在我的发射器中使用它:

NSString *sparkPath = [[NSBundle mainBundle] pathForResource:@"spark" ofType:@"sks"];
self.sparkEmitter = [NSKeyedUnarchiver unarchiveObjectWithFile:sparkPath];
self.sparkEmitter.targetNode = self.background;
self.sparkEmitter.zPosition = kZSpark;
self.sparkEmitter.particleZPosition = kZSpark;

我发现这个很好用。我的粒子在背景上停留在我想要的位置,并且在iOS 9和iOS 10上都可见。


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