Ранее я спрашивал, могу ли я использовать редактор Scene для создания сложных SKSpriteNodes, а просто используя его для компоновки SKScenes. С помощью @Anton Rogachevskyi the previous question Я начал использовать unarchiveNodeFromFile, чтобы найти файл .SKS. Он загружает файл sks, как и следовало ожидать, но когда я пытаюсь добавить его в текущую сцену, ничего не появляется. Если я сломаю строку addChild и просмотрю объект, который он отобразит в окне предварительного просмотра, поэтому я знаю, что он находит правильный файл. Внутри файла sks есть пользовательский класс диалога и установка точек останова в «требуемом init?» (Coder aDecoder: NSCoder) «Я могу сказать, что пользовательский объект получает правильную инициализацию.Unarchived Node не появляется при добавлении к родительскому объекту в SpriteKit
в диалоговом классе я программно добавить розовую коробку к объекту, чтобы показать, что он достигнет инициализации класса
class TeamDialog: SKSpriteNode {
init(size: CGSize) {
super.init(texture: nil, color: .red, size: size)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setup()
}
func setup() {
let pinkBox = SKSpriteNode(color: .magenta, size: CGSize(width: 100, height: 100))
pinkBox.zPosition = 500
addChild(pinkBox)
}
}
И в сцене это, как я считаю, объект и попытаться добавить его на сцену, она появляется в окне предварительного просмотра, но ничего не отображается на экране
private func displayDialog() {
if let wtf = unarchiveNodeFromFile(file: "TeamDialog")! as SKNode? {
let layer = SKSpriteNode(color: .clear, size: self.size)
layer.zPosition = 5000
layer.position = CGPoint(x: self.size.width/2, y: self.size.height/2)
addChild(layer)
for child in wtf.children {
print("child \(child.name)")
if let teamDialog = child as? TeamDialog {
teamDialog.removeFromParent()
layer.zPosition = 1
layer.addChild(teamDialog)
}
}
}
}
func unarchiveNodeFromFile(file: String) -> SKNode? {
if let path = Bundle.main.path(forResource: file, ofType: "sks") {
let fileData = NSData.init(contentsOfFile: path)
let archiver = NSKeyedUnarchiver.init(forReadingWith: fileData as Data!)
archiver.setClass(SKNode.classForKeyedUnarchiver(), forClassName: "SKScene")
let node = archiver.decodeObject(forKey: NSKeyedArchiveRootObjectKey) as! SKNode
archiver.finishDecoding()
return node
} else {
return nil
}
}
Опять же, я вижу это в окне предварительного просмотра, но ничего не появляется, когда он добавляется к сцене.
Должен ли я обрабатывать объект, который был разблокирован по-другому или что-то сделать, прежде чем я смогу добавить его в сцену?
Я вытащил код и поместил его в тестовый проект с теми же результатами.
Я попытался добавить файл SKS (как узел) на сцену, не повезло, и я пытался изолировать из диалогового окна из файла SKS и добавив его без везения
Эти вопросы являются блестящими. Весь другой уровень тщательности и интересный сам по себе. – Confused
Спасибо, я ценю это.Я нахожусь в точке с SpriteKit, что мне нужно начать получать больше функциональности из-за этого, потому что ожидая, что Apple активирует функции или поддержку, кажется, это потерянная причина. –
Из памяти iOS от 8 до 9 обнаружено больше ошибок, чем функций, добавленных в SpriteKit. В iOS 10 добавлена трава, размахивающая SKWarpNode и еще что-то, что я забыл. Хотя это было, конечно, удивительно _ **. – Confused