从SKShapeNode创建SKTexture

时间:2014-05-04 21:47:16

标签: ios objective-c sprite-kit

有没有办法从SKShapeNode创建SKTexture?已知形状节点会导致内存问题,我正在寻找一种从它们创建静态图形的方法(最好是.png)。

1 个答案:

答案 0 :(得分:12)

您可以使用名为SKView

textureFromNode:方法

以下是参考文献:

<强> textureFromNode:

渲染并返回包含节点内容的Sprite Kit纹理。

- (SKTexture *)textureFromNode:(SKNode *)node

<强> 参数

节点

表示要渲染到纹理的内容的节点对象。

返回值

保存渲染图像的Sprite Kit纹理。

<强>讨论 正在渲染的节点不需要出现在视图的呈现场景中。创建新纹理的大小等于节点的calculateAccumulatedFrame方法返回的矩形。如果节点不是场景节点,则使用清晰的背景颜色([SKColor clearColor])渲染。

UPDATE--在探索SKShapeNode之后,确认存在内存泄漏问题,围绕分配路径然后删除节点,我有一个想法...

不是一个新想法,更多是一个改变用途的想法。这个奇妙的想法实际上允许我使用SKShapeNodes到我心中的内容:)

<强>池

是的......我刚创建了一个SKShapeNodes池,我根据需要重用了它。这有什么不同:)所以只需在需要的时候重新定义路径,当使用返回你的游泳池完成时,它将等待你以后再次玩。

您只需在需要时重新定义路径,使用返回游泳池完成后,它将等待您以后再次玩游戏。

NSMutableArray被叫池中创建一个ivar或属性SKScene,并在初始化SKScene时创建它。您可以在初始化期间使用形状节点填充数组,也可以根据需要创建它们。

这是我为从池中获取新节点而创建的快速方法:

-(SKShapeNode *)getShapeNode
{
    if (pool.count > 0)
    {
        SKShapeNode *shape = pool[0];
        [pool removeObjectAtIndex:0];
        return shape;
    }

    // if there is not any nodes left in the pool, create a new one to return
    SKShapeNode *shape = [SKShapeNode node];

    return shape;
}

因此,无论你在场景中需要SKShapeNode,你都可以这样做:

SKShapeNode *shape = [self getShapeNode];
// do whatever you need to do with the instance

完成使用shape节点后,只需将其返回到池并将路径设置为。例如:

[pool addObject:shape];
[shape removeFromParent];
shape.path = NULL;

我知道这是一种解决方法而不是一个理想的解决方案,但对于任何想要使用大量SKShapeNodes而不是流失内存的人来说,这肯定是一种非常可行的解决方法。