我正在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提交了一个错误;在此期间,任何人都可以确认/否认此问题或查看代码中的问题吗?
答案 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上都可见。