2016-11-09 4 views
0

Ich arbeite an einem Spiel, in dem Knoten kontinuierlich den Bildschirm nach unten scrollen. Ich habe sie an einer bestimmten Position zum Laichen einrichten und alles sieht auch:Wie platziere ich SKSpriteNodes?

Iphone screen with game playing

Das Problem tritt auf, wenn der Benutzer das Spiel wiederholt Pausen, die Knoten falsch ausgerichtet bekommen so:

iphone screen with game playing

Ich glaube, wenn ich das Spiel pausiere, wird mein Timing abgeworfen. Hier sind meine updateCurrentTime() Funktionen. Ich habe es so eingestellt, dass es alle 0,6 Sekunden eine neue zufällige Reihe hinzufügt.

func updateWithTimeSinceLastUpdate (_ timeSinceLastUpdate:CFTimeInterval) { 
    lastYieldTimeInterval += timeSinceLastUpdate 
    if lastYieldTimeInterval > 0.6 { 
     lastYieldTimeInterval = 0 
     addRandomRow() 
    } 
} 


override func update(_ currentTime: TimeInterval) { 
    if screenIsPaused == 1{ 
     pauseScreen() 
    }else if screenIsPaused == 0{ 
    unPauseScreen() 
     screenIsPaused = 2 
    } else if screenIsPaused == 3{ 
     gameLayer.isPaused = true 
    } 

    var timeSinceLastUpdate = currentTime - lastUpdateTimeInterval 
    lastUpdateTimeInterval = currentTime 

    if timeSinceLastUpdate > 1 { 
     timeSinceLastUpdate = 1/60 
     lastUpdateTimeInterval = currentTime 
    } 
    updateWithTimeSinceLastUpdate(timeSinceLastUpdate) 
} 

Hier ist der Code, den ich mein Spiel pausieren:

func pauseScreen(){ 
    overlay.color = UIColor.black 
    overlay.alpha = 0.6 
    overlay.size.height = self.size.height 
    overlay.size.width = self.size.width 
    overlay.position = CGPoint(x: self.frame.width/2, y: self.frame.height/2) 
    overlay.zPosition = 100 
     addChild(overlay) 
gameLayer.isPaused = true 
    screenIsPaused = 3 

    label.text = "Press screen to play!" 
    label.fontColor = SKColor.white 
    label.fontSize = 50 
    label.position = CGPoint(x: self.size.width/2, y: self.size.height/2) 
    addChild(label) 
    let Fade = SKAction.sequence([SKAction.fadeIn(withDuration: 1), SKAction.fadeOut(withDuration: 1)]) 
    label.run(SKAction.repeatForever(Fade)) 
} 

func unPauseScreen(){ 
    label.removeFromParent() 
    overlay.removeFromParent() 
    screenIsPaused = 2 

gameLayer.isPaused = false }

Die Pause-Funktion in touchesEnded() und der un-Pause-Funktion in touchesBegan aufgerufen wird aufgerufen .

Bitte lassen Sie mich wissen, wenn es etwas gibt, was ich versuchen kann oder wenn Sie weitere Informationen benötigen. Vielen Dank!

Antwort

0

Ich habe endlich eine Lösung gefunden. Ich bin mir nicht sicher, ob es die beste Antwort ist; Es funktioniert jedoch. Ich änderte meine Funktion updateWithTimeSinceLastUpdate hier ist es jetzt:

func updateWithTimeSinceLastUpdate (_ timeSinceLastUpdate:CFTimeInterval) { 
    if lastYieldTimeInterval > 0.6 { 

     lastYieldTimeInterval = 0 
     addRandomRow() 
    } 

     if screenIsPaused == 1{ 
      pauseScreen() 
      lastYieldTimeInterval += timeSinceLastUpdate 
     }else if screenIsPaused == 0{ 
      unPauseScreen() 
      lastYieldTimeInterval += timeSinceLastUpdate 
      screenIsPaused = 2 
     } else if screenIsPaused == 3{ 
      gameLayer.isPaused = true 
     }else if screenIsPaused == 2{ 
      lastYieldTimeInterval += timeSinceLastUpdate 
     } 
} 

ich, dass screenIsPaused bewegt, wenn Aussagen hier statt meiner update(_ currentTime: TimeInterval). Zusätzlich fügte ich in jede if-Anweisung lastYieldTimeInterval += timeSinceLastUpdate hinzu. Jetzt wird jedes Mal, wenn das Spiel pausiert oder nicht pausiert, die Zeit aktualisiert.

Verwandte Themen