Thanks for your interest
Yes, there’s a difference in collisions between a CharacterBody2D and Area2D, and collisions between 2 CharacterBody2D (or a CharacterBody2D and a StaticBody2D)
The overlap thing only seems to happens when an Area2D is involved. The other types of nodes, which are physics based, don’t produce an overlap, but can stop the CharacterBody2D when colliding if you don’t set the collision layers properly (which can be a hassle)
If you wanted to make bullets, AFAIK one should use CharacterBody2D for the bullets, as they should stop when colliding with a wall (StaticBody2D). If you made the bullets Area2D, you will see them overlap with the wall, which is undesired.
I also found out that, for there to be no visible overlap between Area2D and CharacterBody2D, 2 consecutive _physics_process must happen, (without a standard _process in between). This can be tested by lowering max_fps, which affect _process rate. This seems to indicate that drawing happens immediately after _process, and that signals are emitted first, before movement happens:
- 1st _physics_process: the player is moved to the right with move_and_slide(), and enters the Area2D. The Area2D body_entered is NOT yet emitted.
- _process: the engine draws the stuff. The player is drawn overlapping the Area2D
- 2nd _physics_process: the Area2D body_entered signal is emitted, before the player movement is processed.
That order of things could explain why if you lower max_fps (or increase physics tick rate) so there are 2 consecutive _physics_process with no _process in between, the overlap is not visible.
This is just a nuance of the engine to keep in mind when developing a game, sadly I don’t think there’s much that can be done here without reinventing the wheel
EDIT: Area2D node is actually physics based too, as it inherits CollisionObject2D
EDIT 2: I also tried the pong official demo, yes the ball can be seen overlapping the paddles if you make the ball faster. Usually in pong you want the ball to go faster with every hit. The visual overlap is absolutely undesired, even if it is just one frame. In my opinion, if I were to make pong using Godot, I’d used CharacterBody2D for the paddles and ball, not Area2D