拳击计数/延迟/定时器

Boxing Count-up / delay / timer

我创建了一个拳击模拟,现在要回去添加动画。现在,我加一个"Ref's Countup"来增加悬念。我尝试了很多东西,但 none 得到了我想要的。我尝试了:

Thread.sleep(forTimeInterval: 1)
knockdownNumber.text = "\(knockdownNumberInt)"

sleep(1)
knockdownNumber.text = "\(knockdownNumberInt)"

那些暂停了 UI。所以他们确实等待了适当的时间,但没有更改我的文本。 然后是这些都只计算一次(即 1、3 或 1、8)。

DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
        self.knockdownNumber.text = "\(self.knockdownNumberInt)"
    }

let timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: false) { (timer) in
        self.knockdownNumber.text = "\(self.knockdownNumberInt)"
    }

 delay(1) {
        self.knockdownNumber.text = "\(self.knockdownNumberInt)"
    }

延时函数为

 func delay(_ delay:Double, closure:@escaping ()->()) {
    DispatchQueue.main.asyncAfter(
        deadline: DispatchTime.now() + Double(Int64(delay * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC), execute: closure)
}

我调用函数的方式(这些都在里面)是在他被击倒之后。这段代码看起来像这样。

knockdownNumber.text = "1"
    knockdownNumberInt = 1
    downSec()
    knockdownNumberInt = knockdownNumberInt + 1
    downSec()
    knockdownNumberInt = knockdownNumberInt + 1
    downSec()
    if fighter2.endurance < 400 {
        knockdownNumberInt = knockdownNumberInt + 1
        downSec()
    }
    if fighter2.endurance < 300 {
        knockdownNumberInt = knockdownNumberInt + 1
        downSec()
    }
    if fighter2.endurance < 200 {
        knockdownNumberInt = knockdownNumberInt + 1
        downSec()
    }
    if fighter2.endurance < 100 {
        knockdownNumberInt = knockdownNumberInt + 1
        downSec()
    }
    if fighter2.endurance < 0 {
        knockdownNumberInt = knockdownNumberInt + 1
        downSec()
    }
    if fighter2.endurance < -100 {
        knockdownNumberInt = knockdownNumberInt + 1
        downSec()
    }

我真的被难住了。

采用这种方法您就快完成了:

let timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: false) { (timer) in
    self.knockdownNumber.text = "\(self.knockdownNumberInt)"
}

您需要做的就是将 repeats 设置为 true,计时器将永远重复。

现在我们需要决定何时停止计时器。我们甚至应该在启动计时器之前就决定这一点,而不是做你所做的 - 在开始新时间时递减 knockdownNumberInt。这不起作用,因为您放入计时器闭包中的内容是异步的。

所以我们决定要数到的数字:

knockdownNumber.text = "1"
knockdownNumberInt = 3
if fighter2.endurance < 400 {
    knockdownNumberInt += 1 // use the "+=" to make it cleaner!
}
if fighter2.endurance < 300 {
    knockdownNumberInt += 1
}
if fighter2.endurance < 200 {
    knockdownNumberInt += 1
}
if fighter2.endurance < 100 {
    knockdownNumberInt += 1
}
if fighter2.endurance < 0 {
    knockdownNumberInt += 1
}
if fighter2.endurance < -100 {
    knockdownNumberInt += 1
}

在 class 中声明一个名为 currentCountDown 的 属性:

var currentCountDown = 1

然后你可以像这样创建你的计时器:

let timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { [weak self] (timer) in
    guard let `self` = self else { // I added this to prevent a retain cycle.
         timer.invalidate()
         return
    }
    self.currentCountDown += 1
    self.knockdownNumber.text = "\(self.currentCountDown)"
    if self.currentCountDown == self.knockdownNumberInt {
        timer.invalidate()
    }
}