SpriteKit - 暂停屏幕在 diBecomeActive 时不显示
SpriteKit - Pause screen doesn't show when didBecomeActive
我的暂停系统在游戏中运行良好,而且当应用程序移动到后台然后再次激活时游戏保持暂停状态,但我现在的问题是当它激活时我的暂停屏幕不显示.
AppDelegate:
func applicationDidBecomeActive(application: UIApplication) {
NSNotificationCenter.defaultCenter().postNotificationName("Pause", object: nil)
}
ViewController:
override func viewDidLoad() {
super.viewDidLoad()
let scene = GameScene()
// Configure the view.
let skView = self.view as! MainView
NSNotificationCenter.defaultCenter().addObserver(skView, selector: "setStayPaused", name: "Pause", object: nil)
skView.ignoresSiblingOrder = true
scene.scaleMode = .AspectFill
scene.size = skView.bounds.size
skView.presentScene(scene)
}
MainView(我的自定义skView):
class MainView: SKView {
var stayPaused = false as Bool
override var paused: Bool {
get {
return super.paused
}
set {
if (!stayPaused) {
super.paused = newValue
}
stayPaused = false
}
}
func setStayPaused() {
if (super.paused) {
self.stayPaused = true
}
}
}
游戏场景:
override func didMoveToView(view: SKView) {
NSNotificationCenter.defaultCenter().addObserver(self, selector: "pauseGame", name: "Pause", object: nil)
}
func pauseGame() {
if isFirstTime == false { // to make sure that the app did not just get launched
pauseScreen.hidden = false // doesn't show
pauseButton.hidden = false // doesn't show
view?.paused = true
scene?.paused = true
}
}
设置暂停屏幕和按钮的隐藏 属性 无效,因为视图 and/or 场景已暂停。您需要暂时取消暂停视图,将隐藏属性设置为 false,return 主循环,然后重新暂停视图。这是一个如何做到这一点的例子。
AppDelegate:
func applicationWillResignActive(application: UIApplication) {
NSNotificationCenter.defaultCenter().postNotificationName("PauseViewNotification", object:nil)
}
func applicationDidBecomeActive(application: UIApplication) {
NSNotificationCenter.defaultCenter().postNotificationName("ShowPauseScreenNotification", object:nil)
}
MainVew(SKView 子类):
class MainView: SKView {
override var paused: Bool {
get {
return super.paused
}
set {
}
}
func pause() {
super.paused = true
}
func resume() {
super.paused = false
}
func togglePause() {
super.paused = !super.paused
}
}
ViewController:
override func viewDidLoad() {
super.viewDidLoad()
if let scene = GameScene(fileNamed:"GameScene") {
// Configure the view.
let skView = self.view as! MainView
NSNotificationCenter.defaultCenter().addObserver(skView, selector:Selector("pause"), name: "PauseViewNotification", object: nil)
}
}
游戏场景:
override func didMoveToView(view: SKView) {
NSNotificationCenter.defaultCenter().addObserver(self, selector:Selector("pauseGame"), name: "ShowPauseScreenNotification", object: nil)
}
func pauseGame() {
if (!isFirstTime) {
pauseScreen.hidden = false
pauseButton.hidden = false
// Un-pause the view so the screen and button appear
if let customView = self.view as? MainView {
customView.resume()
}
// Re-pause the view after returning to the main loop
let pauseAction = SKAction.runBlock({
[weak self] in
if let customView = self?.view as? MainView {
customView.pause()
}
})
runAction(pauseAction)
}
isFirstTime = false
}
您可以使用
在暂停状态之间切换
if let customView = self.view as? MyView {
customView.togglePause()
}
我的暂停系统在游戏中运行良好,而且当应用程序移动到后台然后再次激活时游戏保持暂停状态,但我现在的问题是当它激活时我的暂停屏幕不显示.
AppDelegate:
func applicationDidBecomeActive(application: UIApplication) {
NSNotificationCenter.defaultCenter().postNotificationName("Pause", object: nil)
}
ViewController:
override func viewDidLoad() {
super.viewDidLoad()
let scene = GameScene()
// Configure the view.
let skView = self.view as! MainView
NSNotificationCenter.defaultCenter().addObserver(skView, selector: "setStayPaused", name: "Pause", object: nil)
skView.ignoresSiblingOrder = true
scene.scaleMode = .AspectFill
scene.size = skView.bounds.size
skView.presentScene(scene)
}
MainView(我的自定义skView):
class MainView: SKView {
var stayPaused = false as Bool
override var paused: Bool {
get {
return super.paused
}
set {
if (!stayPaused) {
super.paused = newValue
}
stayPaused = false
}
}
func setStayPaused() {
if (super.paused) {
self.stayPaused = true
}
}
}
游戏场景:
override func didMoveToView(view: SKView) {
NSNotificationCenter.defaultCenter().addObserver(self, selector: "pauseGame", name: "Pause", object: nil)
}
func pauseGame() {
if isFirstTime == false { // to make sure that the app did not just get launched
pauseScreen.hidden = false // doesn't show
pauseButton.hidden = false // doesn't show
view?.paused = true
scene?.paused = true
}
}
设置暂停屏幕和按钮的隐藏 属性 无效,因为视图 and/or 场景已暂停。您需要暂时取消暂停视图,将隐藏属性设置为 false,return 主循环,然后重新暂停视图。这是一个如何做到这一点的例子。
AppDelegate:
func applicationWillResignActive(application: UIApplication) {
NSNotificationCenter.defaultCenter().postNotificationName("PauseViewNotification", object:nil)
}
func applicationDidBecomeActive(application: UIApplication) {
NSNotificationCenter.defaultCenter().postNotificationName("ShowPauseScreenNotification", object:nil)
}
MainVew(SKView 子类):
class MainView: SKView {
override var paused: Bool {
get {
return super.paused
}
set {
}
}
func pause() {
super.paused = true
}
func resume() {
super.paused = false
}
func togglePause() {
super.paused = !super.paused
}
}
ViewController:
override func viewDidLoad() {
super.viewDidLoad()
if let scene = GameScene(fileNamed:"GameScene") {
// Configure the view.
let skView = self.view as! MainView
NSNotificationCenter.defaultCenter().addObserver(skView, selector:Selector("pause"), name: "PauseViewNotification", object: nil)
}
}
游戏场景:
override func didMoveToView(view: SKView) {
NSNotificationCenter.defaultCenter().addObserver(self, selector:Selector("pauseGame"), name: "ShowPauseScreenNotification", object: nil)
}
func pauseGame() {
if (!isFirstTime) {
pauseScreen.hidden = false
pauseButton.hidden = false
// Un-pause the view so the screen and button appear
if let customView = self.view as? MainView {
customView.resume()
}
// Re-pause the view after returning to the main loop
let pauseAction = SKAction.runBlock({
[weak self] in
if let customView = self?.view as? MainView {
customView.pause()
}
})
runAction(pauseAction)
}
isFirstTime = false
}
您可以使用
在暂停状态之间切换if let customView = self.view as? MyView {
customView.togglePause()
}