我正在使用代表球的SKspritenode。我正忙着做的是我希望球在每个时间间隔后改变颜色。
override func update(_ currentTime: TimeInterval) {
ball.color = UIcolor.random()
}
我说代码可以很好地改变颜色。然而问题是每个帧的颜色变化比我计划的颜色变化要快得多,就像每2秒一样。
我对这个问题的解决方法列在下面
var relative = 300
var Time = 0 {
didSet {
if Time == relative {
ball.color = UIColor.random()
}
}
}
override func update(_ currentTime: TimeInterval) {
PT.run(SKAction.moveTo(x: ball.position.x, duration: 0.5))
Time += 1
if Time == relative {
Time = 0
}
}
因此,此代码旨在每次更改颜色== 300.而每次更新值时间。然后,当达到300
时,Time值将重置= 0这样我可以在几秒钟之后而不是每一帧都改变颜色。
这种设计可能看起来很便宜且没有经验的编码方式和设置运行的功能。这就是为什么我要求任何有经验的程序员帮助我建立一个更好的方法来设计这个逻辑。我对函数及其工作方式都很陌生,所以如果你们中的任何人能够学习如何编写一个可运行的或自包含的函数,而不依赖于Swift内置函数"喜欢"覆盖功能更新"
答案 0 :(得分:0)
您可以使用简单的模数
if currentTime % 300 == 0 { ball.color = UIColor.random() }
答案 1 :(得分:0)
如果您想要在特定时间内更改某些内容,您可以先计算增量时间,然后将其相加以创建"实时"计时器。增量时间是自上次调用更新方法以来经过的时间,它是更新实体和组件的常用方法。
值超过例如1000ms后,只需调用随机颜色功能并重置计时器。
//prevent from starting with a 0 time interval by using optional
var lastUpdateTimeInterval: CFTimeInterval?
var timer: CFTimeInterval = 0.0
override func update(_ currentTime: TimeInterval) {
var delta: CFTimeInterval = 0.0
if let luti = lastUpdateTimeInterval {
delta = currentTime - luti
}
//use delta for update logic like entitys.update(delta)
timer += delta
if timer > 1 { //after 1s
ball.color = UIColor.random()
timer = 0.0 //reset timer
}
lastUpdateTimeInterval = currentTime
}