图像文件夹:创建和填充SKShapeNodes,每个1个

时间:2016-10-01 20:47:45

标签: image sprite-kit skshapenode sktexture

是否可以创建一个文件夹并让SpriteKit浏览该文件夹,查找每个图像(无论名称如何),并为该文件夹中的每个文件创建一个SKShapeNode(无论有多少个)?

假设所有图像大小相同,并且所有.png文件都可以作为填充SKShapeNodes的纹理用作唯一图像,并且所有SKShapeNodes的大小都相同。

我想知道,一旦完成,创建了多少个形状,并根据所用纹理的图像名称对它们进行唯一命名。

但我所读到的所有内容似乎都是关于知道有多少张图片,以及他们的名字是什么。

无论从哪里开始搜索如何做到这一点。

更新:不知道如何引用"文件夹"与图像:

我把他们非常富有想象力的名字[一,二,三,四,五等]的图像放到一个文件夹中,像#34; atlas",像这样:

enter image description here

但是根据Allessandro的精彩回答,我不知道如何解决这个"文件夹"并了解其中的内容。

我认为这条线路我完全错了:

let folderPath = Bundle.main.path(forResource: "Images", ofType: nil)

我不知道用{。}替换"Images"的内容。

更新2:

找到一种更简单的方法:

let myTextureAtlas = SKTextureAtlas(named: "demoArt")

        print(myTextureAtlas)
        print(myTextureAtlas.textureNames)

2 个答案:

答案 0 :(得分:1)

请求太多,所以我尝试用一​​些代码来帮助你:

创建文件夹

func createDir(folderName:String) {
        let fileManager = FileManager.default
        if let directory = fileManager.containerURL(forSecurityApplicationGroupIdentifier: "APP_GROUP_IDENTIFIER") {
            let newDirectory = directory.appendingPathComponent(folderName)
            try! fileManager.createDirectory(at: newDirectory, withIntermediateDirectories: false, attributes: nil)
        }
}

现在您拥有了文件夹,因此您可以决定保存文件或将一个文件从文档复制到此新目录。我为最后一个做了一个例子。

复制文件

let fileManager = FileManager.default
do {
   try fileManager.copyItem(atPath: "hero.png", toPath: "subfolder/hero.swift")
}
catch let error as NSError {
   print("Something went wrong: \(error)")
}

现在您想知道如何从目录中提取所有文件。

从目录中提取所有文件

func extractAllFile(atPath path: String, withExtension fileExtension:String) -> [String] {
        let pathURL = NSURL(fileURLWithPath: path, isDirectory: true)
        var allFiles: [String] = []
        let fileManager = FileManager.default
        if let enumerator = fileManager.enumerator(atPath: path) {
            for file in enumerator {
                if #available(iOS 9.0, *) {
                    if let path = NSURL(fileURLWithPath: file as! String, relativeTo: pathURL as URL).path
                        , path.hasSuffix(".\(fileExtension)"){
                        allFiles.append(path)
                    }
                } else {
                    // Fallback on earlier versions
                }
            }
        }
        return allFiles
    }

<强>用法

let folderPath = Bundle.main.path(forResource: "Images", ofType: nil)
let allPngFiles = extractAllFile(atPath: folderPath!, withExtension: "png") // returns file path of all the png files inside the folder

之后,您可以使用SKShapeNode创建一个基于allPngFiles的{​​{1}}数组,其中包含从每个图像创建的SKTexture,并为每个节点提供fillTexture使用的文件(所以你最后也知道你从name创建了多少个节点。)

答案 1 :(得分:1)

这里的答案略有不同。我不确定为什么需要创建目录并复制文件。在你的截图中,你有一个包含7个文件的demoArt.atlas(one.png,two.png等)。您表示要生成SKShapeNode。我仍然不清楚为什么你想要SKShapeNode,但忽略它,你只需要知道文件夹名称。你会注意到文件夹是如何变蓝的,这意味着它是一个参考。这意味着在图像中,文件夹被保留。

这将获取该目录中的所有文件:

let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
let texPath = NSURL(fileURLWithPath: documentsPath).appendingPathComponent("demoArt.atlas")

let filemanager:FileManager = FileManager()
// Error check/ensure path exists
let files = filemanager.enumerator(atPath:texPath!.path)

while let file = files?.nextObject() {
    print(file)
    // Create your SKShapeNode here, you can load file from this
    // This is all relative path, so "file" would be one.png, two.png, etc. If you need the full path, you
    // need to prepend texPath
}

请注意,此处的键差异不是复制文件。也许我只是不明白这个问题以及为什么需要这个副本。

如果你想把它放在数组中,你可以。但是在这里你将拥有你当然需要加载的纹理的文件名。

实际上,您希望先异步加载这些纹理,然后构建SKShapeNode