2017-01-15 4 views
1

Ich habe für Swift Apples Zustandsmaschine recherchiert und mehrere Beispiele gefunden, aber keines von ihnen wirklich tot einfach.Anfrage für ein einfaches Beispiel für GKStateMachine?

Könnte jemand in Swift eine super einfache GKStateMachine, vielleicht mit zwei Zuständen, erstellen, vorzugsweise alle in einer Swift-Datei? Vielen Dank!

Antwort

5

Hier ist ein Beispiel für eine Zustandsmaschine für eine Ampel, wie sie in den USA arbeiten. Eine Ampel bewegt sich von green -> yellow -> red -> green.

In einer App können Sie die didEnter(from:) Routinen eine Bildschirmgrafik aktualisieren, oder ermöglichen Sie einem anderen Akteur zu verschieben.

import UIKit 
import GameKit 

class Green: GKState { 

    override func isValidNextState(_ stateClass: AnyClass) -> Bool { 
     return stateClass is Yellow.Type 
    } 

    override func didEnter(from previousState: GKState?) { 
     print("Traffic light is green") 
    } 
} 

class Yellow: GKState { 
    override func isValidNextState(_ stateClass: AnyClass) -> Bool { 
     return stateClass is Red.Type 
    } 

    override func didEnter(from previousState: GKState?) { 
     print("Traffic light is yellow") 
    } 

} 

class Red: GKState { 
    override func isValidNextState(_ stateClass: AnyClass) -> Bool { 
     return stateClass is Green.Type 
    } 

    override func didEnter(from previousState: GKState?) { 
     print("Traffic light is red") 
    } 
} 

class ViewController: UIViewController { 

    var stateMachine: GKStateMachine? 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // Create the states    
     let green = Green() 
     let yellow = Yellow() 
     let red = Red() 

     // Initialize the state machine    
     stateMachine = GKStateMachine(states: [green, yellow, red]) 

     // Try entering various states...    
     if stateMachine?.enter(Green.self) == false { 
      print("failed to move to green") 
     } 
     if stateMachine?.enter(Red.self) == false { 
      print("failed to move to red") 
     } 
     if stateMachine?.enter(Yellow.self) == false { 
      print("failed to move to yellow") 
     } 
     if stateMachine?.enter(Green.self) == false { 
      print("failed to move to green") 
     } 
     if stateMachine?.enter(Red.self) == false { 
      print("failed to move to red") 
     } 

    } 

} 

Ausgang:

Traffic light is green 
failed to move to red 
Traffic light is yellow 
failed to move to green 
Traffic light is red 
+0

Vielen Dank für die Antwort. Das klärt GKStateMachine für mich :) –

+0

Großartig! Froh, dass ich helfen konnte. – vacawama

+0

Ich arbeite an meinem ersten Spiel. https://youtu.be/5zdQBCM1X5c Ich bin daran interessiert, eine Zustandsmaschine zu verwenden, um die Spieler- und Spieleranimation zu steuern, also hilft Ihre Antwort sehr. Ich habe drei Tage damit verbracht, über GKGameStateMachine zu lesen und nach Tutorials und Beispielen zu suchen. Die meisten State-Machine-Sachen sind entweder nicht schnell genug oder zu komplex für meine Programmierkenntnisse. Apples GK State Machine Guide Beispiel auf dem Spender war ein wenig über meinen Kopf. Ich schaffte es, es viel einfacher zu machen, aber ich war immer noch mit einigen Sachen, die ich nicht grok. Ihr Verfolgungsbeispiel ist nicht schnell. So danke :) –

Verwandte Themen