应用程序激活后保持游戏暂停?
Posted
技术标签:
【中文标题】应用程序激活后保持游戏暂停?【英文标题】:Keeping the game paused after app become active? 【发布时间】:2016-04-10 07:41:18 【问题描述】:这是我在这个论坛上的第一篇文章,如果我做的事情不正确,我提前道歉! :)
我正在使用 Swift 和 SpriteKit 制作 iphone 游戏,但我目前遇到了问题。当我的应用程序进入后台时,它会调用一个函数 pause(参见下文),但在游戏恢复时它会自动取消暂停。
我看过这个非常有趣的帖子: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】:我认为更好的方法不是暂停整个场景,而是可以在 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 有时会在应用再次激活时或当应用内购买等警报消失时恢复游戏。为了避免这种情况,我总是将代码实际暂停在更新方法中。
希望这会有所帮助。
【讨论】:
感谢您的回答!我使用了一个布尔值,并在调用暂停函数时将其设置为 true,并且当应用程序再次变为活动状态时,我将其放入我的场景更新函数if Pausing==true && self.paused==falseself.paused=true
中,因此游戏重新暂停。暂停世界节点对我来说是个问题,因为它也不会停止物理,所以当世界节点停止时我的角色就会倒下!:)
很高兴它有帮助。我只是更新了答案,如果你想使用 worldNode 并暂停物理,你需要设置physicsWorld.speed = 0。这样你的人就不会失败。我之前忘记了这个。快乐编码
嗨,同样的问题!我尝试了一个 worldNode 解决方案 - 但现在我无法接触到工作! :(
我接触到了工作......但是..猜猜看..当我退出应用程序回到游戏时,事情仍然没有暂停..我无法理解它?!
所以..我调用一个通知来运行 pauseGame()以上是关于应用程序激活后保持游戏暂停?的主要内容,如果未能解决你的问题,请参考以下文章
Spritekit - 在 didBecomeActive 时保持游戏暂停
当用户切换选项卡时,如何允许 Easeljs Tickers 保持活动状态
使用物理 SKSpriteNode 子级暂停 SpriteKit 游戏