Refactor composite and decorator classes

This commit is contained in:
Serhii Snitsaruk 2022-12-17 11:47:10 +01:00
parent 3693c3fc50
commit 370efcba73
15 changed files with 36 additions and 41 deletions

View File

@ -4,19 +4,19 @@
void BTRandomSelector::_enter() { void BTRandomSelector::_enter() {
last_running_idx = 0; last_running_idx = 0;
if (_indicies.size() != get_child_count()) { if (indicies.size() != get_child_count()) {
_indicies.resize(get_child_count()); indicies.resize(get_child_count());
for (int i = 0; i < get_child_count(); i++) { for (int i = 0; i < get_child_count(); i++) {
_indicies.set(i, i); indicies.set(i, i);
} }
} }
_indicies.shuffle(); indicies.shuffle();
} }
int BTRandomSelector::_tick(float p_delta) { int BTRandomSelector::_tick(float p_delta) {
int status = FAILURE; int status = FAILURE;
for (int i = last_running_idx; i < get_child_count(); i++) { for (int i = last_running_idx; i < get_child_count(); i++) {
status = get_child(_indicies[i])->execute(p_delta); status = get_child(indicies[i])->execute(p_delta);
if (status != FAILURE) { if (status != FAILURE) {
last_running_idx = i; last_running_idx = i;
break; break;

View File

@ -11,7 +11,7 @@ class BTRandomSelector : public BTComposite {
private: private:
int last_running_idx = 0; int last_running_idx = 0;
Array _indicies; Array indicies;
protected: protected:
virtual void _enter() override; virtual void _enter() override;

View File

@ -4,19 +4,19 @@
void BTRandomSequence::_enter() { void BTRandomSequence::_enter() {
last_running_idx = 0; last_running_idx = 0;
if (_indicies.size() != get_child_count()) { if (indicies.size() != get_child_count()) {
_indicies.resize(get_child_count()); indicies.resize(get_child_count());
for (int i = 0; i < get_child_count(); i++) { for (int i = 0; i < get_child_count(); i++) {
_indicies.set(i, i); indicies.set(i, i);
} }
} }
_indicies.shuffle(); indicies.shuffle();
} }
int BTRandomSequence::_tick(float p_delta) { int BTRandomSequence::_tick(float p_delta) {
int status = SUCCESS; int status = SUCCESS;
for (int i = last_running_idx; i < get_child_count(); i++) { for (int i = last_running_idx; i < get_child_count(); i++) {
status = get_child(_indicies[i])->execute(p_delta); status = get_child(indicies[i])->execute(p_delta);
if (status != SUCCESS) { if (status != SUCCESS) {
last_running_idx = i; last_running_idx = i;
break; break;

View File

@ -11,7 +11,7 @@ class BTRandomSequence : public BTComposite {
private: private:
int last_running_idx = 0; int last_running_idx = 0;
Array _indicies; Array indicies;
protected: protected:
virtual void _enter() override; virtual void _enter() override;

View File

@ -8,7 +8,7 @@ String BTCondition::get_configuration_warning() const {
warning += "\n"; warning += "\n";
} }
if (get_child_count() != 0) { if (get_child_count() != 0) {
warning += "Condition can't have child tasks.\n"; warning += "Condition task can't have child tasks.\n";
} }
return warning; return warning;
} }

View File

@ -33,17 +33,17 @@ int BTCooldown::_tick(float p_delta) {
void BTCooldown::_chill() { void BTCooldown::_chill() {
get_blackboard()->set_var(cooldown_state_var, true); get_blackboard()->set_var(cooldown_state_var, true);
if (_timer.is_valid()) { if (timer.is_valid()) {
_timer->set_time_left(duration); timer->set_time_left(duration);
} else { } else {
_timer = SceneTree::get_singleton()->create_timer(duration, process_pause); timer = SceneTree::get_singleton()->create_timer(duration, process_pause);
_timer->connect("timeout", callable_mp(this, &BTCooldown::_on_timeout), CONNECT_ONE_SHOT); timer->connect("timeout", callable_mp(this, &BTCooldown::_on_timeout), CONNECT_ONE_SHOT);
} }
} }
void BTCooldown::_on_timeout() { void BTCooldown::_on_timeout() {
get_blackboard()->set_var(cooldown_state_var, false); get_blackboard()->set_var(cooldown_state_var, false);
_timer.unref(); timer.unref();
} }
void BTCooldown::_bind_methods() { void BTCooldown::_bind_methods() {

View File

@ -17,7 +17,7 @@ private:
bool trigger_on_failure = false; bool trigger_on_failure = false;
String cooldown_state_var = ""; String cooldown_state_var = "";
Ref<SceneTreeTimer> _timer = nullptr; Ref<SceneTreeTimer> timer = nullptr;
void _chill(); void _chill();
void _on_timeout(); void _on_timeout();

View File

@ -12,15 +12,6 @@ void BTNewScope::initialize(Node *p_agent, const Ref<Blackboard> &p_blackboard)
Ref<Blackboard> bb = memnew(Blackboard); Ref<Blackboard> bb = memnew(Blackboard);
// if (blackboard_data.empty()) {
// bb->set_parent_scope(p_blackboard);
// } else {
// Ref<Blackboard> ro = memnew(Blackboard);
// ro->set_data(blackboard_data);
// ro->set_parent_scope(p_blackboard);
// bb->set_parent_scope(ro);
// }
bb->set_data(blackboard_data.duplicate()); bb->set_data(blackboard_data.duplicate());
bb->set_parent_scope(p_blackboard); bb->set_parent_scope(p_blackboard);

View File

@ -9,7 +9,7 @@ String BTRepeat::_generate_name() const {
} }
void BTRepeat::_enter() { void BTRepeat::_enter() {
_cur_iteration = 1; cur_iteration = 1;
} }
int BTRepeat::_tick(float p_delta) { int BTRepeat::_tick(float p_delta) {
@ -19,10 +19,10 @@ int BTRepeat::_tick(float p_delta) {
return RUNNING; return RUNNING;
} else if (status == FAILURE && abort_on_failure) { } else if (status == FAILURE && abort_on_failure) {
return FAILURE; return FAILURE;
} else if (_cur_iteration >= times) { } else if (cur_iteration >= times) {
return SUCCESS; return SUCCESS;
} else { } else {
_cur_iteration += 1; cur_iteration += 1;
return RUNNING; return RUNNING;
} }
} }

View File

@ -12,7 +12,7 @@ class BTRepeat : public BTDecorator {
private: private:
int times = 1; int times = 1;
bool abort_on_failure = false; bool abort_on_failure = false;
int _cur_iteration = 0; int cur_iteration = 0;
protected: protected:
static void _bind_methods(); static void _bind_methods();

View File

@ -9,10 +9,10 @@ String BTRunLimit::_generate_name() const {
int BTRunLimit::_tick(float p_delta) { int BTRunLimit::_tick(float p_delta) {
ERR_FAIL_COND_V_MSG(get_child_count() == 0, FAILURE, "BT decorator has no child."); ERR_FAIL_COND_V_MSG(get_child_count() == 0, FAILURE, "BT decorator has no child.");
if (get_child(0)->get_status() != RUNNING) { if (get_child(0)->get_status() != RUNNING) {
if (_num_runs >= run_limit) { if (num_runs >= run_limit) {
return FAILURE; return FAILURE;
} }
_num_runs += 1; num_runs += 1;
} }
return get_child(0)->execute(p_delta); return get_child(0)->execute(p_delta);
} }

View File

@ -11,7 +11,7 @@ class BTRunLimit : public BTDecorator {
private: private:
int run_limit = 1; int run_limit = 1;
int _num_runs = 0; int num_runs = 0;
protected: protected:
static void _bind_methods(); static void _bind_methods();

View File

@ -7,14 +7,14 @@ String BTTimeLimit::_generate_name() const {
} }
void BTTimeLimit::_enter() { void BTTimeLimit::_enter() {
_time_passed = 0.0; time_passed = 0.0;
} }
int BTTimeLimit::_tick(float p_delta) { int BTTimeLimit::_tick(float p_delta) {
ERR_FAIL_COND_V_MSG(get_child_count() == 0, FAILURE, "BT decorator has no child."); ERR_FAIL_COND_V_MSG(get_child_count() == 0, FAILURE, "BT decorator has no child.");
_time_passed += p_delta; time_passed += p_delta;
int status = get_child(0)->execute(p_delta); int status = get_child(0)->execute(p_delta);
if (status == RUNNING and _time_passed >= time_limit) { if (status == RUNNING and time_passed >= time_limit) {
get_child(0)->cancel(); get_child(0)->cancel();
return FAILURE; return FAILURE;
} }

View File

@ -11,7 +11,7 @@ class BTTimeLimit : public BTDecorator {
private: private:
float time_limit = 5.0; float time_limit = 5.0;
float _time_passed = 0.0; float time_passed = 0.0;
protected: protected:
static void _bind_methods(); static void _bind_methods();

View File

@ -1,4 +1,4 @@
[gd_resource type="BehaviorTree" load_steps=8 format=3 uid="uid://cjkqi41oagagd"] [gd_resource type="BehaviorTree" load_steps=9 format=3 uid="uid://cjkqi41oagagd"]
[ext_resource type="Script" path="res://ai/tasks/arrive_pos.gd" id="1_rhs33"] [ext_resource type="Script" path="res://ai/tasks/arrive_pos.gd" id="1_rhs33"]
[ext_resource type="Script" path="res://ai/tasks/play_animation.gd" id="2_dg0ss"] [ext_resource type="Script" path="res://ai/tasks/play_animation.gd" id="2_dg0ss"]
@ -22,8 +22,12 @@ children = [SubResource("BTSequence_a2ng0")]
array_var = "waypoints" array_var = "waypoints"
save_var = "wp" save_var = "wp"
[sub_resource type="BTSelector" id="BTSelector_5dclr"] [sub_resource type="BTCooldown" id="BTCooldown_gen0l"]
children = [SubResource("BTForEach_0cp04")] children = [SubResource("BTForEach_0cp04")]
duration = 3.0
[sub_resource type="BTSelector" id="BTSelector_5dclr"]
children = [SubResource("BTCooldown_gen0l")]
[resource] [resource]
root_task = SubResource("BTSelector_5dclr") root_task = SubResource("BTSelector_5dclr")