Поддерживать игру в приостановленном состоянии после активации приложения?
Это мой первый пост на этом форуме, и я заранее прошу прощения, если я что-то делаю не так!:)
Я делаю игру для 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 иногда имеет тенденцию возобновлять игру, когда приложение снова становится активным или когда оповещение, например, о покупках приложения, отклоняется. Чтобы избежать этого, я всегда помещаю код, чтобы фактически приостановить игру в методе обновления.
Надеюсь это поможет.