2
0
Эх сурвалжийг харах

Merge pull request #7934 from lonesurvivor/area2d-fix_2.1

2.1: Fixes two problems with Area2D and remove_child()
Rémi Verschelde 8 жил өмнө
parent
commit
c58c490d45

+ 14 - 5
scene/2d/area_2d.cpp

@@ -357,6 +357,10 @@ void Area2D::_clear_monitoring() {
 			Object *obj = ObjectDB::get_instance(E->key());
 			Node *node = obj ? obj->cast_to<Node>() : NULL;
 			ERR_CONTINUE(!node);
+
+			node->disconnect(SceneStringNames::get_singleton()->enter_tree,this,SceneStringNames::get_singleton()->_body_enter_tree);
+			node->disconnect(SceneStringNames::get_singleton()->exit_tree,this,SceneStringNames::get_singleton()->_body_exit_tree);
+
 			if (!E->get().in_tree)
 				continue;
 
@@ -367,8 +371,6 @@ void Area2D::_clear_monitoring() {
 
 			emit_signal(SceneStringNames::get_singleton()->body_exit,obj);
 
-			node->disconnect(SceneStringNames::get_singleton()->enter_tree,this,SceneStringNames::get_singleton()->_body_enter_tree);
-			node->disconnect(SceneStringNames::get_singleton()->exit_tree,this,SceneStringNames::get_singleton()->_body_exit_tree);
 		}
 
 	}
@@ -388,6 +390,9 @@ void Area2D::_clear_monitoring() {
 				continue;
 			//ERR_CONTINUE(!node);
 
+			node->disconnect(SceneStringNames::get_singleton()->enter_tree,this,SceneStringNames::get_singleton()->_area_enter_tree);
+			node->disconnect(SceneStringNames::get_singleton()->exit_tree,this,SceneStringNames::get_singleton()->_area_exit_tree);
+
 			if (!E->get().in_tree)
 				continue;
 
@@ -397,9 +402,6 @@ void Area2D::_clear_monitoring() {
 			}
 
 			emit_signal(SceneStringNames::get_singleton()->area_exit,obj);
-
-			node->disconnect(SceneStringNames::get_singleton()->enter_tree,this,SceneStringNames::get_singleton()->_area_enter_tree);
-			node->disconnect(SceneStringNames::get_singleton()->exit_tree,this,SceneStringNames::get_singleton()->_area_exit_tree);
 		}
 	}
 
@@ -411,8 +413,14 @@ void Area2D::_notification(int p_what) {
 
 		case NOTIFICATION_EXIT_TREE: {
 
+			monitoring_stored = monitoring;
+			set_enable_monitoring(false);
 			_clear_monitoring();
 		} break;
+		case NOTIFICATION_ENTER_TREE: {
+			
+			set_enable_monitoring(monitoring_stored);
+		} break;
 	}
 
 }
@@ -686,6 +694,7 @@ Area2D::Area2D() : CollisionObject2D(Physics2DServer::get_singleton()->area_crea
 	monitorable=false;
 	collision_mask=1;
 	layer_mask=1;
+	monitoring_stored = true;
 	set_enable_monitoring(true);
 	set_monitorable(true);
 }

+ 1 - 0
scene/2d/area_2d.h

@@ -58,6 +58,7 @@ private:
 	uint32_t layer_mask;
 	int priority;
 	bool monitoring;
+	bool monitoring_stored;
 	bool monitorable;
 	bool locked;