gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 03:12:55 24 4
gpt4 key购买 nike

我想在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com