我的GameScene.swift中有一堆定时器可以调用函数。当用户点击或双击主页按钮,获取短信等时,如何暂停这些计时器?现在,当游戏运行时双击主页按钮时,基于计时器的分数会持续上升并且仍会产生敌人。
//Spawn timer for enemy blocks
var timer = NSTimer.scheduledTimerWithTimeInterval(0.4, target: self, selector: Selector("spawnEnemies"), userInfo: nil, repeats: true)
//Timer for keeping score
var scoretimer = NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: Selector("scoreCounter"), userInfo: nil, repeats: true)
非常感谢任何帮助!
编辑: 我将这两行添加到我的GameViewController.swift
中NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("pauseTimers:"), name:UIApplicationWillResignActiveNotification, object: nil)
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("startTimers:"), name:UIApplicationDidBecomeActiveNotification, object: nil)
然后是这两个功能:
func pauseTimers(notification : NSNotification) {
println("Observer method called")
timer.invalidate()
scoretimer.invalidate()
}
func startTimers(notification : NSNotification) {
println("Observer method called")
timer = NSTimer.scheduledTimerWithTimeInterval(0.4, target: self, selector: Selector("spawnEnemies"), userInfo: nil, repeats: true)
scoretimer = NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: Selector("scoreCounter"), userInfo: nil, repeats: true)
}
但是,我收到一个错误,因为当我在startTimers中重新创建计时器时,它们的选择器是我的GameScene.swift中的函数,而不是GameViewController.swift。我该如何解决这个问题?
答案 0 :(得分:3)
您可以通过调用invalidate()
来停止计时器。虽然无效的计时器永远不会再次运行,但如果您希望它再次触发,您需要稍后重新创建它。
要检测您的应用何时进入后台或被中断以及何时返回前台,您可以收听这些通知:
UIApplicationDidBecomeActiveNotification
UIApplicationWillResignActiveNotification
UIApplicationDidEnterBackgroundNotification
UIApplicationWillEnterForegroundNotification
应用程序在被覆盖时“重新启动”,例如因为有来电或是因为通知中心/控制中心已打开。一个应用程序进入后台,当另一个应用程序进入前台或显示主屏幕时(这在技术上也是一个应用程序)。
<强> @Update 强>
问题是计时器的目标是self
,当您在GameViewController
时,self
是GameViewController
个实例。您需要在GameScene
内重新创建计时器,或者您需要将引用传递给GameScene
实例而不是self
作为目标。 选择器是被调用的方法,目标是调用该方法的对象,self
始终是当前对象。
BTW可以在任何课程中同时收听这些通知,也可以同时在多个班级中收听。