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

我想在Lua中(使用Luabind)创建有限状态机。假设我有一个GameObject,在lua文件中我会写这个:

State1 = {}
State1 ["Start"] = function()
end
State1 ["Update"] = function()
    if (blah blah blah) then
        ChangeState(State2);
    end
end
State1 ["End"] = function()
end
... 其他状态为23等等...
gameObject.fsm = CreateFSMComponent(name,State1);

问题是 - 如何创建相同的对象行为但具有不同属性的对象?即如果我想创建2个巡逻单位,具有相同的行为但每个单位的起始位置不同。

但是在Lua中 - 当我定义外部函数来描述其中的状态时 - 它不起作用。

点赞
用户988143
用户988143

你是在询问如何创建两个处于相同状态(行为),但具有不同属性(如起始位置)的对象吗?如果是这样,你可以采用函数方法,其中你假设状态仅代表一系列函数在你的对象(如PatrolUnits)上操作,例如:

PatrolState = {}

PatrolState.Start = function(unit)
    if(SomeChecker(unit.startPos)) then
        DoSomething() -- 比如,将 unit.curPos = unit.startPos
    end
end

PatrolState.Update = function(unit)
    if(IsNearSomething(unit.curPos)) then
        DoSomethingElse() -- 比如,更改状态为 State2
    end
end

或者采用面向对象的方法。在这种情况下,你将需要创建 State1、State2 ... 的对象类型,并一直保留它们,这样就可以保存状态对象中的属性,例如 startPos。有关更多信息,请参见 此教程

我更喜欢前者,因为状态保持“纯净”,不保存单位属性。但这只是一个风格问题。

-arun

编辑:如果基于单位的位置取决于它的值,那么该逻辑可以嵌入到状态机代码中:

PatrolState.Update = function(unit)
    if(InsideDeathCircle(unit.position)) then
        ChangeState (KillUnitState)
    end
end
2013-07-26 15:33:38