Поддерживать игру в приостановленном состоянии после активации приложения?

Это мой первый пост на этом форуме, и я заранее прошу прощения, если я что-то делаю не так!:)

Я делаю игру для iphone с помощью Swift & SpriteKit, и в настоящее время я столкнулся с проблемой. Когда мое приложение переходит в фоновый режим, оно вызывает функцию pause (см. Ниже), но оно автоматически прерывается, когда игра возобновляется.

Я видел этот очень интересный пост: Spritekit - держите игру в режиме паузы, когда didBecomeActiveкак сохранить сцену SpriteKit, когда приложение становится активным?), Но я застрял.

Я не знаю, как реализовать новый класс 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 ответ

Решение

Я думаю, что лучше вместо того, чтобы останавливать всю сцену, вы можете создать worldNode в вашей GameScene и добавить все спрайты, которые должны быть приостановлены в этом worldNode. Это лучше, потому что, если вы ставите сцену на паузу, вы не можете добавить узлы меню паузы или использовать прикосновения, начатые и т. Д. Это в основном дает вам больше гибкости, делая паузу в узле, а не на всей сцене.

Сначала создайте мировой узел (при необходимости создайте глобальное свойство)

 let worldNode = SKNode()
 addChild(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 иногда имеет тенденцию возобновлять игру, когда приложение снова становится активным или когда оповещение, например, о покупках приложения, отклоняется. Чтобы избежать этого, я всегда помещаю код, чтобы фактически приостановить игру в методе обновления.

Надеюсь это поможет.

Другие вопросы по тегам