Как я могу сохранить предыдущее состояние таким образом, чтобы оно могло быть снова введено с помощью GKStateMachine?
Я использую GKStateMachine для отслеживания состояния тайлов в моей игре.
Когда я помещаю предмет, плитки, которые покрыты предметом, переводятся в "запланированное" состояние. Как я могу сохранить и затем вернуть плитки в предыдущее состояние на более позднем этапе?
Вот части кода, которые я придумаю для моего вопроса. Рады поделиться больше по конкретным запросам.
//...
// Have previously entered the tiles stored in the global Game object into a state which is not "planned" state
class func movePlannedObject(x: Int, y: Int) {
//DO Some things
for tile in Game.sharedInstance.plannedBuildingTiles {
tile.stateMachine.enterState(tile.previousState!)
}
// Set new position and change state of tiles to planned
}
//...
И конечный автомат
class TileState : GKState{
var tile : Tile?
init( tile: Tile ) {
super.init()
self.tile = tile
}
}
class TileTileState: TileState {
}
class TileGrassState: TileState {
}
class TilePathState: TileState {
}
class TilePlanState: TileState {
override func didEnterWithPreviousState(previousState: GKState?) {
super.didEnterWithPreviousState(previousState)
tile?.previousState = // What?
print(tile?.previousState)
Game.sharedInstance.plannedBuildingTiles.append(tile!)
}
}
Суть: https://gist.github.com/Relequestual/dac6d51c923e5ce4224e
Если я установил previousState на previousState, я не смогу затем войти в состояние, используя этот vairable...
// In the tile class
var previousState: GKState?
// In states function didEnterWithPreviousState
tile?.previousState = previousState
// Elsewhere
tile.stateMachine.enterState(tile.previousState!)
Ошибка времени компиляции:
Cannot convert value of type 'GKState' to expected argument type 'AnyClass' (aka 'AnyObject.Type')
1 ответ
Если на этот вопрос еще нет ответа, это может быть одним из решений: swift:
Объявите переменную в своем основном игровом классе:
var previousState: AnyClass?
Класс GKState имеет функцию willExit, в этой функции вы можете определить эту переменную, потому что этот же класс будет в предыдущем состоянии:
override func willExit(to nextState: GKState) {
self....?.previousState = ThisClassState.self
}
Затем в вашем основном игровом классе вы можете назвать это var:
self.myGameStateMachine?.enter(self.previousState)
Я надеюсь, что это достаточно ясно, чтобы вы продолжали.
Создайте свойство в вашей сцене или StateClass
var previousState: GKState?
Обновите свойство в вашем методе didEnter GKStates
override func didEnter(from previousState: GKState?) {
super.didEnter(from: previousState)
self.previousState = previousState
}
И использовать это вызов
if let previousState = previousState {
stateMachine.enter(type(of: previousState))
}