尝试添加已经有父节点的 SKNode

Posted

技术标签:

【中文标题】尝试添加已经有父节点的 SKNode【英文标题】:Attempting to add SKNode which already has a parent 【发布时间】:2013-12-26 18:12:18 【问题描述】:

当我尝试将相同的 SKSpriteNode 字母两次添加到预先存在的字母位置时,我遇到了一个错误,导致我的拼写应用程序崩溃。我知道这是默认行为,但如果我的用户尝试这样做,我不希望这种情况发生。

例如,我想让用户拼写单词 Ball。他们可以轻松地将 SKSpriteNode 字母拖到正确的位置(我称它们为井),然后我使用下面的代码测试他们是否将其放置在正确的位置。它工作得很好。您可以毫无问题地拼写单词,游戏将继续进行下一个要拼写的单词。但是,如果我尝试在此示例中将单词“Ball”中的最后一个字母“l”放在包含第三个字母(也是“l”)的同一位置,我会遇到严重的崩溃,但这种崩溃只会发生如果它是同一个字母尝试相同的位置。我可以整天将相同的字母添加到场景中,这很好,但是如果用户在包含相同字母的井之一上方放开单词拼贴,则可能会发生这种崩溃。 (在下面的代码 sn-p 中,我的 letterLabels 的 alpha 值为零,因此用户看不到它们坐在井中。这就是我测试它是否在正确位置的方式。也是基本流程是选定的 SKSpriteNode 被放置在正确的位置,然后该 SKSpriteNode 被移除,并且具有相同字母但不同颜色的瓷砖的新 SKSpriteNode 被放置在正确的位置,并且“井”消失了。如果用户放置瓷砖在错误的井中,它会在拖动它之前回到它原来所在的位置。

    if ( [[self.selectedNode name]isEqualToString:self.letterLabel1.name] && [self.selectedNode intersectsNode:self.letterLabel1]) 


        [self.selectedNode removeAllActions];
        [self.selectedNode removeFromParent];

        SKSpriteNode *correctSprite = [[SKSpriteNode alloc]init];
        correctSprite = [self.lettersArray objectAtIndex:0];

        correctSprite.position = [self.wordWell01 position];

        SKAction *fadeOut = [SKAction fadeOutWithDuration:0.3];

        [self.letterLabel1 removeAllActions]; 
        [self.letterLabel1 removeFromParent];
        [self.wordWell01 runAction:fadeOut];
        [self.wordWell01 removeFromParent]; 


        [self addChild:correctSprite];

        matchFound = YES;
        self.removeCard--;

在我看来,当我第二次再次测试时,这封信在第三口井中应该没有任何东西可以测试,只是回到原来的位置。

【问题讨论】:

您使用copy() 添加该节点的副本,并且该副本不会有任何父节点 【参考方案1】:

在添加精灵之前检查correctSprite.parent是否为nil,可以有效防止崩溃。

你还分配了一个新的精灵,然后通过从 lettersArray 中获取第一个精灵来替换它。如果这是逻辑问题的一部分,那么在这里创建一个新的精灵是多余的。

【讨论】:

这可以防止崩溃,但实际上它会将字母添加到先前存在的字母之上,使玩家无法用剩余的字母拼贴完成单词。另外,如果我不能将它存储在变量中,我还能如何从 lettersArray 中获取对象?我不能只说正确的Sprite而不分配和初始化一个吗? 如果您从 lettersArray 中获得第一个对象,我假设您首先已经在该数组中放置了一个精灵。代码现在的工作方式是创建一个新精灵并立即将其替换为 lettersArray 中的精灵。

以上是关于尝试添加已经有父节点的 SKNode的主要内容,如果未能解决你的问题,请参考以下文章

尝试添加一个已经有父节点的 SKNode

转换回 gamescene.swift 会导致错误“'尝试添加一个已经有父节点的 SKNode”

Swift:尝试添加一个已经有父节点的 SKNode:

Swift SpriteKit - “尝试添加一个已经有父节点的 SKNode”,同时添加关节

SpriteKit: NSInvalidArgumentException - 试图添加一个已经有父节点的 SKNode

尝试添加一个已经有父错误的 SKNode