如何使用 Swift 正确切换 SpriteKit 中的 SKScene?

Posted

技术标签:

【中文标题】如何使用 Swift 正确切换 SpriteKit 中的 SKScene?【英文标题】:How to switch SKScenes in SpriteKit with Swift properly? 【发布时间】:2014-12-01 05:37:50 【问题描述】:

我正在开发一款包含 3 个不同 SKScene(场景 1、场景 2、场景 3)的游戏。在 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)
  

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

func update() 
  if touching 
    hero.position++
  

英雄类如下所示:

class Hero 
  var sprite: SKSpriteNode?

问题是: 当第一个场景(scene1)被初始化时,英雄可以通过触摸移动。这意味着,使用上面的代码,英雄不再是可移动的。

谁能给我一些建议,我做错了什么?提前致谢!

PS:完整的代码可以在Github找到。

【问题讨论】:

你可以添加你的更新功能,你也应该使用touches移动功能通过触摸移动你的精灵。 是的,update()函数很简单。我已经编辑了帖子。我在想 3 个场景在初始化时发生了什么。它们是同时运行还是仅在出现时运行? 你什么时候呈现你的下一个场景,例如:在同一个函数中或在另一个函数中或在另一个类中? @AbdullahOssamaOmari 下一个场景也将出现在 GameViewController 中,但前提是满足条件。经过测试,我发现问题是由于“addHero()”函数造成的。 3个场景初始化后调用3次。而我仍然不清楚,为什么英雄是不可移动的。它的精灵只是添加到 3 个不同的场景中。 (思考...) 【参考方案1】:

另一个相关问题解决了这个问题:Sprites must be cleaned before switch scenes with SpriteKit and Swift?

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

if isInit 
  do nothing
 else 
  add sprites
  isInit = true

【讨论】:

以上是关于如何使用 Swift 正确切换 SpriteKit 中的 SKScene?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Swift 在 SpriteKit 程序中初始化/移动相机?

spritekit 场景转换工作不正确

无法在 SpriteKit 中正确移动入侵者

暂停和重置游戏 Spritekit / Swift 之间的区别?

SpriteKit, Swift 2.0 - 在游戏地图上生成对象

在使用 Swift 的 SpriteKit 中的 didBeginContact(日志)中未检测到 contactTestBitMask