SpriteKit:textureFromNode方法在initWithSize方法中不起作用

时间:2014-04-09 15:38:10

标签: objective-c sprite-kit

这不起作用 - newNode的纹理为nil

-(id)initWithSize:(CGSize)size {    
    if (self = [super initWithSize:size]) {

        SKSpriteNode *node = [SKSpriteNode spriteNodeWithColor:[UIColor orangeColor] size:CGSizeMake(100, 100)];

        SKTexture *texture = [self.view textureFromNode:node];            
        SKSpriteNode *newNode = [SKSpriteNode spriteNodeWithTexture:texture];
        [self addChild:newNode];
    }
    return self;
}


这确实有效:

-(id)initWithSize:(CGSize)size {    
    if (self = [super initWithSize:size]) {

        SKSpriteNode *node = [SKSpriteNode spriteNodeWithColor:[UIColor orangeColor] size:CGSizeMake(100, 100)];

        SKAction *createNewNode = [SKAction runBlock:^{
            SKTexture *texture = [self.view textureFromNode:node];            
            SKSpriteNode *newNode = [SKSpriteNode spriteNodeWithTexture:texture];
            [self addChild:newNode];
        }];

        [self runAction: createNewNode];
    }
    return self;
}

有人可以解释一下原因!?谢谢!


如果您想知道为什么没有添加node场景:textureFromNode的Apple文档说明:"正在渲染的节点不需要出现在查看呈现的场景。"

1 个答案:

答案 0 :(得分:2)

我的猜测是:在您创建精灵节点的位置(在场景的initWithSize:内),节点图尚未完全设置。场景未与视图连接(由其显示),因此未设置用于渲染。

使用颜色的精灵的SKSpriteNode纹理很可能仅在场景出现后创建。这可以解释为什么运行块操作有效。

您也可以通过简单地将代码从initWithSize:移动到场景的didMoveToView方法来解决这个问题,该方法是在视图上显示场景后调用的。