#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. Не обязательно. Этот пример просто показывает вам другое место, где вы можете задать значения перед представлением.