Как вы используете шаблон протокола делегирования с SpriteKit? - PullRequest
0 голосов
/ 16 января 2020

Итак, у меня есть один UIViewController и два SKScene с. UIViewController представляет две сцены, вращая устройство; landscape загрузка SKScene 1 и portrait загрузка SKScene 2 л ie это:

    override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
        print("TRIGGERED")

        if UIDevice.current.orientation.isLandscape {
            print("Landscape")
            presentView(name: "GameScene")
        } else {
            print("Portrait")
            presentView(name: "GameScene2")
        }
        super.viewWillTransition(to: size, with: coordinator)

    }

    func presentView(name: String) {
        if let view = self.view as! SKView? {
              if let scene = SKScene(fileNamed: name) {
                  scene.scaleMode = .aspectFill
                  view.presentScene(scene)
              }
              view.ignoresSiblingOrder = true
              view.showsFPS = true
              view.showsNodeCount = true
          }
    }

Это прекрасно работает. Моя дилемма, однако, заключается в том, что я хочу реализовать шаблон протокола делегата между двумя SKScenes GameScene и GameScene2. Проблема в том, что UIViewController (self) из SKScene 1 должен быть передан как делегат в SKScene 2. Поэтому, если пользователь, например, щелкнет что-то в режиме landscape (GameScene), som data String передается GameScene2, когда ориентация меняется на portrait.

Так в SkScene 1:

protocol MyProtocol {
    func myProtocolFunc(someString: String)
}

class GameScene: SKScene{

    var myDelegate: MyProtocol!

и в UIViewController как мне установить делегата? scene.myDelegate не работает. GameScene().myDelegate = GameScene2().self работает, но так как view.presentScene(scene) используется для представления неактуальной сцены. Как получить доступ и установить delegate? Как настроить шаблон delegate-protocol, чтобы получить желаемый результат?

1 Ответ

1 голос
/ 16 января 2020

Использование Swift 5 :

protocol MyProtocol: AnyObject {
    func myProtocolFunc(someString: String)
}

class GameScene: SKScene {
    weak var myDelegate: MyProtocol?

    init(fileNamed: String) {
        super.init(fileNamed: fileNamed)
    }
}

Затем необходимо создать объект сцены в вашем методе presentView как GameScene, а не SKScene (как вы это сделали). Поэтому вместо:

if let scene = SKScene(fileNamed: name) // wrong

вам необходимо:

if let scene = GameScene(fileNamed: name) // correct

, а затем вы можете легко установить делегата с помощью scene.myDelegate

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...