繁体   English   中英

Spritekit-从.sks文件中创建的场景从另一个场景过渡时为空白

[英]Spritekit - Scene created in .sks file is blank when transitioning from another scene

我有一个主菜单场景,当按下一个按钮时,它应该过渡到另一个场景。 它似乎可以正确过渡,但完成过渡后,第二个场景为空白。 我在第二个场景的didMove函数中设置了断点,它似乎运行正常。 我知道从GameViewController直接打开时第二个场景可以正常工作。 我不确定从另一个场景过渡时为何空白。 这是我当前的代码:

class StartScene: SKScene {

  var playButton = SKSpriteNode()
  let playButtonTex = SKTexture(imageNamed: "BlueRoundedButton")

  override func didMove(to view: SKView) {

    playButton = SKSpriteNode(texture: playButtonTex)
    playButton.size = CGSize(width: 200, height: 50)
    playButton.position = CGPoint(x: frame.midX, y: frame.midY)
    self.addChild(playButton)
  }

  override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
    if let touch = touches.first {
      let pos = touch.location(in: self)
      let node = self.atPoint(pos)

      if node == playButton {
        if let view = view {
          let transition:SKTransition = SKTransition.fade(withDuration: 1)
          let scene:SKScene = PoolScene(size: self.size)
          self.view?.presentScene(scene, transition: transition)
        }
      }
    }
  }
}

这是过渡到的场景:

class PoolScene: SKScene, SKPhysicsContactDelegate {

  var ballPoke : SKSpriteNode?
  var ballBlue : SKSpriteNode?
  var ballOrange : SKSpriteNode?


  override func didMove(to view: SKView) {

    let borderBody = SKPhysicsBody(edgeLoopFrom: self.frame)
    borderBody.friction = 0
    self.physicsBody = borderBody

    self.physicsWorld.gravity = CGVector(dx: 0, dy: 0)
    physicsWorld.contactDelegate = self

    ballBlue = childNode(withName: blueBallName) as? SKSpriteNode
    ballOrange = childNode(withName: orangeBallName) as? SKSpriteNode
    ballPoke = childNode(withName: pokeBallName) as? SKSpriteNode


    ballBlue?.physicsBody?.categoryBitMask = blueBallCategory
    ballOrange?.physicsBody?.categoryBitMask = orangeBallCategory
    ballPoke?.physicsBody?.categoryBitMask = pokeBallCategory
    borderBody.categoryBitMask = borderCategory


  }

您正在调用错误的init方法来加载PoolScene。 当您不使用Xcode可视化级别编辑器时,可以使用该方法。 像您的GameViewController一样,您需要通过引用相应的.sks文件来初始化场景。

 if node == playButton {
     if let view = view {
        let transition = SKTransition.fade(withDuration: 1)

         if let scene = PoolScene(fileNamed: "PoolScene") {
              view.presentScene(scene, transition: transition)
         }
      }
  }

或以更清洁的方式

  if node == playButton {
     let transition = SKTransition.fade(withDuration: 1)

     if let scene = PoolScene(fileNamed: "PoolScene") {
         view?.presentScene(scene, transition: transition)    
      }
  }

“ fileNamed:...”是您的PoolScene的.sks文件的名称,通常您提供与.swift文件完全相同的名称。 请使用guard或if let,因为它将返回可选值。

作为一个小技巧,利用swifts类型推断使您的代码更好,如我的示例所示。

希望这可以帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM