Okay. Found part of the answer. Looks like this was actually asked quite a bit.
The best way to do this is ensure the KinematicBody2D has its
pickable flag set in the inspector. Then it can treating more like a GUI control and there's no need work with the sprite's texture.
Here's a link: https://godotengine.org/qa/34536/simple-click-2d-how-to-tell-when-static-body-has-been-clicked
For the mouse pointer snapping issue (if this is not a desired effect for you), just find the difference of the offset and add it back in when the object is clicked. Still a little delay on the drag, but I think this could be taken care of with a tween behavior to make it feel a little more intentional, but that's just my opinion. good luck.
# Pickable needs to be selected from the inspector
var can_grab = false
var grabbed_offset = Vector2()
func _input_event(viewport, event, shape_idx):
if event is InputEventMouseButton:
can_grab = event.pressed
grabbed_offset = position - get_global_mouse_position()
if Input.is_mouse_button_pressed(BUTTON_LEFT) and can_grab:
position = get_global_mouse_position() + grabbed_offset