SKEmitterNode particleAction无法运行iOS9 Beta

时间:2015-07-30 02:07:55

标签: ios iphone ipad sprite-kit ios9

我正在iOS9 Beta 4中测试我的应用程序,并发现许多曾经在iOS8中工作但不再按预期运行的代码。另一个例子是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,但我不会看到任何与粒子相关的运动。

我也用其他几个SKA测试了这个,并没有看到结果有任何变化。我向Apple提交了一个错误;在此期间,任何人都可以确认/否认此问题或查看代码中的问题吗?

5 个答案:

答案 0 :(得分:2)

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 :(得分:1)

可以在iOS 9 beta 5上确认这一点..particleAction似乎完全停止了工作!希望Apple修复下一个beta / GM版本。

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

答案 2 :(得分:0)

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

Juet删除targetNode属性,它将再次起作用。

答案 3 :(得分:0)

创建嵌套在Scene文件中的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];
    }
 }

答案 4 :(得分: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上都可见。