拳击计数/延迟/定时器
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()
}
}
我创建了一个拳击模拟,现在要回去添加动画。现在,我加一个"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()
}
}