如何正确使用Swift在SpriteKit中切换SKScenes?

我正在开发一个有3个不同的SKScenes(scene1,scene2,scene3)的游戏。 在GameViewController中,我像这样初始化它们:

class GameViewController: UIViewController { var hero = Hero() var skView: SKView! var scene1: SKScene! var scene2: SKScene! var scene3: SKScene! override func viewDidLoad() { super.viewDidLoad() // init scenes scene1 = SKScene(size: view.bounds.size, hero: hero) scene2 = SKScene(size: view.bounds.size, hero: hero) scene3 = SKScene(size: view.bounds.size, hero: hero) scene1.scaleMode = .AspectFill scene2.scaleMode = .AspectFill scene3.scaleMode = .AspectFill // set view skView = self.view as SKView // present the first scene skView.presentScene(scene1) } 

我的想法是先呈现第一个场景,然后再呈现(另一个场景)(即当英雄更强时)。 在每个场景中,英雄精灵都是这样添加的:

  func addHero() { let heroSprite = SKSpriteNode(imageNamed: "hero") hero.sprite = heroSprite heroSprite.position = CGPoint(x: size.width/4, y: size.height/2) addChild(heroSprite) } 

在更新方法中,英雄位置通过触摸来更新。

 func update() { if touching { hero.position++ } } 

英雄类看起来像这样:

 class Hero { var sprite: SKSpriteNode? } 

问题是只有第一个场景(场景1)被初始化时,英雄才能移动。 这意味着,英雄不能再以上面的代码移动。

任何人都可以给我一些build议,我做错了什么? 提前致谢!

PS:完整的代码可以在Githubfind。

这个问题是由另一个相关的问题解决的: 在SpriteKit和Swift切换场景之前必须清理精灵?

通过切换场景,请确保不要通过检查初始状态来添加两次精灵。 例如在“didMoveToView”,“init”或“setup”方法中:

 if isInit { do nothing } else { add sprites isInit = true }