Загрузить сцену Spritekit из подкласса

#ios #swift #sprite-kit #skscene

#iOS #swift #sprite-kit #skscene

Вопрос:

У меня есть подкласс SKScene, в который я хочу загрузить сцену из .sks файла. Я должен использовать super.init(size: CGSize) для инициализации SKScene в init моего подкласса вместо super.init(fileNamed: String) , потому что super.init(fileNamed: String) это не назначенный инициализатор. Как я могу создать подкласс SKScene и с помощью семантики super.init(fileNamed: String) загрузить сцену из файла?

 import SpriteKit

class Spielfeld: SKScene {

    var x: Int     // Anzahl Felder in x-Richtung
    var y: Int     // Anzahl Felder in y-Richtung
    var up: SKSpriteNode = SKSpriteNode()
    var down: SKSpriteNode = SKSpriteNode()
    var left: SKSpriteNode = SKSpriteNode()
    var right: SKSpriteNode = SKSpriteNode()

    init(_ x: Int, _ y: Int, fileNamed: String, size: CGSize) {
        self.x = x
        self.y = y
        super.init(size: size)
        up = self.childNode(withName: "Up") as! SKSpriteNode
        down = self.childNode(withName: "Down") as! SKSpriteNode
        left = self.childNode(withName: "Left") as! SKSpriteNode
        right = self.childNode(withName: "Right") as! SKSpriteNode
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

}
  

Комментарии:

1. Если она загружена из .sks файла, вы должны реализовать init?(coder:)

2. вы имеете в виду init?(coder:) внизу моего кода? как мне использовать ее, чтобы выполнить ту же инициализацию, что и в инициализации выше?

3. как мне это реализовать, чтобы я мог инициализировать подкласс SKScene, как в super.init(fileNamed:) ?

4. Моя ошибка, вам не нужно, init?(coder:) если вы используете init(fileNamed:) . Я рад, что кто-то помог вам лучше, чем я!

Ответ №1:

В этом нет необходимости, так как в .sks есть пользовательский класс. Вы просто помещаете «Spielfeld» внутрь.

Затем в ViewController:

 if let sceneNode = SKScene.init(fileNamed: "Spielfeld(Whatever your name is here)") { 
         (sceneNode as! Spielfeld).property = "anyValueToUse"

         if let view = self.view as! SKView? {
            view.presentScene(sceneNode) //present the scene.
   }
  

Если вы решили загрузить из файла, нет причин для повторной инициализации. Вы можете добавить функции инициализации, переопределив следующие:

    override func sceneDidLoad() {  
     } //called after .sks is loaded.

override func didMove(to view: SKView) {
//change the size here.
 } // called after presentation.
  

Комментарии:

1. .property Вы имеете в виду атрибуты x, y, ... из моего подкласса, верно? Также, когда я устанавливаю эти атрибуты, как в вашем примере, в каком объекте они будут сохранены, когда я это сделаю (sceneNode as! Spielfeld) ? Разве не обязательно сохранять `(SceneNode как! Шпильфельд) в переменной раньше?

2. Не обязательно. Этот пример просто показывает вам другое место, где вы можете задать значения перед представлением.