2017-02-13 2 views
4

Я пытаюсь создать инициализатор удобства, который переопределяет инициализатор convenience init? (fileNamed:) в SKScene, чтобы я мог передать некоторые начальные значения в сцену, а также разархивировать. sks файл. Проблема в том, что когда я пытаюсь это сделать, кажется, что подкласс SKScene (GameScene) не может видеть convenience init? (fileNamed:) суперкласса. Вот некоторые из моих попыток:Создание пользовательского инициализатора для SKScene, который переопределяет удобство init? (FileNamed :)

Class GameScene : SKScene { 

var stage : Int? 

override init(size: CGSize) { 
    super.init(size: size) 
} 

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

convenience init?(fileNamed: String, stage: Int) { 
    self.init(fileNamed: fileNamed) // Compiler error-- Argument labels '(filenamed:)' do not match any available overloads 
    self.stage = stage 
} 

Еще одна попытка, я нашел предложил в качестве обходного пути:

Class GameScene : SKScene { 

var stage : Int? 

override init(size: CGSize) { 
    super.init(size: size) 
} 

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

convenience init?(fileNamed: String) { 
    self.init(fileNamed: fileNamed) // Error at run time: EXC_BAD_ACCESS (code=2, address=0x16fc1bff0) 
} 

convenience init?(fileNamed: String, stage: Int) { 
    self.init(fileNamed: fileNamed) 
    self.stage = stage 
} 

Отладчик показывает бесконечный цикл GameScene.init(fileNamed : String) -> GameScene?

Как это сделать? Мне нужно продолжать свою жизнь! (и этот проект ...)

ответ

3

Не может быть так просто?

if let gameScene = GameScene(fileNamed: "GameScene") { 

     self.gameScene = gameScene 
     self.gameScene.stage = 1 
     self.gameScene.setupBasedOnStage() 
     self.gameScene.scaleMode = .aspectFill 
     self.gameScene.gameSceneDelegate = self.menuSceneDelegate as! GameSceneDelegate! 
     self.view?.presentScene(self.gameScene, transition: SKTransition.reveal(with: .down, duration: 1.0)) 
    } 

Вы можете установить свойство этапа, прежде чем раскрывать страницу, и если вам нужно вы можете вызвать функцию настройки для загрузки Информация/графики, основанные на сцене.

Я знаю, что это не так элегантно, как то, что вы пытаетесь сделать, но, возможно, иногда самый простой ответ - лучший?

+1

Точка взята! Это делает работу. Спасибо за то, что он голос прагматизма. Тем не менее, я хотел бы знать, почему я не могу успешно переопределить удобство init в SKScene ... – drockFai

+0

Кстати, что такое тип GameSceneDelegate? Я никогда не использовал это. – drockFai

+0

oops, не должен был включать это в мой пример ... Я создаю своих собственных делегатов на своих сценах, и я делаю GameViewController соответствующими этим делегатам. Таким образом, если мне нужно, чтобы GameViewController что-то делал (отображать таблицы лидеров, скриншоты, диалог контактов/почты и т. Д.), Я просто вызываю gameSceneDelegate.showLeaderboards(), чтобы найти GameViewController, помещая его в переменную, а затем вызывает функцию –

3

Swift имеет правила вокруг удобства инициализаторах:

Правило 1: Назначенный инициализатор должен назвать назначенный инициализатору от своего суперкласса.

Правило 2: Инициализатор удобства должен вызвать другой инициализатор от того же класса.

Правило 3: Инициализатор удобства должен в конечном итоге вызвать назначенный инициализатор .

Инициализатором public convenience init?(fileNamed filename: String) сам по себе является удобство initilizer на SKNode, поэтому попытки вызвать его из собственных перерывов удобства инициализатора Правила 2.

Если вы видите в Xcode быстрых подсказках, только инициализатор доступен для вызова из вашего удобства инициализатор будет required init?(coder aDecoder: NSCoder), который удовлетворяет правилу 3.

+0

Я вижу. Так можно ли создать удобный init, который объединяет (fileNamed :) для загрузки .sks, а также других параметров? – drockFai

+0

Вам придется загружать файл 'sks' самостоятельно, вместо того, чтобы вызывать (инициализатор удобностей fileNamed :). –

Смежные вопросы