在应用程序激活后保持游戏暂停?
Keeping the game paused after app become active?
这是我第一次 post 在这个论坛上,如果我做的事情不正确,我提前道歉! :)
我正在使用 Swift 和 SpriteKit 制作一个 iphone 游戏,我目前遇到了一个问题。当我的应用程序进入后台时,它会调用暂停功能(参见下文),但当游戏恢复时它会自动取消暂停。
我看到这个非常有趣 post : Spritekit - Keep the game paused when didBecomeActive (and How to keep SpriteKit scene paused when app becomes active?) 但我卡住了。
我不知道如何实现新的 SKView class,因为我的视图配置如下面的代码所示...
我的应用程序是这样工作的:
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 即:
class GameSceneView : SKView {
func CBApplicationDidBecomeActive() {
}
}
然后,我尝试将我的视图设置为 let SkView = view as! GameSceneView
,但我收到一条错误消息,提示我无法将视图转换为 MyProjectName.GameSceneView()...
我还尝试了以下方法:let SkView! = GameSceneView() as GameSceneView!
但我最终得到了一个灰色的背景场景...
有谁知道我如何实施新的 SKView class 来防止 CBApplicationDidBecomeActive() 错误的发生,以便游戏在激活时不会取消暂停?
非常感谢您! :)
我认为更好的方法不是暂停整个场景,而是在 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 有时会在应用再次激活或应用内购买等警告消失时恢复游戏。为了避免这种情况,我总是将实际暂停游戏的代码放在更新方法中。
希望这对您有所帮助。
这是我第一次 post 在这个论坛上,如果我做的事情不正确,我提前道歉! :)
我正在使用 Swift 和 SpriteKit 制作一个 iphone 游戏,我目前遇到了一个问题。当我的应用程序进入后台时,它会调用暂停功能(参见下文),但当游戏恢复时它会自动取消暂停。
我看到这个非常有趣 post : Spritekit - Keep the game paused when didBecomeActive (and How to keep SpriteKit scene paused when app becomes active?) 但我卡住了。
我不知道如何实现新的 SKView class,因为我的视图配置如下面的代码所示...
我的应用程序是这样工作的:
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 即:
class GameSceneView : SKView {
func CBApplicationDidBecomeActive() {
}
}
然后,我尝试将我的视图设置为 let SkView = view as! GameSceneView
,但我收到一条错误消息,提示我无法将视图转换为 MyProjectName.GameSceneView()...
我还尝试了以下方法:let SkView! = GameSceneView() as GameSceneView!
但我最终得到了一个灰色的背景场景...
有谁知道我如何实施新的 SKView class 来防止 CBApplicationDidBecomeActive() 错误的发生,以便游戏在激活时不会取消暂停?
非常感谢您! :)
我认为更好的方法不是暂停整个场景,而是在 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 有时会在应用再次激活或应用内购买等警告消失时恢复游戏。为了避免这种情况,我总是将实际暂停游戏的代码放在更新方法中。
希望这对您有所帮助。