在Swift 3中获取SKSpriteNode的文件名

tha*_*har 5 sprite-kit skspritenode swift swift3

如何从SKSpriteNode?访问图像文件名?我一直试图谷歌这个,但似乎没有答案可用.这是我的代码中无用的部分:

current_ingredient?.name = String(describing: current_ingredient?.texture)

print("Filename: \(current_ingredient?.name)")
Run Code Online (Sandbox Code Playgroud)

print命令返回:

Filename: Optional("Optional(<SKTexture> \'ingredient14\' (110 x 148))")
Run Code Online (Sandbox Code Playgroud)

所以,问题是,我怎么才得到"ingredient14"?

Luc*_*tti 8

保存在userData中

您可以存储用于在userData属性中创建精灵的图像名称.

let imageName = "Mario Bros"
let texture = SKTexture(imageNamed: imageName)
let sprite = SKSpriteNode(texture: texture)
sprite.userData = ["imageName" : imageName]
Run Code Online (Sandbox Code Playgroud)

现在给定一个精灵,您可以检索您最初使用的图像的名称

if let imageName = sprite.userData?["imageName"] as? String {
    print(imageName) // "Mario Bros"
}
Run Code Online (Sandbox Code Playgroud)

  • 这似乎是最安全的方式,因为如果Apple决定更改description属性的实现,那么带有扩展的其他解决方案将会中断,并且需要重新编写(更新).我真的很想知道为什么纹理名称从一开始就不是属性.这会很有用. (3认同)

Kni*_*gon 4

它存储在描述中,所以这是我为了将其撕掉而制作的一个很好的小扩展。

extension SKTexture
{
    var name : String
    {
        return self.description.slice(start: "'",to: "'")!
    }
}

extension String {
    func slice(start: String, to: String) -> String? 
    {

        return (range(of: start)?.upperBound).flatMap 
        { 
          sInd in
            (range(of: to, range: sInd..<endIndex)?.lowerBound).map 
            {
                eInd in
                substring(with:sInd..<eInd)

            }
        }
    }
}
usage:

print(sprite.texture!.name)
Run Code Online (Sandbox Code Playgroud)