尝试让NSTimers在被解雇时快速同步

时间:2016-01-10 12:26:03

标签: swift nstimer

我正在尝试创建一个游戏,用户必须通过平台中的间隙(称为倒下)来导航球。当分数达到某一点时,移动平台以更快的速度创建。为此,我编写了以下代码:

switch String(level) {

                        case "1" :
                            beginLevel.invalidate()
                            level1 = NSTimer.scheduledTimerWithTimeInterval( 0.9 , target: self, selector: Selector("platformCreation"), userInfo: nil , repeats: true)

                        case "2" :
                            level1.invalidate()
                            level2 = NSTimer.scheduledTimerWithTimeInterval( 0.8 , target: self, selector: Selector("platformCreation"), userInfo: nil , repeats: true)

                        case "3" :
                            level2.invalidate()
                            level3 = NSTimer.scheduledTimerWithTimeInterval( 0.7 , target: self, selector: Selector("platformCreation"), userInfo: nil , repeats: true)

                        case "4" :
                            level3.invalidate()
                            level4 = NSTimer.scheduledTimerWithTimeInterval( 0.6 , target: self, selector: Selector("platformCreation"), userInfo: nil , repeats: true)

                        default :
                           print("invalid level")
                        }

每当游戏重新启动时都会运行beginLevel,级别只能是1到4。

我遇到的问题是,一旦前一个NSTimer无效,在新的触发器被触发之前会有一个没有平台的延迟。这些延迟使得游戏过于简单,老实说它看起来也很难看!我想要实现的是平台的不断流动,平台之间没有巨大的差距。您可以为此问题提供的任何内容都非常感谢。

2 个答案:

答案 0 :(得分:0)

一种可能的解决方案是在适当的延迟后使旧计时器无效。

let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(0.5 * Double(NSEC_PER_SEC)))
dispatch_after(delayTime, dispatch_get_main_queue()) {
    self.level1.invalidate()
}

答案 1 :(得分:0)

一种解决方案是在初始化定时器后立即使用call fire()方法,如下所示

level3 = NSTimer.scheduledTimerWithTimeInterval( 0.7 , target: self, selector: Selector("platformCreation"), userInfo: nil , repeats: true);
level.fire()