【问题标题】:SKEmitterNode particleAction not working iOS9 BetaSKEmitterNodeparticleAction 不工作 iOS9 Beta
【发布时间】:2015-10-21 05:43:15
【问题描述】:

我正在 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,但不会看到与粒子相关的任何运动。

我还用其他几个 SKAction 对此进行了测试,但没有发现结果有任何变化。我向 Apple 提交了一个错误;与此同时,任何人都可以确认/否认这个问题或在代码中看到问题吗?

【问题讨论】:

  • 当设置particleAction 属性时,SKEmitterNode 也会在 OS X El Capitan (GM) 上消失。
  • 其实发射器节点并没有消失,“只是”粒子...
  • 该错误仍然存​​在于 El Capitan 的公开版本中...

标签: ios iphone ipad sprite-kit ios9


【解决方案1】:

iOS9 SKEmitterNode targetNode 属性问题。

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

解决方案: 我将所有背景精灵重新排序为

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

【讨论】:

  • 我尝试改变 zPosition 并添加/删除 targetNode;但是我仍然遇到particleAction的问题。如果particleAction 属性为nil,我的SKEmitterNode 工作正常。将任何 SKAction 添加到particleAction 会导致 SKEmitterNode 从 SKScene 中消失...
  • @user2821647, SKEmitterNode 在设置particleAction 属性时也会在 OS X El Capitan (GM) 上消失。
  • 我发现这个想法的问题,除了它不能很好地工作之外,如果你有一个触摸敏感节点包含在一个具有负 zPosition 的节点中,触摸不是传递给触敏节点。我在下面的回答似乎没有这种复杂性。
【解决方案2】:

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

我的一个新游戏就靠这个了,现在有点紧张!

【讨论】:

  • Harry 你能让particleAction 工作吗?我还没有尝试过 iOS9 Beta 6。你有过成功吗?
  • 还没有 iOS 9 Beta 6 :(
【解决方案3】:

我自己也有类似的问题,但对我来说问题是我的代码设置了 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 中的完整使用情况。

【讨论】:

  • 您能否让particleAction 在ios9 beta 6 上运行?您可以发布整个工作代码,以便我可以进行测试吗?我的目标节点不是您答案中的父节点。但我真的很想看到particleAction 只是为了进行健全性检查!
  • 我根本没有使用particleAction - 我用我的用例更新了示例代码 - 所有粒子属性都在粒子编辑器中预设。
  • 如果同时删除 targetNode 行会怎样?可能你的粒子会出现,但你需要找到另一种方法让它在你的层次结构中工作。
  • 抱歉耽搁了;最后对此进行了一些认真的测试,但我仍然无法在 iOS9 Beta 5 上使用particleAction。我尝试删除 targetNode 并没有看到任何结果。对我来说,问题似乎出在particleAction 属性上。如果我离开particleAction nil 然后节点出现。如果我将任何 SKAction 分配给particleAction,SKEmitterNode 就会从屏幕上消失...
【解决方案4】:

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

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

【讨论】:

  • 您能否使用particleAction 属性让SKEmitterNode 跟随SKAction?你用的是什么 SKAction?
  • 是的,我会尽快编辑我的答案并分享一个例子。
  • 我正在尝试显示粒子,但这样做并没有为我解决问题,也没有调整 zPosition。
【解决方案5】:

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

【讨论】:

  • 感谢您的回答;我得试试这个。你什么时候迭代?每次更新还是在呈现场景之后?
  • 我第一次在场景中呈现节点。
【解决方案6】:

如果您不想失去 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 上都可见。

【讨论】:

    猜你喜欢
    • 2015-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-15
    • 2014-11-07
    • 1970-01-01
    相关资源
    最近更新 更多