【问题标题】:SKShapeNode with emiitter crashes with SKAction removeFromParent带有发射器的 SKShapeNode 使用 SKAction removeFromParent 崩溃
【发布时间】:2013-11-16 14:21:05
【问题描述】:

我有一个带有子 SKEmitterNode 的 SKShapeNode。我附加了一个 SKAction 序列,其中最后一个操作是 removeFromParent。节点在没有发射器的情况下正常运行,执行它的操作然后移除自身。但是,如果附加了发射器,那么当删除 shapenode 时,整个程序会崩溃(执行跳转到 main 方法并似乎挂起)。

-(void)fireLasers
{
    SKShapeNode* laser1 = [[SKShapeNode alloc] init];
    //laser1 configuration removed for brevity

    NSString *laserParticlePath = [[NSBundle mainBundle] pathForResource:@"LaserParticle" ofType:@"sks"];
    SKEmitterNode *laserFire = [NSKeyedUnarchiver unarchiveObjectWithFile:laserParticlePath];
    [laser1 addChild:laserFire];

    SKAction* s1 = [SKAction moveByX:0 y:1000 duration:1.0];
    SKAction* s2 = [SKAction removeFromParent];

    SKAction* sequence = [SKAction sequence:@[s1, s2]];
    [laser1 runAction:sequence];

    [self.parent addChild:laser1];
}

程序将在这两种情况下运行:

  1. 我没有安装发射器
  2. 我不包含 removeFromParent 操作

我猜如果我在 shapenode 被移除之前将动作附加到发射器以 removeFromParent(例如 0.9 秒之后),这将起作用,但这似乎是一个乏味的长期解决方案。

有谁知道将 removeFromParent 应用于父节点的具有子节点的节点会发生什么情况,或者我该如何解决这个问题?


根据 LearnCocos2D 的回答更新

在我的完整代码中,我实际上是在创建一个如上所述的激光器,然后将其复制到第二个激光器。我从下面使用了 LearnCocos2D 的代码,它适用于一个激光器,但对两个激光器无效。根据 LearnCocos2D 的回答,我的代码的重要更改是:

laserFire.name = @"laserfire";
SKAction* s2 = [SKAction runAction:[SKAction removeFromParent] onChildWithName:@"laserfire"];

为laserfire命名并根据该名称从父级中删除它在克隆激光以供我希望同时发射多个激光时使用。

【问题讨论】:

    标签: objective-c sprite-kit skemitternode


    【解决方案1】:

    我可以确认这会崩溃。我设计了一个可行的解决方案。如果在移除形状节点之前移除发射器,崩溃就会消失:

    SKAction* s1 = [SKAction moveByX:0 y:1000 duration:1.0];
    SKAction* s2 = [SKAction runBlock:^{
        [laserFire removeFromParent];
    }];
    SKAction* s3 = [SKAction removeFromParent];
    
    SKAction* sequence = [SKAction sequence:@[s1, s2, s3]];
    

    当 Apple 的错误报告重新上线时,我会将其报告为错误。我无法解释为什么会崩溃。

    【讨论】:

    • 这适用于一个激光器,这是我的示例所指定的。在我的完整代码中,我实际上是在创建laser1,将发射器和动作添加到laser1,然后将laser1 复制到新的laser2。第二道激光仍然会导致碰撞。根据您的代码在此处查看我为我的解决方案编辑的问题。
    • 非常感谢——在我找到这个之前,我已经为此苦苦挣扎了好几天。我不明白为什么它会在某些人而不是其他人身上崩溃。
    【解决方案2】:

    当我有多个发射器连接到一个精灵时,我遇到了这个问题。我发现的技巧是在将每个发射器添加到父级后为其命名。似乎 SpriteKit 从父级移除时必须在内部使用该名称。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-19
      • 2014-05-12
      • 1970-01-01
      • 1970-01-01
      • 2021-10-08
      • 1970-01-01
      • 2013-01-30
      相关资源
      最近更新 更多