gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 19:41:27 25 4
gpt4 key购买 nike

我有一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com