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

时间:2016-01-06 09:13:41

标签: swift skview pause gamecontroller

这是我在这个论坛上的第一篇文章,如果我做的事情做得不对,我会提前道歉! :)

我正在使用Swift& amp; SpriteKit和我目前正面临一个问题。当我的应用程序进入后台时,它会调用一个函数暂停(参见下文),但会在游戏恢复时自动取消暂停。

我看过这篇非常有趣的帖子:Spritekit - Keep the game paused when didBecomeActive(和How to keep SpriteKit scene paused when app becomes active?)但我被卡住了。

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

这就是我的应用程序的工作方式:

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 GameSceneView : SKView {      
    func CBApplicationDidBecomeActive() {
    }
}

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

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

非常感谢您提前! :)

1 个答案:

答案 0 :(得分:0)

我认为更好的方法是暂停整个场景,而不是在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有时会恢复游戏。为了避免这种情况,我总是把代码放在更新方法中实际暂停游戏。

希望这会有所帮助。