2017-02-11 46 views
0

我已經閱讀了GameplayKit狀態機,並且documentation明確提到了遊戲UI作爲使用示例。我完全理解這個概念,但我不確定如何在使用SpriteKit時實現它。(Apple)使用SKScene的GameplayKit狀態機實現

可以說我想要3個州。菜單,遊戲和遊戲結束 - 所有內容都顯示給SKScene。 GameScene類擴展SKScene。所以不可能將GameScene變成一個狀態機,因爲我們只能擴展一個類。

GameScene應該有一個引用SKScene的狀態機的變量,還是有更好的解決方案?早些時候我已經使用了狀態機的協議,這很容易,但我想嘗試GameplayKit的功能。

回答

0

你在正確的軌道上。在GameScene中添加狀態機變量並初始化它的開始狀態。

import SpriteKit 
import GameplayKit 

class GameScene: SKScene { 
    var stateMachine: GKStateMachine! 

    override func didMove(to view: SKView) { 
     self.stateMachine = GKStateMachine(states: [ 
      StartState(scene: self), 
      PlayingState(scene: self), 
      PausedState(scene: self), 
     GameOverState(scene: self) 
     ]) 

     self.stateMachine.enter(StartState.self) 
    } 

    override func update(_ currentTime: TimeInterval) { 
     self.stateMachine.update(deltaTime: currentTime) 
    } 
} 

,使他們接受GameScene作爲輸入參數,然後初始化狀態。

import SpriteKit 
import GameplayKit 

class StartState: GKState { 
    var scene: GameScene! 

    init(scene: GameScene){ 
     super.init() 

     self.scene = scene 
    } 

    override func isValidNextState(_ stateClass: Swift.AnyClass) -> Bool { 
     return stateClass == PlayingState.self 
    } 

    override func updateWithDeltaTime(seconds: TimeInterval) { 
     self.stateMachine?.enterState(PlayingState.self) 
    } 
} 
+0

我發現[本文](https://medium.com/swift-programming/build-tic-tac-toe-with-ai-using-swift-25c5cd3085c9#.6hyeh3v9j)解釋'GKStateMachine'對於將邏輯放入每個狀態的細節都相當好。 –