我有计划的计时器,可以将精灵节点作为障碍添加到屏幕上
func timers(){
personTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(spawnPerson), userInfo: nil, repeats: true)
bikeTimer = Timer.scheduledTimer(timeInterval: 2, target: self, selector: #selector(spawnBike), userInfo: nil, repeats: true)
motorcycleTimer = Timer.scheduledTimer(timeInterval: 2.5, target: self, selector: #selector(spawnMotorcycle), userInfo: nil, repeats: true)
}
我添加了一个使计时器无效的功能。以便可以运行奖金"级别"。
func invalidateTimers(){
// Obstacles
personTimer.invalidate()
bikeTimer.invalidate()
motorcycleTimer.invalidate()
}
当奖金被称为时
func bonus() {
invalidateTimers()
bonusTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(spawnDiamonds), userInfo: nil, repeats: true)
}
我遇到的问题是,当奖金运行完毕时,我会使bonusTimer和recall timers((无效。但当我这样做的时候,函数中的所有计时器似乎都启动了两次。有什么简单的解决方法,因为它们不能只是暂停。
与其使用计时器,不如考虑使用SKActions,因为它们可以很好地与SpriteKit配合使用。要启动计时器,请运行:
let wait1 = SKAction.wait(forDuration: 1)
let personTimer = SKAction.repeatForever(SKAction.sequence([wait1, SKAction.run {
spawnPerson() // spawnBike() etc. for each different timer
}]))
self.run(personTimer, withKey: "spawnPerson")
具有修改的等待值和针对每个不同定时器的函数调用。然后要停止计时器,请运行:
self.removeAction(forKey: "spawnPerson")
每个动作使用不同的键。
您可以使用SKScene
子类的update:
方法,而不是使用计时器。它每帧调用一次,并具有currentTime
参数。因此,您可以轻松计算所需的时间间隔,并触发相应的方法。