这是我在这个论坛上的第一篇文章,如果我做的事情做得不对,我会提前道歉! :)
我正在使用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()错误发生,以便游戏在激活时不会取消暂停?
非常感谢您提前! :)
答案 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有时会恢复游戏。为了避免这种情况,我总是把代码放在更新方法中实际暂停游戏。
希望这会有所帮助。