2013-07-26 55 views
0

我想在Lua中創建FSM(使用Luabind)。比方說,我有遊戲物體,在LUA文件我不這樣寫:Lua和C++中的有限狀態機

State1 = {} 
State1["Start"] = function() 
end 
State1["Update"] = function() 
    if (blah blah blah) then 
     ChangeState(State2); 
    end 
end 
State1["End"] = function() 
end 
... then states 2, 3 and etc... 
gameObject.fsm = CreateFSMComponent(name, State1); 

的問題是 - 如何創建具有不同屬性的同一個對象的行爲呢?就像..如果我想創建2個具有相同行爲的巡邏隊,但他們每個人都有不同的起始位置。 但是在Lua中 - 當我定義外部函數來描述這些狀態時 - 它不起作用。

+0

我想你在找什麼是一種將當前狀態與其所連接的遊戲對象相關聯的方法。 –

回答

2

你問的是如何創建兩個對象在相同的狀態(行爲),但具有不同的屬性(如開始位置)。如果是這樣,你可以採取兩種功能的方法,你認爲國家只是代表了一系列關於你的對象操作功能(如PatrolUnits),如:

PatrolState = {} 

PatrolState.Start = function(unit) 
    if(SomeChecker(unit.startPos)) then 
     DoSomething() -- like unit.curPos = unit.startPos, for example    
    end 
end 

PatrolState.Update = function(unit) 
    if(IsNearSomething(unit.curPos)) then 
     DoSomethingElse() -- like ChangeState(State2) 
    end 
end 

,或者面向對象的方法。在這種情況下,您必須創建類型的對象 State1,2 ...並將它們保留在周圍,並且您將能夠在狀態對象中保存類似startPos的屬性。有關如何結帳的更多信息this tutorial

我更喜歡前者,因爲州政府保持「純粹」的態度,不會節省部隊的財產。但這只是一個風格問題。

-arun

編輯:如果你的單位的位置採取基於它的值是邏輯可以嵌入在狀態機代碼的特殊含義:

PatrolState.Update = function(unit) 
    if(InsideDeathCircle(unit.position)) then 
     ChangeState (KillUnitState) 
    end 
end 
+0

感謝您的回答,但如果單位沒有startPos屬性呢?我的意思是 - 單元可能具有位置組件(用C++編寫),但startPos或deathPos或smth - 與邏輯相關的參數。是否有必要在C++組件中擁有所有類型的屬性?我感覺很糟糕。我應該如何保持(並傳遞給這些功能)這些可選屬性 –

+0

我改變了我的答案w.r.to你的問題。一般來說,如果你認爲事情真的是單位的財產 - 比如位置,數量等 - 我沒有看到任何將它們添加爲屬性的東西。但如果他們是實際的邏輯,你可以使Lua函數處於狀態。 如果您對此設計感到不舒服,並且覺得向Lua狀態添加屬性更直觀,則始終可以將狀態設置爲類並將狀態類型的唯一對象關聯到您的單元。關於Lua中面向對象開發的鏈接,我發佈在我的答案中,有更多關於這方面的信息。 –