У меня есть подкласс SKScene, в который я хочу загрузить сцену из файла .sks. Я должен использовать super.init(size: CGSize) для инициализации SKScene в инициализации моего подкласса вместо 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")
}
}
вы имеете в виду init?(coder:) внизу моего кода? как мне использовать его, чтобы иметь ту же инициализацию, что и в инициализации выше?
как мне это реализовать, чтобы я мог инициализировать подкласс SKScene, как в super.init(fileNamed:)?
Плохо, вам не нужно init?(coder:), если вы используете init(fileNamed:). Я рад, что кто-то помог вам лучше, чем я!





Это не обязательно, так как в .sks есть собственный класс. Вы просто положили "Спилфельд" внутрь.
Затем в 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.
Под .property вы имеете в виду атрибуты x, y, ... из моего подкласса, верно? Кроме того, когда я устанавливаю эти атрибуты, как в вашем примере, в каком объекте они будут сохранены, когда я это сделаю (sceneNode as! Spielfeld)? Разве не нужно заранее хранить `(sceneNode as! Spielfeld) в переменной?
Не обязательно. Этот пример просто показывает вам еще одно место, где вы можете установить значения перед презентацией.
Если он загружен из файла
.sks, вы должны реализоватьinit?(coder:)