objective-c - 带有发射器的 SKShapeNode 使用 SKAction removeFromParent 崩溃

标签 objective-c sprite-kit skemitternode

我有一个 SKShapeNode 和一个子 SKEmitterNode。我附加了一个 SKAction 序列,其中最后一个操作是 removeFromParent。节点在没有发射器的情况下表现正确,执行它的操作然后删除自身。但是,如果发射器已连接,则在删除形状节点时整个程序会崩溃(执行跳转到 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 操作

我猜如果我在形状节点被移除之前将一个 Action 附加到发射器以移除 FromParent(比如 .9 秒后),我猜这会起作用,但这似乎是一个乏味的长期解决方案。

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


根据LearnCocos2D的回答更新

在我的完整代码中,我实际上是像上面那样创建一个激光器,然后将其复制到第二个激光器。我使用了下面的 LearnCocos2D 代码,它适用于一台激光但不能用于两台激光。根据 LearnCocos2D 的回答,我的代码的重要变化是:

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

为 laserfire 命名并根据该名称将其从父项中删除在克隆激光时有效,以便在我想要同时发射多个激光时使用。

最佳答案

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

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

关于objective-c - 带有发射器的 SKShapeNode 使用 SKAction removeFromParent 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20019507/

相关文章:

ios - 为什么 SKEmitterNode 会破坏累积的帧?

ios - SKEmiterNode 与 AVAudioPlayer 用于音乐视觉效果

iphone - 构建数组的数组

ios - 使用 SKShapeNode 绘制和删除线条

Swift:暂停无限滚动背景(即无限循环)

ios - SKView 未在单 View 应用程序中显示

xcode - SKEmitterNode 不显示粒子

iphone - MKMapView 在 n 次迭代后仅显示单个注释

ios - 选择一个单元格错误地将其他几个单元格标记为 "selected"

ios - Hook 系统 (libc) 在链接时在 iOS 上运行