Как я могу сохранить предыдущее состояние таким образом, чтобы оно могло быть снова введено с помощью 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))
}
Другие вопросы по тегам