我有一个带有子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];
}
该程序将在以下两种情况下运行:
我猜这会有效,如果我在删除shapenode之前将一个动作附加到发射器上以删除FLALParent(之后说.9秒),但这似乎是一个单调乏味的长期解决方案。
是否有人知道具有子节点的节点会发生什么,其中removeFromParent应用于父节点,或者我如何解决此问题?
在我的完整代码中,我实际上是如上所述创建一个激光器,然后将其复制到第二个激光器。我使用了下面的LearnCocos2D代码,它适用于一个激光器但是两个都没有。基于LearnCocos2D的答案,我的代码的重要更改是:
laserFire.name = @"laserfire";
SKAction* s2 = [SKAction runAction:[SKAction removeFromParent] onChildWithName:@"laserfire"];
给激光一个名字,并根据该名称将其从父母那里删除,当克隆激光器时,我需要一次激光多次激光。
答案 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必须在内部使用该名称时才从父项中删除。