behavior3行为树
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

32 行
1.1 KiB

  1. -module(repeat_until_failure).
  2. -include("eBhv3.hrl").
  3. -export([open/2, tick/2, close/2]).
  4. -spec open(bt_node(), bt_state()) -> bt_state().
  5. open(#{id := ID} = _BTNode, BTState) ->
  6. blackboard:set(i, 0, ID, BTState).
  7. -spec tick(bt_node(), bt_state()) -> {bt_status(), bt_state()}.
  8. tick(#{id := ID, children := [ChildID], properties := #{max_loop := MaxLoop}} = _BTNode, BTState) ->
  9. I = blackboard:get(i, ID, BTState),
  10. {I1, BTStatus, BTState1} = tick_1(MaxLoop, I, ChildID, ?BT_ERROR, BTState),
  11. BTState2 = blackboard:set(i, I1, ID, BTState1),
  12. {BTStatus, BTState2};
  13. tick(_BTNode, BTState) ->
  14. {?BT_ERROR, BTState}.
  15. -spec close(bt_node(), bt_state()) -> bt_state().
  16. close(#{id := ID} = _BTNode, BTState) ->
  17. blackboard:remove(i, ID, BTState).
  18. tick_1(MaxLoop, I, ChildID, _BTStatus, BTState) when MaxLoop < 0 orelse I < MaxLoop ->
  19. case base_node:execute(ChildID, BTState) of
  20. {?BT_SUCCESS, BTState1} ->
  21. tick_1(MaxLoop, I + 1, ChildID, ?BT_SUCCESS, BTState1);
  22. {BTStatus, BTState1} ->
  23. {I, BTStatus, BTState1}
  24. end;
  25. tick_1(_MaxLoop, I, _ChildID, BTStatus, BTState) ->
  26. {I, BTStatus, BTState}.