我正在试图弄清楚如何创建这一行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;
}
答案 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