Merge pull request #18081 from AndreaCatania/arcle
Corrected area overlap cleaning
This commit is contained in:
commit
e15f2636ea
3 changed files with 14 additions and 16 deletions
|
@ -68,8 +68,9 @@ AreaBullet::AreaBullet() :
|
|||
}
|
||||
|
||||
AreaBullet::~AreaBullet() {
|
||||
// Call "remove_all_overlapping_instantly();" is not necessary because the exit
|
||||
// signal are handled by godot, so just clear the array
|
||||
// signal are handled by godot, so just clear without notify
|
||||
for (int i = overlappingObjects.size() - 1; 0 <= i; --i)
|
||||
overlappingObjects[i].object->on_exit_area(this);
|
||||
}
|
||||
|
||||
void AreaBullet::dispatch_callbacks() {
|
||||
|
@ -122,24 +123,21 @@ void AreaBullet::scratch() {
|
|||
isScratched = true;
|
||||
}
|
||||
|
||||
void AreaBullet::remove_all_overlapping_instantly() {
|
||||
CollisionObjectBullet *supportObject;
|
||||
void AreaBullet::clear_overlaps(bool p_notify) {
|
||||
for (int i = overlappingObjects.size() - 1; 0 <= i; --i) {
|
||||
supportObject = overlappingObjects[i].object;
|
||||
call_event(supportObject, PhysicsServer::AREA_BODY_REMOVED);
|
||||
supportObject->on_exit_area(this);
|
||||
if (p_notify)
|
||||
call_event(overlappingObjects[i].object, PhysicsServer::AREA_BODY_REMOVED);
|
||||
overlappingObjects[i].object->on_exit_area(this);
|
||||
}
|
||||
overlappingObjects.clear();
|
||||
}
|
||||
|
||||
void AreaBullet::remove_overlapping_instantly(CollisionObjectBullet *p_object, bool p_notify) {
|
||||
CollisionObjectBullet *supportObject;
|
||||
void AreaBullet::remove_overlap(CollisionObjectBullet *p_object, bool p_notify) {
|
||||
for (int i = overlappingObjects.size() - 1; 0 <= i; --i) {
|
||||
supportObject = overlappingObjects[i].object;
|
||||
if (supportObject == p_object) {
|
||||
if (overlappingObjects[i].object == p_object) {
|
||||
if (p_notify)
|
||||
call_event(supportObject, PhysicsServer::AREA_BODY_REMOVED);
|
||||
supportObject->on_exit_area(this);
|
||||
call_event(overlappingObjects[i].object, PhysicsServer::AREA_BODY_REMOVED);
|
||||
overlappingObjects[i].object->on_exit_area(this);
|
||||
overlappingObjects.remove(i);
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -150,9 +150,9 @@ public:
|
|||
void set_on_state_change(ObjectID p_id, const StringName &p_method, const Variant &p_udata = Variant());
|
||||
void scratch();
|
||||
|
||||
void remove_all_overlapping_instantly();
|
||||
void clear_overlaps(bool p_notify);
|
||||
// Dispatch the callbacks and removes from overlapping list
|
||||
void remove_overlapping_instantly(CollisionObjectBullet *p_object, bool p_notify);
|
||||
void remove_overlap(CollisionObjectBullet *p_object, bool p_notify);
|
||||
|
||||
virtual void on_collision_filters_change();
|
||||
virtual void on_collision_checker_start() {}
|
||||
|
|
|
@ -70,7 +70,7 @@ CollisionObjectBullet::CollisionObjectBullet(Type p_type) :
|
|||
CollisionObjectBullet::~CollisionObjectBullet() {
|
||||
// Remove all overlapping, notify is not required since godot take care of it
|
||||
for (int i = areasOverlapped.size() - 1; 0 <= i; --i) {
|
||||
areasOverlapped[i]->remove_overlapping_instantly(this, /*Notify*/ false);
|
||||
areasOverlapped[i]->remove_overlap(this, /*Notify*/ false);
|
||||
}
|
||||
|
||||
destroyBulletCollisionObject();
|
||||
|
|
Loading…
Reference in a new issue