SpriteKit SKTexture 未作为对 SKSpriteNode 的引用传递

Posted

技术标签:

【中文标题】SpriteKit SKTexture 未作为对 SKSpriteNode 的引用传递【英文标题】:SpriteKit SKTexture is not passed as reference to SKSpriteNode 【发布时间】:2016-04-18 14:17:29 【问题描述】:

如果要多次使用,Apple 建议使用一个 SKTexture 对象 (https://developer.apple.com/library/ios/documentation/SpriteKit/Reference/SKTexture_Ref/)。

所以我想测试它是否真的作为参考传递:

    var fireSpriteTexture:SKTexture = SKTexture(imageNamed: "fire")
    let fireSprite = SKSpriteNode(texture: fireSpriteTexture)
    fireSprite.position = CGPointMake(50,50)
    fireSprite.zPosition = 100

    // Change texture -> We should see no fire
    fireSpriteTexture = SKTexture(imageNamed: "water")

    self.addChild(fireSprite)

据我了解,这个快速代码应该使水纹理在我的应用程序中可见,但实际上火纹理放置在屏幕上。

为什么?是bug吗?

为了更清楚,我还想知道如果我用 SKSpriteNode(imageNamed: "fire") 初始化我的节点然后用它的 copy() 方法复制它会发生什么,两个对象是否共享相同的“火”资源?

【问题讨论】:

看看这个:***.com/a/30448038/3402095 【参考方案1】:

我认为您没有正确理解按引用传递,您将火的引用传递给您的精灵,然后精灵将保留此纹理的引用。

您正在将火纹理更改为具有新参考的新纹理。这并不意味着具有旧引用的精灵会自动更改为新引用。

如果你想检查参考,你想比较火纹理和精灵纹理,而不是创建一个全新的纹理。

如果要更改纹理,则需要在不创建新引用的情况下编辑纹理的数据。

【讨论】:

以上是关于SpriteKit SKTexture 未作为对 SKSpriteNode 的引用传递的主要内容,如果未能解决你的问题,请参考以下文章

SpriteKit SKTexture mipmap 不起作用

SpriteKit SKTexture.preloadTextures 高内存使用 Swift

UIImage 中的 SKTexture 看起来不同

如何将带有 alpha 的 PNG 转换为 RGBA4444 以便在 SpriteKit SKTexture 中使用它?

如何在 SKSpriteNode 中“居中”SKTexture

SpriteKit - 安全区域布局 Iphone X