2016-10-01 8 views
2

Я начал следовать учебнику «Космических захватчиков» Рэя Вендерлиха, но значительно расходился. У меня теперь есть 3 SKScenes - мой титульный экран, мой основной игровой экран и мой конечный уровень/игра за экраном. Заглавный экран и конечная игровая сцена я добавил, и у этих обоих есть файлы .sks; на главном экране игры нет и все элементы (SKSpriteNodes и т. д.) размещаются программно. Поток моей программы выглядит следующим образом:Как добавить файлы .sks в существующий проект Swift/Sprite-Kit?

enter image description here

теперь я на самом деле хотел бы разместить некоторые события на главном экране игры с помощью редактора сцены, так что я создал файл .sks для него и пытался изменить мой titleScene.swift следующим образом:

от:

let gameScene = GameScene(size:CGSize(width: 1536, height: 2048)) 

к:

let gameScene = SKScene(fileNamed: "GameScene.sks") as! GameScene! 

Однако, это даст вам:

enter image description here

Я попытался удалить required init(coder aDecoder: NSCoder) но Xcode потом жалуется, что

требуется INIT (кодировщик: должны быть поставлены подкласс SKScene

Однако мои titleScene и gameOverScene также являются подклассами SKScene, и у них нет init (coder :)

Я действительно не вижу разницы в том, что я делаю, чтобы отобразить свой заголовок и мой gameOverScene через (fileNames :) и их .sks-файл и попытаться сделать то же самое для моей игры.

+0

Попробуйте так: если пусть gameScene = GameScene (fileNamed: "GameScene") {} – Whirlwind

+0

Теперь я получаю: «неправильный аргумент в вызове (есть«имя файла : ', expected' size: '). Я уверен, что есть что-то простое, что мне не хватает ... –

+0

InitWithSize не используется, когда сцена загружается из .sks. Я не понимаю, почему у вас это есть в вашем GameScene? Удалите его и удалите реализацию init с помощью кодера, и он будет работать. – Whirlwind

ответ

3

Причина, по которой вы получаете требуемое, состоит в том, что у вас есть переменные, которые не являются необязательными или не инициализированы до начала инициализации.

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

required init?(coder aDecoder: NSCoder) 
{ 
    super.init(coder: aDecoder) 
} 

Но тогда вы спросите меня: Г-н Knight0fDragon, он говорит мне, чтобы заменить fileNamed с coder , и он не компилируется, когда я его переключаю.

Ну, это потому, что init(fileNamed:) - это удобство init, а не назначенный init. Чтобы иметь возможность подклассифицировать класс и получить все его удобства, вам необходимо переопределить все его назначенные.

Теперь SKScene, у вас есть 3, и вы уже знаете о 1.

Давайте переопределять другой 2:

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

Хорошо, теперь этот щенок должен быть готов к компиляции, нам нужно просто для присвоения переменных.

Ну, что мне нравится делать, это создать способ настройки для любой переменной, которая должна быть назначена в любой версии инициализации после вызова супер.

К сожалению, мы не можем сделать это для констант до вызова супер, поэтому те, которые нам нужно настроить в каждом методе. Причина в том, что self еще не существует.

Это в конечном итоге выглядит так:

let constant : String 
required init?(coder aDecoder: NSCoder) 
{ 
    constant = "hi" 
    super.init(coder: aDecoder) 
    setup() 
} 
override init() { 
    constant = "hi" 
    super.init() 
    setup() 
} 
override init(size: CGSize) { 
    constant = "hi" 
    super.init(size: size) 
    setup() 
} 
+0

Отлично - это исправлено. Огромное спасибо. Таким образом, разница между моими игровыми сценариями и TitleScene/GameOverScene заключалась в том, что только у gameScene были неинициализированные хранимые свойства. Я знал, что инициализация в Свифте звучит немного сложно (возможно, это не то, что вы понимаете), но никогда не сталкивались с этим раньше. –

+0

mhmm точно, вы привыкнете к этому – Knight0fDragon

+0

Вот очень хороший пример того, как вы начинаете рассказывать читателю о том, как и почему инициализация является такой большой сделкой в ​​Swift! – Confused