如何在 Sprite Kit 中切换场景?

How to switch between scenes in Sprite Kit?

我的代码有什么问题?每次我按下按钮时,我都会得到一个默认的灰色屏幕。转换按钮:

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
    for touch: AnyObject in touches {
    let location = touch.locationInNode(self)
        if self.nodeAtPoint(location) == self.pause {
            var pauseScene = PauseScene(size: self.size)
            scene?.paused = true
            let skView = self.view as SKView!
            skView.ignoresSiblingOrder = true
            pauseScene.scaleMode = .AspectFill
            pauseScene.size = skView.bounds.size
            skView.presentScene(pauseScene)
        }
    }
}

我不想加载的那个场景:

class PauseScene: SKScene {
    let pauseBackground = SKSpriteNode (imageNamed: "pauseBackground")

    override func didMoveToView(view: SKView) {
        self.pauseBackground.anchorPoint = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame))
        self.pauseBackground.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame))
        self.addChild(pauseBackground)
    }

}

我错过了什么吗?

您的问题似乎出在您的 PauseScene 中的 didMoveToView: 中。您不想更改 self.pauseBackground 的锚点 通常锚点基于 0 到 1。(.5,.5) 是精灵的中心。您将其设置为比该值高得多的值,并且如果您将位置设置为场景宽度和高度的一半,我根本不明白您为什么要更改锚点。看起来只需删除代码行即可解决问题。

class PauseScene: SKScene {
let pauseBackground = SKSpriteNode (imageNamed: "pauseBackground")

    override func didMoveToView(view: SKView) {
        self.pauseBackground.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame))
        self.addChild(pauseBackground)
    }
}

我还看到您在初始化场景后正在更改场景的大小。我会用你想要的大小初始化它。

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
    for touch: AnyObject in touches {
    let location = touch.locationInNode(self)
        if self.nodeAtPoint(location) == self.pause {
            let skView = self.view as SKView!
            skView.ignoresSiblingOrder = true
            var pauseScene = PauseScene(size: skView.bounds.size)
            scene?.paused = true
            pauseScene.scaleMode = .AspectFill
            skView.presentScene(pauseScene)
        }
    }
}

希望这对您有所帮助并且有意义。

这是一个更新的答案 swift 5,iOS 14 使用 swiftUI

导入斯威夫特UI 导入 SpriteKit

struct ContentView: View {

@State var switcher = false

var scene: SKScene {
    let scene = GameScene.shared
    scene.size = CGSize(width: 256, height: 256)
    scene.scaleMode = .fill
    scene.backgroundColor = .red
    scene.name = "red"
    return scene
}

var scene2: SKScene {
    let scene2 = GameScene2.shared
    scene2.size = CGSize(width: 256, height: 256)
    scene2.scaleMode = .fill
    scene2.backgroundColor = .blue
    scene2.name = "blue"
    return scene2
}

var body: some View {
  if switcher {
    SpriteView(scene: scene)
        .frame(width: 256, height: 256)
        .ignoresSafeArea()
        .background(Color.red)
        .onAppear {
          scene2.isPaused = true
        }
        .onDisappear {
          scene2.isPaused = false
        }
        
  } else {
    SpriteView(scene: scene2)
        .frame(width: 256, height: 256)
        .ignoresSafeArea()
        .background(Color.blue)
        .onAppear {
          scene.isPaused = true
        }
        .onDisappear {
          scene.isPaused = false
        }
        
  }
  Button {
    withAnimation(.easeInOut(duration: 1.0)) {
      switcher.toggle()
    }
  } label: {
    Text("switch")
  }
}
}

class GameScene: SKScene {

static var shared = GameScene()

override func update(_ currentTime: TimeInterval) {
// Tells your app to perform any app-specific logic to update your scene.
  print("name ",scene!.name)
}
}