我想在Lua中创建FSM(使用Luabind)。假设我有GameObject,在lua文件中我写这个:
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);
问题是 - 如何使用DIFFERENT属性创建SAME对象行为?喜欢..如果我想创建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