2013-07-26 6 views
0

Я хочу создать FSM в Lua (используя Luabind). Скажем, я GameObject, в Lua файле я пишу это:Конечный автомат в Lua и C++

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 - когда я определяю внешние функции для описания этих состояний внутри него - это не работает.

+0

Я думаю, что вы ищете это способ связать текущее состояние и объект игры, к которому он привязан. –

ответ

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 в объектах состояния. Для получения дополнительной информации о том, как выезд this tutorial.

Я предпочитаю первое, поскольку государства остаются «чистыми» и не сохраняют свойства объекта. Но это только вопрос стиля.

-arun

редактирование: Если положение вашего блока обратить особое значение на основе того, что это значение, что логика может быть встроена в состоянии машинного кода:

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

Спасибо за ответ, но что, если единица не имеет свойства startPos? Я имею в виду, что единица имеет, может быть, компонент позиции (который написан на языке C++), но параметры startPos или deathPos или smth - параметры, связанные с логикой. нужно ли иметь все свойства в компоненте C++? Я чувствую, что это плохо. Как мне сохранить (и передать функции) эти дополнительные свойства –

+0

Я изменил свой ответ w.r.to на ваш вопрос. В общем, если вы думаете, что что-то действительно является свойством единицы - как позиция, счет и т. Д. - я ничего не вижу с добавлением их в качестве свойств. Но если они являются реальной логикой, вы можете сделать функции Lua в состоянии. Если вам неудобно с этим дизайном, и вы чувствуете добавление свойств в состояние Lua, это более интуитивно понятно, вы всегда можете сделать государства как классы и связывать уникальные объекты типов состояний с вашими единицами. Ссылка об объектно-ориентированной разработке в Lua, которую я опубликовал в своем ответе, содержит больше информации об этом. –

Смежные вопросы