Create/Load SKTilemapnode 不使用 SKS/Scene 文件
Create/Load SKTilemapnode without using SKS/Scene files
我以编程方式创建我的 sprite 套件游戏,而 sks 文件最终让我感到困惑。
有没有一种方法可以在不使用 sks/scene 文件的情况下加载或创建瓦片地图节点?
我想出了一个办法:
- 1) 创建一个名为 tilemaps 的 SKS 文件
- 2) 在那里创建你所有的地图
3) 添加此扩展以在当前场景中加载该场景文件:
extension SKNode {
class func unarchiveFromFile(file : NSString) -> SKNode? {
if let path = Bundle.main.path(forResource: file as String, ofType: "sks") {
let sceneData = NSData(contentsOfFile: path)
let archiver = NSKeyedUnarchiver(forReadingWith: sceneData as! Data)
archiver.setClass(self.classForKeyedUnarchiver(), forClassName: "SKScene")
let scene = archiver.decodeObject(forKey: NSKeyedArchiveRootObjectKey) as! SKNode
archiver.finishDecoding()
return scene
} else {
return nil
}
}
}
然后从 sks 文件中获取瓦片地图。奇怪的是你必须先从它的父级中删除它:
guard
let tileScene = SKScene.unarchiveFromFile(file: "TileMaps"),
let testMap = tileScene.childNode(withName: "Dungeon1")
as? SKTileMapNode else {
fatalError("Background node not loaded")
}
self.testMap = testMap
self.testMap.removeFromParent()
self.testMap.zPosition = 1200
self.addChild(testMap)
我以编程方式创建我的 sprite 套件游戏,而 sks 文件最终让我感到困惑。
有没有一种方法可以在不使用 sks/scene 文件的情况下加载或创建瓦片地图节点?
我想出了一个办法:
- 1) 创建一个名为 tilemaps 的 SKS 文件
- 2) 在那里创建你所有的地图
3) 添加此扩展以在当前场景中加载该场景文件:
extension SKNode { class func unarchiveFromFile(file : NSString) -> SKNode? { if let path = Bundle.main.path(forResource: file as String, ofType: "sks") { let sceneData = NSData(contentsOfFile: path) let archiver = NSKeyedUnarchiver(forReadingWith: sceneData as! Data) archiver.setClass(self.classForKeyedUnarchiver(), forClassName: "SKScene") let scene = archiver.decodeObject(forKey: NSKeyedArchiveRootObjectKey) as! SKNode archiver.finishDecoding() return scene } else { return nil } }
}
然后从 sks 文件中获取瓦片地图。奇怪的是你必须先从它的父级中删除它:
guard
let tileScene = SKScene.unarchiveFromFile(file: "TileMaps"),
let testMap = tileScene.childNode(withName: "Dungeon1")
as? SKTileMapNode else {
fatalError("Background node not loaded")
}
self.testMap = testMap
self.testMap.removeFromParent()
self.testMap.zPosition = 1200
self.addChild(testMap)