i think, areas entered signals is triggered once, when the body/area enter them. so if the player does not enter in the area in the same frame when hitting the input, it does not work.
let say, "area entered" and "is in the area" is not same thing.
you could use overlapping areas, but maybe for only one body is not the best option. i think it works well with the input func, but it has a little delay for perf reasons and if the body is not moving sometimes does not detect it and is a pain.
maybe the easiest solution is create a trigger for the guy
var is_in_TP = false
var theguy
onready var destination = $Position2D
func _on_Area2D_body_entered():
if body.name == "Player":
is_in_TP = true
theguy = body
func _on_Area2D_body_exited():
if body.name == "Player":
is_in_TP = false
func _input(_event):
if Input.is_action_just_pressed("teleport"):
if is_in_TP :
theguy.position = destination.global_position