随时间间隔生成随机颜色
问题描述:
我正在使用代表球的SKspritenode。我正忙着做的是我想要球在每个时间间隔后改变颜色。随时间间隔生成随机颜色
override func update(_ currentTime: TimeInterval) {
ball.color = UIcolor.random()
}
我想说,代码的作品足以改变颜色。但问题在于每个Frame女巫的颜色变化比我计划的颜色变化要快得多,就像每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而值时间是每帧更新。那么时间值会重置= 0时,它达到300
这样我可以改变后,秒而不是每一帧的颜色。
这种设计可能看起来便宜且没有经验的编码和设置功能的运行方式。这就是为什么我要求任何有经验的程序员帮助我构建一个更好的方法来设计这个逻辑。我对功能和工作原理都很陌生,所以如果你们中的任何一位能够学习如何编写一个可运行的或者自带功能的代码,而不依赖于像“Override function Update”这样的“Swift内置功能”,
答
你可以使用一个简单的模数 if currentTime % 300 == 0 { ball.color = UIColor.random() }
答
如果你想改变的东西有一个特定的时间,你可以计算出增量时间第一和总和,为了创造一个“实时”定时器。增量时间是自上次调用更新方法以来所经历的时间,它是更新实体和组件的常用方法。
在值超过例如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
}
没有工作。我猜它是因为计时器没有被分配任何值 – user3211359
@ user3211359'var timer:CFTimeInterval = 0.0'是一个赋值,'timer + = delta'的确将增量添加到它。如果你没有增量时间,你不会正确传递当前时间。 – BennX
我确实分配了定时器。问题是,计时器看起来有点像这样 0.0166666669974802 - luti 26790.488545286 - delta – user3211359