将多个子项添加到SKSpritenode

时间:2013-12-07 09:23:12

标签: objective-c sprite-kit

我正在试图弄清楚如何创建这一行Sprite。我的输入精灵来自Texture中的TextureAtlas,未分配给父级。 现在,每次我运行下面的代码时,错误日志都会显示“尝试添加已有父级的SKNode”。这是在for循环中添加第一个Sprite之后发生的。

我尝试将行与Array放在一起。这有效,直到我想在主场景中迭代数组并添加子项。出现相同的错误日志。

我认为解决方案可能很简单,但我现在已经有一段时间无法理解了。

-(SKSpriteNode*)createRowFromSprite:(SKSpriteNode*)SpriteName{

    tempSprite = [SKSpriteNode new];
    SKSpriteNode *row = [SKSpriteNode new];
    int x = 0 ;

    for (int i = 0; i < 5; i++) {

        tempSprite = (SKSpriteNode*)SpriteName;
        tempSprite.position = CGPointMake(x,0);
        [row addChild:tempSprite];
        x += 16;
    }

return row;

}

1 个答案:

答案 0 :(得分:1)

当然你有错误。你将一个sprite传递给一个方法并尝试多次添加它(并且因为你实际上从未使用过这个tempSprite = [SKSpriteNode new];对象而导致内存泄漏)。您应该做的是将带有文件名的NSString传递给您的方法,并在每次循环迭代时从该文件创建新的精灵。它可能看起来像这样(我在SpriteKit中并不是很好,但我希望你能得到这个想法):

-(SKSpriteNode*)createRowFromFile:(NSString *)filename{

SKSpriteNode * tempSprite;
SKSpriteNode *row = [SKSpriteNode new];
int x = 0 ;

for (int i = 0; i < 5; i++) {

    tempSprite = [[[SKSpriteNode alloc] initWithImageNamed:filename] autorelease];
    tempSprite.position = CGPointMake(x,0);
    [row addChild:tempSprite];
    x += 16;
}

return row;

}

并且在添加之后不要忘记释放行对象。除非你当然使用ARC