Lua和C ++中的有限状态机

时间:2013-07-26 12:57:16

标签: c++ lua luabind

我想在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中 - 当我定义外部函数来描述其中的这些状态时 - 它不起作用。

1 个答案:

答案 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