Swift 2.0 - SKSpriteNode 的 SKTexture 有时不显示

Posted

技术标签:

【中文标题】Swift 2.0 - SKSpriteNode 的 SKTexture 有时不显示【英文标题】:Swift 2.0 - SKSpriteNode's SKTexture sometimes does not show 【发布时间】:2015-11-11 14:27:25 【问题描述】:

我有一个关于未绘制到屏幕上的 SKSpriteNode 纹理的问题。这个问题突然出现,我花了很长时间才找到它的根源,但我仍在寻找解决方案。

我所做的很简单:我基本上使用网格(x 列乘以 y 行)来绘制三消游戏的背景。每个单元格都包含一个带有纹理的精灵来绘制背景。这意味着总共有 x 次 y 精灵。内部单元格的纹理对于所有单元格都是相同的(纯灰色),对于外部单元格,我在角上绘制圆形瓷砖并在边缘上贴上瓷砖。

问题是:有时某些单元格未正确加载。我目前仅针对@2x 分辨率进行开发,但这不应该是问题。

我添加精灵的代码如下所示:

  for ((column, row), tile) in field.tiles.enumerate()
        let sprite = SKSpriteNode(imageNamed: tile!.tileType.spriteName)
        sprite.position = pointForColumn(column, row: row)

        print("Sprite: \(sprite)")
        tileLayer.addChild(sprite)

        tile!.sprite = sprite
    

tileType 是一个枚举,描述了所需的 9 种不同的单元格类型:

enum TileType: Int
    case Tl = 1, Tr, B, Bl, L = 5, Br = 8, R = 10, T = 12, All = 15


    var spriteName: String
        return String(format: "Tile_%ld.png", rawValue)
    

我的图片位于 .atlas 文件夹中。

精灵的控制台输出如下所示:

Sprite: <SKSpriteNode> name:'(null)' texture:[<SKTexture> 'Tile_3@2x.png' (180 x 180)] position:270, 30 scale:1.00, 1.00 size:90, 90 anchor:0.5, 0.5 rotation:0.00, Tile: Optional(tetris_attack.Tile)

如果没有,则纹理名称缺少“@2x”,尺寸为“0 x 0”而不是“180 x 180”。手动设置大小只会导致一个大的白色方块。看起来图片根本没有正确加载,因为文件名生成错误。

Sprite: <SKSpriteNode> name:'(null)' texture:[<SKTexture> 'Tile_1.png' (0 x 0)] position:330, 30 scale:1.00, 1.00 size:0, 0 anchor:0.5, 0.5 rotation:0.00, Tile: Optional(tetris_attack.Tile)

这似乎几乎是随机发生的。大多数情况下,右下角的角块缺失。有时也有一些内部瓷砖不显示。然后其他时候一些边缘瓷砖丢失了。

问题是有些精灵正确加载了它们的纹理,有些则没有——使用完全相同的图片和完全相同的代码!

精灵的位置是正确的。此外,更改 zPosition 并不能解决问题。显然是图片没有正确加载。

当我更改代码以使“spriteName”始终与图片名称相同(例如,spriteName 始终返回“Tile_1.png”)时,我从未见过丢失的图块,但这当然不是我想要的。这种行为对我来说绝对无法解释。

I found this related topic on the Apple developer forum,但错误修复(添加文件扩展名)对我不起作用。我什至在 Swift 1.2 和 XCode 6.3 中试用了我的代码,但问题没有改变,所以我的问题不太可能是 Swift 2 / XCode 7.1.1 问题。

有没有遇到同样问题的人可以在这里帮助我? 我仍然希望我只是在这里遗漏了一些重要的东西。

【问题讨论】:

【参考方案1】:

我对此进行了进一步调查,您需要更改节点的 z 位置,因为它可能被其他节点挡住了。

sprite.zposition = 1.0;

这应该可以解决问题。您还可以将所有节点的不透明度设置为 0.5,以查看是否有任何东西阻塞了节点。

【讨论】:

以上是关于Swift 2.0 - SKSpriteNode 的 SKTexture 有时不显示的主要内容,如果未能解决你的问题,请参考以下文章

停止 SKSpriteNode 离开视图 (Swift)

Swift 错误:无法调用非函数类型“SKSpriteNode”的值

Swift - 使用纹理数组更改 SKSpriteNode 纹理

使用 Swift 创建 SKSpriteNode 子类

如何使用 SKPhysicsJointPin 连接两个 SKSpriteNode - swift

移动时如何访问 SKSpriteNode 子类的对象(Swift)