Ich würde wahrscheinlich tun es wie folgt statt
ich eine Unterklasse von Clouds hinzugefügt haben, Ihnen zu zeigen, wie sie ihre Timer durch die Aktualisierung der Szene betroffen ist, es rollt nur Wolken über die Szene an in einem gleichmäßigen Tempo unabhängig von der Geräteleistung
private var lastUpdateTime: TimeInterval = 0.0
override func update(_ currentTime: TimeInterval) {
//check if game is actually playing, don't want to update time if game is paused
if lastUpdateTime == 0 || gameState != .playing {
lastUpdateTime = currentTime
return
}
let delta = currentTime - lastUpdateTime
if delta > 7 {
//this has now been 7 seconds so do something here
}
//reset timer
lastUpdateTime = currentTime
enumerateChildNodes(withName: "cloud*", using: { cloud, stop in
if let cloud = cloud as? Cloud {
cloud.update(delta: delta)
}
})
}
class Cloud: SKSpriteNode {
private var minY: CGFloat = 0
private var maxY: CGFloat = 0
private var cloudWidth: CGFloat = 0
private override init(texture: SKTexture?, color: UIColor, size: CGSize) {
super.init(texture: texture, color: color, size: size)
}
convenience init() {
let texture = SKTexture(image: #imageLiteral(resourceName: "cloud1"))
self.init(texture: texture, color: SKColor.white, size: texture.size())
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
func setup(type: CloudType) {
texture = type.texture
size = (texture?.size())!
setScale(2.0)
var midHeight = gameModel.gameHeight/2
if let anchorY = (self.parent as? SKScene)?.anchorPoint.y {
midHeight = gameModel.gameHeight * anchorY
}
self.minY = gameModel.gameHeight * 0.3 - midHeight
self.maxY = gameModel.gameHeight * 0.9 - midHeight
cloudWidth = self.size.width
let randomY = RandomFloatBetween(min: minY, max: maxY)
self.position = CGPoint(x: gameModel.gameWidth/2 + cloudWidth, y: randomY)
}
func update(delta: TimeInterval) {
let speedX = CGFloat(delta) * 90
self.position.x -= speedX
if self.position.x <= 0 - (gameModel.gameWidth/2 + cloudWidth) {
resetCloud()
}
}
private func resetCloud() {
self.position.x = gameModel.gameWidth/2 + cloudWidth
self.position.y = RandomFloatBetween(min: minY, max: maxY)
enabled = false
run(.wait(forDuration: 5, withRange: 3), completion: { self.enabled = true })
}
}
Warum verwenden Sie Timer? Müssen Sie wirklich Timer verwenden? vs. mit SpriteKit eingebauten Methode der Handhabung von Zeit in der Update-Funktion –
@RonMyschuk Ich habe eine Menge komplexer Aktionen in meinem Code. Deshalb hat die 'SpriteGroup' die Eigenschaft 'currentTime'. Ich muss in der Lage sein, jede Gruppe von Sprites zu überwachen und ihre Aktionen gelegentlich zu unterbrechen. Basierend darauf glaube ich, dass Timer für mich besser funktionieren würde. – Bane
Fair genug ... aber Sie haben keinen Grund aufgelistet, dass der eingebaute Update-Timer nicht funktionieren würde. Meine Philosophie ist, warum eine andere Reihe von Objekten einzuführen, wenn Sie bereits die Werkzeuge in der Szene laufen haben? Sie können auch diesen Link http://stackoverflow.com/questions/23978209/spritekit-creating-a-timer suchen –