是否可以创建一个文件夹并让SpriteKit浏览该文件夹,查找每个图像(无论名称如何),并为该文件夹中的每个文件创建一个SKShapeNode(无论有多少个)?
假设所有图像大小相同,并且所有.png文件都可以作为填充SKShapeNodes的纹理用作唯一图像,并且所有SKShapeNodes的大小都相同。
我想知道,一旦完成,创建了多少个形状,并根据所用纹理的图像名称对它们进行唯一命名。
但我所读到的所有内容似乎都是关于知道有多少张图片,以及他们的名字是什么。
无论从哪里开始搜索如何做到这一点。
我把他们非常富有想象力的名字[一,二,三,四,五等]的图像放到一个文件夹中,像#34; atlas",像这样:
但是根据Allessandro的精彩回答,我不知道如何解决这个"文件夹"并了解其中的内容。
我认为这条线路我完全错了:
let folderPath = Bundle.main.path(forResource: "Images", ofType: nil)
我不知道用{。}替换"Images"
的内容。
找到一种更简单的方法:
let myTextureAtlas = SKTextureAtlas(named: "demoArt")
print(myTextureAtlas)
print(myTextureAtlas.textureNames)
答案 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
。