1

我正在使用 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,我就不能使用该变量进入状态......

// 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')
4

2 回答 2

1

如果这个问题还没有得到回答,这可能是一种解决方案:快速:

在你的主游戏类中声明一个 var:

var previousState: AnyClass?

GKState 类有一个 willExit 函数,在这个函数中你可以定义这个 var,因为这个相同的类将是之前的状态:

override func willExit(to nextState: GKState) {

    self....?.previousState = ThisClassState.self
}

然后在你的主游戏类中,你可以调用这个 var :

self.myGameStateMachine?.enter(self.previousState)

我希望这足以让你继续。

于 2017-08-31T21:33:45.070 回答
0

在您的场景或 StateClass 中创建属性

var previousState: GKState?

更新 GKStates didEnter 方法中的属性

override func didEnter(from previousState: GKState?) {
    super.didEnter(from: previousState)
    self.previousState = previousState
}

并使用它调用

if let previousState = previousState {
    stateMachine.enter(type(of: previousState))
}
于 2020-08-02T10:19:58.943 回答