2014-01-24 42 views
1

下面是示例代码:SpriteKit textureFromNode返回黑色图像

SKNode* node = [SKNode node]; 
    node.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame)); 
    [self addChild: node]; 

    SKSpriteNode *sprite1 = [SKSpriteNode spriteNodeWithImageNamed:@"Spaceship"]; 
    sprite1.position = CGPointMake(-900.0, -900.0); 
    [node addChild: sprite1]; 

    SKSpriteNode *sprite2 = [SKSpriteNode spriteNodeWithImageNamed:@"Spaceship"]; 
    sprite2.position = CGPointMake(900.0, 900.0); 
    [node addChild: sprite2];   

    [self runAction: [SKAction sequence: @[[SKAction waitForDuration: 3.0], [SKAction runBlock:^{ 

     SKTexture* texture = [self.view textureFromNode: node]; 
     SKSpriteNode* ts = [SKSpriteNode spriteNodeWithTexture: texture]; 
     ts.xScale = 1.0/[UIScreen mainScreen].scale; 
     ts.yScale = 1.0/[UIScreen mainScreen].scale; 
     [self addChild: ts]; 
    }]]]]; 

当我将两个精灵远离彼此这使得积累容器节点更大的帧,我得到黑色纹理?

+3

有多远?纹理的最大尺寸为2048x2048点。如果累积的帧大于此,纹理可能根本不会被创建。检查是否textureFromNode:返回nil。 – LearnCocos2D

+3

最大的纹理尺寸实际上取决于设备,目前大多数ios设备可以处理4096,请参阅http://stackoverflow.com/questions/2505186/what-is-the-maximum-texture-size-available-on-the-the-max- ipad – Sky

回答

1

该方法生成的纹理大小基于场景坐标中节点的大小,而不是其占用的屏幕的像素大小。因此,如果您的节点占用10000x10000场景空间,则此方法将尝试生成10000x10000纹理。这违反了4096x4096最大纹理尺寸限制,而不是失败,该方法返回黑色纹理。

可以通过在textureFromNode调用之前缩放节点来生成纹理的大小,然后将其缩小。例如:

//paintNode is 1000x1000 in scene coordinates 
self.paintNode.setScale(0.5) 
let texture = SKView().texture(from: self.paintNode) 
//texture size is 500x500 
self.paintNode.setScale(1) 

当试图避免4096x4096限制时,考虑设备的比例因子也很重要。在iPhone 6加上比例因子3(Retina HD)时,尺寸为500x500px的SKTexture将在内部为1500x1500像素。我试图为1600宽度的场景生成纹理。它在除了高清视网膜设备之外的所有设备上运行良好。为大于1365的场景空间生成的任何纹理都会导致黑色纹理。 1365 x 3 = 4095,正好低于4096x4096的最大值。

+0

设备特定限制的好概览:https://developer.apple.com/metal/limits/ – Klaas

+0

很酷感谢您的链接 –