2017-02-11 43 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'对于将逻辑放入每个状态的细节都相当好。 –