Swift 2.0 - SKSpriteNode的SKTexture有时不会显示

时间:2015-11-11 14:27:26

标签: ios xcode swift skspritenode sktexture

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

我所做的很简单:我基本上使用网格(x列乘y行)来绘制第3场比赛的背景。每个单元格都包含一个带有纹理的精灵来绘制背景。这意味着总共有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)

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

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不能解决问题。显然,图片没有正确加载。

当我更改我的代码以便&#34; spriteName&#34;总是与图片的名称相同(例如spriteName总是返回&#34; Tile_1.png&#34;)我从未见过丢失的瓷砖,但当然这不是我想要的。这种行为对我来说绝对无法解释。

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

是否有人遇到同样的问题,谁可以帮助我? 我仍然希望我在这里错过一些大事。

1 个答案:

答案 0 :(得分:2)

我进一步研究了这个问题,您需要更改节点的z位置,因为它可能会被阻挡在其他节点后面。

sprite.zposition = 1.0;

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