2017-03-24 1 views
-2

Ich habe einen Timer in meinem Code unten eingestellt. Wie kann ich den Timer jedes Mal zurücksetzen, wenn er eine vorgegebene Dauer von 7 Sekunden erreicht?Wie kann ich den Timer nach einer bestimmten Zeit zurücksetzen?

class SpriteGroup { 
var sprites : [Sprite] 
var isVisible : Bool 
var startTime: TimeInterval = 0.0 
var currentTime: TimeInterval = 0.0 


init(sprites : [Sprite], isVisible: Bool, pos: CGPoint) { 
    self.sprites = sprites 
      ...  
    startTime = Date.timeIntervalSinceReferenceDate 
    Timer.scheduledTimer(timeInterval: 1, 
         target: self, 
         selector: #selector(self.advanceTimer(timer:)), 
         userInfo: nil, 
         repeats: true) 
} 

    func advanceTimer(timer: Timer) 
{ 
    currentTime = Date.timeIntervalSinceReferenceDate - startTime 
} 
+0

Warum verwenden Sie Timer? Müssen Sie wirklich Timer verwenden? vs. mit SpriteKit eingebauten Methode der Handhabung von Zeit in der Update-Funktion –

+0

@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

+1

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 –

Antwort

1

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 }) 
    } 
} 
+0

Wenn ich Sie gut verstehe, ist 'Cloud' vom Typ' SKSpriteNode', so dass Sie 'enumerateChildNodes (..)' in der Spiel Scene aber 'SpriteGroup' (wie oben gezeigt) ist nicht vom Typ' SKSpriteNode' wie werde ich das im Spiel Scene aktualisieren? – Bane

+0

Machen Sie es einfach zu einer Unterklasse von SKSpriteNode, es wird nicht weh tun –

+0

Wirklich, nachdem ich eine Unterklasse von SKSpriteNode gemacht habe, habe ich eine Reihe Fehler. Ich habe es geschafft, einige von ihnen zu lösen, aber derzeit bin ich mir nicht sicher, ob das gelöst werden soll. Ich habe 'super.init (Textur: SKTexture !, Farbe: UIColor, Größe: CGSize) hinzugefügt { super.init (Textur: Textur, Farbe: Farbe, Größe: Größe) } 'zu meinem init (in der Frage) dann habe ich den Fehler 'SKSpriteNode.init 'kann nicht mit einer Argumentliste vom Typ aufgerufen werden' (texture: SKTexture! .Type.color: UIColor.Type, size: CGSize.Type,() ->()) '' – Bane

Verwandte Themen