我有一个关于未绘制到屏幕上的 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”)时,我从未见过丢失的图块,但这当然不是我想要的。这种行为对我来说绝对无法解释。
我在 Apple 开发者论坛上找到了这个相关主题,但错误修复(添加文件扩展名)对我不起作用。我什至在 Swift 1.2 和 XCode 6.3 中尝试了我的代码,但问题没有改变,所以我的问题不太可能是 Swift 2 / XCode 7.1.1 问题。
有没有人遇到同样的问题并且可以在这里帮助我?我仍然希望我只是在这里遗漏了一些重要的东西。