你如何在 SpriteKit 中使用委托协议模式?

How do you use the Delegate Protocol Pattern with SpriteKit?

所以我有一个 UIViewController 和两个 SKSceneUIViewController通过旋转设备呈现两个场景; landscape加载SKScene1和portrait加载SKScene2是这样的:

    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 GameSceneGameScene2 之间实现委托协议模式。问题是 SKScene 1 的 UIViewController (self) 应该作为委托传递给 SKScene 2。因此,例如,如果用户在 landscape 模式下单击某些内容(GameScene),当方向更改为 portrait 时,som 数据 String 被传递到 GameScene2。

所以在 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 模式以获得所需的结果?

使用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

轻松设置委托