To have sound without attenuation, the simple solution is to use
AudioStreamPlayer instead of
AudioStreamPlayer2D node is a
AudioStreamPlayer with a 2D position. The maximum distance and attenuation curve controls how strong it sounds based on its distance to the screen center. The horizontal offset from the center of the screen is used for panning.
And sadly, there isn't a
Listener2D (no such node exist), that we could place on the Player.
AudioStreamPlayer2D always work with the screen center.
Of course, given the scene tree, I'd expect the
AudioStreamPlayer2D to stay on the center of the screen. However, if the Player is moving away from the center of the screen (which depends on how the
Camera2D moves) or if the
AudioStreamPlayer2D is moving relative to it, then you would have attenuation.
Thus, for a solution using
AudioStreamPlayer2D, I'd suggest to make it child of the current
Camera2D, so that it is centered on the screen (regardless of whether or not the player moves away from the center of the screen)… As long as you don't change current
Camera2D, or move the
AudioStreamPlayer2D relative to it.
For a more complex scenario, let us say you want the
AudioStreamPlayer2D centered on the screen when the current
Camera2D is the one on the Player, but centered on the Player when you are using another camera. To do that, we can put a script on the
AudioStreamPlayer2D to move it. Give it the
NodePath of the
Camera2D and the Player. The script will check if the
Camera2D is current, and if it is, set its own global position to match the
Camera2D. If it isn't, then set its won global position to match the Player. Note that this requires to always unset the current
Camera2D when you set a new one.