带有emiitter的SKShapeNode与SKAction removeFromParent崩溃

时间:2013-11-16 14:21:05

标签: objective-c sprite-kit skemitternode

我有一个带有子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操作
  3. 我猜这会有效,如果我在删除shapenode之前将一个动作附加到发射器上以删除FLALParent(之后说.9秒),但这似乎是一个单调乏味的长期解决方案。

    是否有人知道具有子节点的节点会发生什么,其中removeFromParent应用于父节点,或者我如何解决此问题?


    基于LearnCocos2D的答案进行更新

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

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

    给激光一个名字,并根据该名称将其从父母那里删除,当克隆激光器时,我需要一次激光多次激光。

2 个答案:

答案 0 :(得分:3)

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

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的错误报告重新上线时,我会将此报告为错误。我无法解释为什么会崩溃。

答案 1 :(得分:1)

当我有多个发射器连接到精灵时,我碰到了这个。我找到的技巧是在将每个发射器添加到父节点后给它自己的名字。似乎SpriteKit必须在内部使用该名称时才从父项中删除。