0

我想在 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);

问题是 - 如何创建具有不同属性的相同对象行为?就像.. 如果我想创建 2 个具有相同行为的巡逻单位,但每个巡逻单位都有不同的起始位置。但是在 Lua 中——当我定义外部函数来描述其中的这些状态时——它不起作用。

4

1 回答 1

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 之类的属性。有关如何结帐本教程的更多信息。

我更喜欢前者,因为美国保持“纯净”并且不保存单位的财产。但这只是风格问题。

-阿伦

编辑:如果您的单位的位置根据其值具有特殊含义,则可以将逻辑嵌入到状态机代码中:

PatrolState.Update = function(unit)
    if(InsideDeathCircle(unit.position)) then
        ChangeState (KillUnitState)
    end
end
于 2013-07-26T15:33:38.793 回答