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 有时不显示的主要内容,如果未能解决你的问题,请参考以下文章
Swift 错误:无法调用非函数类型“SKSpriteNode”的值
Swift - 使用纹理数组更改 SKSpriteNode 纹理