在应用程序激活后保持游戏暂停?

Keeping the game paused after app become active?

这是我第一次 post 在这个论坛上,如果我做的事情不正确,我提前道歉! :)

我正在使用 Swift 和 SpriteKit 制作一个 iphone 游戏,我目前遇到了一个问题。当我的应用程序进入后台时,它会调用暂停功能(参见下文),但当游戏恢复时它会自动取消暂停。

我看到这个非常有趣 post : Spritekit - Keep the game paused when didBecomeActive (and How to keep SpriteKit scene paused when app becomes active?) 但我卡住了。

我不知道如何实现新的 SKView class,因为我的视图配置如下面的代码所示...

我的应用程序是这样工作的:

class GameViewController: UIViewController {

var scene: GameScene!

override func viewDidLoad() {
    super.viewDidLoad()

    // Configure the View
    let SkView = view as! SKView
    SkView.multipleTouchEnabled = true

    // Create and configure the scene
    scene = GameScene(size: SkView.bounds.size)
    scene.scaleMode = .AspectFill

    // Present the scene
    SkView.presentScene(scene)

    NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("PauseWhenBackGround:"), name:"PauseWhenBackGround", object: nil)
}

func PauseWhenBackGround(notification : NSNotification) {
    if scene.Pausing == false{
        scene.Pause()
    }
}

我尝试了以下方法:

我添加了一个新的 class 即:

class GameSceneView : SKView {      
    func CBApplicationDidBecomeActive() {
    }
}

然后,我尝试将我的视图设置为 let SkView = view as! GameSceneView,但我收到一条错误消息,提示我无法将视图转换为 MyProjectName.GameSceneView()... 我还尝试了以下方法:let SkView! = GameSceneView() as GameSceneView! 但我最终得到了一个灰色的背景场景...

有谁知道我如何实施新的 SKView class 来防止 CBApplicationDidBecomeActive() 错误的发生,以便游戏在激活时不会取消暂停?

非常感谢您! :)

我认为更好的方法不是暂停整个场景,而是在 GameScene 中创建一个 worldNode 并将所有需要暂停的精灵添加到该 worldNode。它更好,因为如果你暂停场景,你不能添加暂停菜单节点或使用触摸开始等。它基本上让你更灵活地暂停一个节点而不是整个场景。

首先创建世界节点(如果需要的话,创建全局属性)

 let worldNode = SKNode()
 addChild(worldNode)

然后将所有需要暂停的精灵添加到 worldNode

 worldNode.addChild(sprite1)
 worldNode.addChild(sprite2)

为您的不同游戏状态创建枚举

enum GameState {
    case Playing
    case Paused
    case GameOver
    static var current = GameState.Playing
}

比起在你的游戏场景中做一个暂停功能

 func pause() {
     GameState.current = .Paused
     //self.physicsWorld.speed = 0 // in update
     //worldNode.paused = true     // in update

     // show pause menu etc
 }

并像上面那样使用 NSNotification 调用它,甚至更好地使用委托。

比起从 gameViewController 暂停场景并暂停整个场景,我更喜欢这种方法。

创建简历方法

 func resume() {
        GameState.current = .Playing
        self.physicsWorld.speed = 1
        worldNode.paused = false  

        // remove pause menu etc
 }

最后将其添加到您的更新方法中

override func update(currentTime: CFTimeInterval) {

  if GameState.current == .Paused { 
      self.physicsWorld.speed = 0
      worldNode.paused = true
}

Spritekit 有时会在应用再次激活或应用内购买等警告消失时恢复游戏。为了避免这种情况,我总是将实际暂停游戏的代码放在更新方法中。

希望这对您有所帮助。