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

标签 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);

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

最佳答案

您是在问如何创建两个处于相同状态(行为)但具有不同属性(如起始位置)的对象。如果是这样,您可以采用函数式方法,假设状态只是代表一系列对您的对象(如 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 .

我更喜欢前者,因为国家保持“纯粹”并且不保存单位的属性。但这只是风格问题。

-阿伦

编辑:如果你的单元的位置根据它的值有特殊意义,那么逻辑可以嵌入到状态机代码中:

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

关于c++ - Lua 和 C++ 中的有限状态机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17881911/

相关文章:

c++ - 对属性进行 binary_search 的编译错误

google-app-engine - Google App Engine 上的 Lua

string - 用 Lua 匹配整个、精确的文本行

c++ - 反斜杠和引号不计入字符串长度?

c++ - C++11 是否强制 pow(double, int) 使用较慢的 pow(double, double)?

c++ - 将 lua 表从 C++ 传递到 .Lua 脚本

c - 如何在c中获取lua参数?

c++ - 构建 luabind 时出现错误 C2665

c++ - 摆脱带符号的零

c++ - 如何在不运行 Lua 脚本的情况下识别未初始化的变量