(Apple) GameplayKit State Machine implementation with SKScene
(Apple) GameplayKit State Machine implementation with SKScene
我已经阅读了 GameplayKit 状态机,documentation 明确提到游戏 UI 作为用法示例。我完全理解这个概念,但我不确定如何在使用 SpriteKit 时实现它。
假设我想要 3 个状态。菜单、游戏玩法和游戏结束——所有这些都向 SKScene 显示内容。
GameScene class 扩展了 SKScene。所以不可能将 GameScene 变成状态机,因为我们只能扩展一个 class。
GameScene 是否应该有一个引用 SKScene 的状态机变量,或者是否有更好的解决方案?早些时候我使用了状态机协议,这使得它变得简单,但我想尝试 GameplayKit 的功能。
您走在正确的轨道上。在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)
}
}
我已经阅读了 GameplayKit 状态机,documentation 明确提到游戏 UI 作为用法示例。我完全理解这个概念,但我不确定如何在使用 SpriteKit 时实现它。
假设我想要 3 个状态。菜单、游戏玩法和游戏结束——所有这些都向 SKScene 显示内容。 GameScene class 扩展了 SKScene。所以不可能将 GameScene 变成状态机,因为我们只能扩展一个 class。
GameScene 是否应该有一个引用 SKScene 的状态机变量,或者是否有更好的解决方案?早些时候我使用了状态机协议,这使得它变得简单,但我想尝试 GameplayKit 的功能。
您走在正确的轨道上。在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)
}
}