2016-02-25 52 views
0

我正在使用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') 
+0

#swift-lang上的一些民謠幫助我解決了這個問題。我希望下週能夠發佈解決方案。 – Relequestual

+0

你是怎麼解決這個問題的? – mfessenden

+1

@mfessenden對不起,我是「那個人」誰沒有發佈他們的解決方案。這裏是詳細的版本:https://gist.github.com/Relequestual/548c0f858f04e2d2a07550a1e6125afe - 事實證明我並沒有真的想這樣做,但我挖出了我的git歷史中的代碼=]讓我知道如果我可以進一步幫助。 – Relequestual

回答

1

如果這個問題還沒有回答,這可能是一個解決辦法:SWIFT:

聲明一個變種在主遊戲類:

var previousState: AnyClass? 

GKState類有一個willExit功能,這個函數可以定義這個var,因爲這個類將會是之前的狀態:

override func willExit(to nextState: GKState) { 

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

然後在你的主遊戲類中,你可以c所有這些變種:

self.myGameStateMachine?.enter(self.previousState) 

我希望這足以讓你繼續下去。

+0

謝謝。我沒有考慮過,當willExit被調用時,當前狀態將是自己的,因爲它尚未改變。我不確定我是否真的需要這樣做,所以沒有自己檢查代碼。雖然看起來不錯。 – Relequestual

+0

我確實以另一種方式解決了這個問題。我應該發佈我的解決方案。它在這個問題的評論中。 – Relequestual

相關問題