试图添加已有父级的SKNode

时间:2013-12-26 18:12:18

标签: sprite-kit

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

例如,我想让用户拼写单词Ball。他们可以轻松地将SKSpriteNode字母拖动到正确的位置(我称之为井),然后测试他们是否使用下面的代码将它放在正确的位置。它工作得很好。你可以毫无问题拼写单词,游戏将继续下一个拼写单词。但是,如果我试图在这个例子中放置包含第三个字母(也是“l”)的相同位置的单词“Ball”中的最后一个字母“l”,我会得到一个令人讨厌的崩溃,但这次崩溃只会发生如果是同一个字母尝试同一个地方。我可以整天向场景中添加相同的字母并且它很好,但是如果用户在包含相同字母的其中一个孔上方放开单词图块时,可能会发生这种崩溃。 (在下面的代码片段中,我的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--;

当我第二次再次测试这封信在第三口井中没有任何东西可以测试并且只是回到原点时,我觉得这样。

1 个答案:

答案 0 :(得分:2)

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

您还要分配一个新的精灵,然后通过从lettersArray获取第一个精灵来替换下一行。如果这是逻辑问题的一部分,无论如何在这里创建一个新的精灵是多余的。