【问题标题】:Pausing and Recreating timers with notifications issue Swift暂停和重新创建带有通知的计时器会发出 Swift
【发布时间】:2015-07-18 21:46:28
【问题描述】:

所以我有两个计时器,一个用来增加分数,一个用来生成敌人。我使用通知使计时器无效,然后我使用另一个通知来重新创建计时器。当我退出然后打开应用程序时,有两组敌人在彼此之上生成。我认为 timerRecreate = true 并且 GameScene 中的常规计时器也被调用。

GameViewController.swift 文件:

class GameViewController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()

    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")
    timerRecreate = true
}

GameScene.swift 中的计时器代码

override func didMoveToView(view: SKView) {
    //Spawn timer for enemy blocks
    timer = NSTimer.scheduledTimerWithTimeInterval(0.4, target: self, selector: Selector("spawnEnemies"), userInfo: nil, repeats: true)

    //Timer for keeping score
    scoretimer = NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: Selector("scoreCounter"), userInfo: nil, repeats: true)
}

override func update(currentTime: CFTimeInterval) {
    /* Called before each frame is rendered */

    if timerRecreate == true {
        //Spawn timer for enemy blocks
        timer = NSTimer.scheduledTimerWithTimeInterval(0.4, target: self, selector: Selector("spawnEnemies"), userInfo: nil, repeats: true)

        //Timer for keeping score
        scoretimer = NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: Selector("scoreCounter"), userInfo: nil, repeats: true)
        timerRecreate = false
    }
    }

我认为问题在于您最初打开应用程序时,无论是退出应用程序还是第一次打开应用程序后,timerRecreate 设置为 true 以及块的常规生成,因此生成了两组块同时。我该如何解决这个问题?

【问题讨论】:

  • 您正在将目标设置为 GameScene 的新实例 - 这应该是 self,并且通知方法也应该在 GameScene 中。
  • 每次你调用GameScene(),你都在创建一个新对象。您可能在某处有GameScene 对象,然后您的得分计时器触发另一个GameScene 对象,敌人时间触发另一个GameScene 对象,...您应该创建一次GameScene 对象,然后重用它 - 单例, GameViewController 的财产,...
  • 你启动过计时器吗?
  • 好的,现在编辑我的代码。
  • @JoshHamet NSTimer.scheduledTimerWithTimeInterval 自动启动计时器,只需阅读文档...

标签: ios xcode swift timer nstimer


【解决方案1】:

修好了!希望……

无论如何,这就是我所做的。我创建了另一个名为 timerz 的布尔值,并在发出 DidBecomeActive 通知时将其设置为 false。同时,timeRecreate 设置为 true。这保证了两个计时器集不会同时运行。在关于 timRecreate 是否为 true 的 if 语句中的更新函数中,我将 timeRecreate 设置为 false 并将 timerz 设置为 true。所以计时器被重新创建,然后它切换回产生它们的旧方式。我还将这种产生它们的旧方法放在关于 timerz 是真还是假的 if 语句中。

【讨论】:

    猜你喜欢
    • 2015-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-04
    • 1970-01-01
    相关资源
    最近更新 更多