【问题标题】:SpriteKit textureFromNode returns black imageSpriteKit textureFromNode 返回黑色图像
【发布时间】:2016-12-05 02:39:34
【问题描述】:

这里是示例代码:

    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];
    }]]]];

一旦我将两个精灵彼此分开,这使得容器节点的累积帧变大,我就会得到黑色纹理?

【问题讨论】:

  • 相距多远?纹理的最大尺寸为 2048x2048 点。如果累积的帧大于此,则可能根本不会创建纹理。检查 textureFromNode: 是否返回 nil。
  • 最大贴图大小其实取决于设备,目前大部分ios设备都可以处理4096,见stackoverflow.com/questions/2505186/…

标签: sprite-kit


【解决方案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 限制时,考虑设备的比例因子也很重要。在比例因子为 3(视网膜高清)的 iPhone 6 plus 上,尺寸为 500x500px 的 SKTexture 内部将是 1500x1500px。我尝试为宽度为 1600 的场景生成纹理时遇到了这个问题。它在除高清视网膜设备之外的所有设备上都运行良好。为大于 1365 的场景空间生成的任何纹理都会导致黑色纹理。 1365 x 3 = 4095,略低于 4096x4096 的最大值。

【讨论】:

猜你喜欢
  • 2014-04-27
  • 1970-01-01
  • 1970-01-01
  • 2011-08-08
  • 2015-09-12
  • 2019-06-21
  • 1970-01-01
  • 2015-06-20
  • 2011-10-13
相关资源
最近更新 更多