summaryrefslogtreecommitdiff
path: root/area_2d.gd
diff options
context:
space:
mode:
authorDaniel Weipert <git@mail.dweipert.de>2024-08-31 21:19:36 +0200
committerDaniel Weipert <git@mail.dweipert.de>2024-08-31 21:19:36 +0200
commit14e51610a66099af5cba7cb92876e691fe017216 (patch)
tree5bbb252c0170b00e25cb66e38980bcd505c5aad2 /area_2d.gd
parentcf4f54f8e43d1deb03e1b644f6a374530efa11e3 (diff)
next commit
Diffstat (limited to 'area_2d.gd')
-rw-r--r--area_2d.gd53
1 files changed, 53 insertions, 0 deletions
diff --git a/area_2d.gd b/area_2d.gd
new file mode 100644
index 0000000..b9ed0d4
--- /dev/null
+++ b/area_2d.gd
@@ -0,0 +1,53 @@
+extends Area2D
+
+var overlapping_nodes: Dictionary = {}
+
+func _ready():
+ connect("body_shape_entered", Callable(self, "_on_body_shape_entered"))
+ connect("body_shape_exited", Callable(self, "_on_body_shape_exited"))
+
+
+func get_overlapping_nodes():
+ for key in overlapping_nodes:
+ var body = overlapping_nodes[key].body
+ var body_shape: int = overlapping_nodes[key].body_shape
+ var area_shape: int = overlapping_nodes[key].area_shape
+
+ var body_shape2d: Shape2D = body.shape_owner_get_shape(body_shape, 0)
+ var area_shape2d: Shape2D = shape_owner_get_shape(area_shape, 0)
+
+ var body_shape2d_transform = body.shape_owner_get_owner(body_shape).get_global_transform()
+ var area_shape2d_transform = shape_owner_get_owner(area_shape).get_global_transform()
+
+ var collision_points = area_shape2d.collide_and_get_contacts(area_shape2d_transform, body_shape2d, body_shape2d_transform)
+ overlapping_nodes[key].collision_points = collision_points
+
+ if collision_points.size() == 2:
+ overlapping_nodes[key].collision_points.append(
+ overlapping_nodes[key].collision_points[0] + Vector2(0, 16)
+ )
+ overlapping_nodes[key].collision_points.append(
+ overlapping_nodes[key].collision_points[1] + Vector2(0, 16)
+ )
+
+
+ return overlapping_nodes
+
+
+func _on_body_shape_entered(id, body, body_shape, area_shape):
+ if body != null:
+ #print("Id: ", id, " [", body, ", ", body_shape, ", ", area_shape, "] has entered. ")
+ var key := str(id) + ":" + str(body_shape)
+ overlapping_nodes[key] = {
+ "body": body,
+ "body_shape": body_shape,
+ "area_shape": area_shape,
+ "collision_points": [],
+ }
+
+
+func _on_body_shape_exited(id, body, body_shape, area_shape):
+ if body != null:
+ #print("Id: ", id, " [", body, ", ", body_shape, ", ", area_shape, "] has exited. ")
+ var key := str(id) + ":" + str(body_shape)
+ overlapping_nodes.erase(key)