你如何在 SpriteKit 中使用委托协议模式?
How do you use the Delegate Protocol Pattern with SpriteKit?
所以我有一个 UIViewController
和两个 SKScene
。 UIViewController
通过旋转设备呈现两个场景; landscape
加载SKScene
1和portrait
加载SKScene
2是这样的:
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
之间实现委托协议模式。问题是 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
轻松设置委托
所以我有一个 UIViewController
和两个 SKScene
。 UIViewController
通过旋转设备呈现两个场景; landscape
加载SKScene
1和portrait
加载SKScene
2是这样的:
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
之间实现委托协议模式。问题是 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