Я хочу создать FSM в 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
... then states 2, 3 and etc...
gameObject.fsm = CreateFSMComponent(name, State1);
Вопрос — как создать ОДНО ЖЕ поведение объекта с РАЗЛИЧНЫМИ свойствами? Например … если бы я хотел создать 2 патрульных отряда с одинаковым поведением, но у каждого из них была бы разная стартовая позиция.
Но в Lua — когда я определяю внешние функции для описания этих состояний внутри него — это не работает.
Вы спрашиваете, как создать два объекта в одном и том же состоянии (поведении), но иметь разные свойства (например, начальную позицию). Если это так, вы можете использовать любой функциональный подход, при котором вы предполагаете, что States просто представляют серию функций, работающих с вашими объектами (например, 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
Других решений пока нет …