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

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 に答える