-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathBehaviorEvent.h
More file actions
134 lines (109 loc) · 2.77 KB
/
Copy pathBehaviorEvent.h
File metadata and controls
134 lines (109 loc) · 2.77 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#pragma once
#include<vector>
#include<string>
#include<iostream>
#include<functional>
namespace BTEvent
{
enum class EStatus :uint8_t
{
Invalid,
Success,
Failure,
Running,
Aborted,
};
using BehaviorObserver = std::function<void(EStatus)>;
enum class EPolicy :uint8_t
{
RequireOne,
RequireAll,
};
class Behavior
{
public:
virtual void Release() = 0;
EStatus Tick();
EStatus GetStatus() { return Status; }
void SetStatus(EStatus InStatus) { Status = InStatus; }
void Reset() { Status = EStatus::Invalid; }
void Abort() { OnTerminate(EStatus::Aborted); Status = EStatus::Aborted; }
bool IsTerminate() { return Status == EStatus::Success || Status == EStatus::Failure; }
bool IsRunning() { return Status == EStatus::Running; }
bool IsSuccess() { return Status == EStatus::Success; }
bool IsFailuer() { return Status == EStatus::Failure; }
virtual std::string Name() = 0;
virtual void AddChild(Behavior* Child) {};
public:
BehaviorObserver Observer;
protected:
Behavior() :Status(EStatus::Invalid) {}
virtual ~Behavior() {}
virtual void OnInitialize() {};
virtual EStatus Update() = 0;
virtual void OnTerminate(EStatus Status) {};
protected:
EStatus Status;
class BehaviorTree* Tree;
};
class Decorator :public Behavior
{
public:
virtual void AddChild(Behavior* InChild) { Child = InChild; }
protected:
Decorator():Child(nullptr) {}
virtual ~Decorator() {}
Behavior* Child;
};
class Repeat :public Decorator
{
public:
static Behavior* Create(int InLimited) { return new Repeat(InLimited); }
virtual void Release() { Child->Release(); delete this; }
virtual std::string Name() override { return "Repeat"; }
protected:
Repeat(int InLimited) :Limited(InLimited) {}
virtual ~Repeat() {}
virtual void OnInitialize() { Count = 0; }
virtual EStatus Update()override;
virtual Behavior* Create() { return nullptr; }
protected:
int Limited = 3;
int Count = 0;
};
class Composite :public Behavior
{
public:
virtual void AddChild(Behavior* InChild) override { Children.push_back(InChild); }
void RemoveChild(Behavior* InChild);
void ClearChild() { Children.clear(); }
virtual void Release()
{
for (auto it : Children)
{
it->Release();
}
delete this;
}
protected:
Composite() {}
virtual ~Composite() {}
using Behaviors = std::vector<Behavior*>;
Behaviors Children;
};
class Sequence :public Composite
{
public:
virtual std::string Name() override { return "Sequence"; }
static Behavior* Create() { return new Sequence(); }
void OnChildComplete(EStatus Status);
protected:
Sequence() {}
virtual ~Sequence() {}
virtual void OnInitialize() override;
virtual EStatus Update() override;
protected:
Behaviors::iterator CurrChild;
BehaviorTree* m_pBehaviorTree;
};
}