Как подсказал @ Knight0fDragon, вам лучше использовать функциональность GKStateMachine
, я приведу пример.
Сначала объявите состояния вашего игрока / персонажа в вашей сцене
lazy var playerState: GKStateMachine = GKStateMachine(states: [
Idle(scene: self),
Run(scene: self)
])
Затем вам нужно создать класс для каждого из этих состояний, в этом примере я покажу вам только Idle
класс
import SpriteKit
import GameplayKit
class Idle: GKState {
weak var scene: GameScene?
init(scene: SKScene) {
self.scene = scene as? GameScene
super.init()
}
override func didEnter(from previousState: GKState?) {
//Here you can make changes to your character when it enters this state, for example, change his texture.
}
override func isValidNextState(_ stateClass: AnyClass) -> Bool {
return stateClass is Run.Type //This is pretty obvious by the method name, which states can the character go to from this state.
}
override func update(deltaTime seconds: TimeInterval) {
//Here is the update method for this state, lets say you have a button which controls your character velocity, then you can check if the player go over a certain velocity you make it go to the Run state.
if playerVelocity > 500 { //playerVelocity is just an example of a variable to check the player velocity.
scene?.playerState.enter(Run.self)
}
}
}
Теперь, конечно, в вашей сцене вам нужно сделать дваВо-первых, инициализация символа до определенного состояния, иначе он останется без состояния, так что вы можете сделать это с помощью метода didMove
.
override func didMove(to view: SKView) {
playerState.enter(Idle.self)
}
И последнее, но не менее важное - убедиться, что сцена обновлена.метод вызывает метод обновления состояния.
override func update(_ currentTime: TimeInterval) {
playerState.update(deltaTime: currentTime)
}