I'm working on making a draggable object, snap to a set location when it gets near. For the life of me, I can not get the draggable object to take the position of the stationary object.

extends KinematicBody2D

var dragging = false

onready var root_node = get_parent()
onready var spot = root_node.get_node("Spot1").global_position

signal dragsignal;

func _ready():
	connect("dragsignal",self,"_set_drag_pc")
	
func _process(_delta):
	if dragging:
		var mousepos = get_viewport().get_mouse_position()
		self.position = Vector2(mousepos.x, mousepos.y)

func _set_drag_pc():
	dragging=!dragging

func _on_KinematicBody2D_input_event(_viewport, event, _shape_idx):
	if event is InputEventMouseButton:
		if event.button_index == BUTTON_LEFT and event.pressed:
			emit_signal("dragsignal")
		elif event.button_index == BUTTON_LEFT and !event.pressed:
			emit_signal("dragsignal")
	elif event is InputEventScreenTouch:
		if event.pressed and event.get_index() == 0:
			self.position = event.get_position()
			
func _on_SpotArea_area_entered(_area: Area2D) -> void:
	print(self.global_position, " ", "self")
	print(spot, " ", "Spot")

At the bottom here when the draggable object enters the "spot" area I want it to snap immediately to that location. Any suggestions would help and be greatly appreciated. Thank you.

func _on_SpotArea_area_entered(_area: Area2D) -> void:
    dragging = false
    position = _area.position

I think this would work (assuming spot and the dragging object are the same size).

that gives me the interesting result of the draggable object bouncing back to the corner of the screen lol thank you for the suggestion though

7 days later

OK my post "needs to be approved", so here it is again, the short version: position = _area.get_parent().position, since an area's position is usually 0,0.

Here is what I have now:

extends KinematicBody2D

var dragging = false

onready var root_node = get_parent()
onready var spot = root_node.get_node("Spot1").global_position

signal dragsignal;

func _ready():
	connect("dragsignal",self,"_set_drag_pc")
	
func _process(_delta):
	if dragging:
		var mousepos = get_viewport().get_mouse_position()
		self.position = Vector2(mousepos.x, mousepos.y)

func _set_drag_pc():
	dragging=!dragging

func _on_KinematicBody2D_input_event(_viewport, event, _shape_idx):
	if event is InputEventMouseButton:
		if event.button_index == BUTTON_LEFT and event.pressed:
			emit_signal("dragsignal")
		elif event.button_index == BUTTON_LEFT and !event.pressed:
			emit_signal("dragsignal")
	elif event is InputEventScreenTouch:
		if event.pressed and event.get_index() == 0:
			self.position = event.get_position()
			
func _on_SpotArea_area_entered(_area: Area2D) -> void:
	print(self.global_position, " ", "self")
	print(spot, " ", "Spot")
	dragging = false
	position = _area.get_parent().position

when I drag my icon on top of the spot I want it to stick to, it sticks now but doesn't cover the spot. Just stops wherever I have dragged it over. It's better than what I had though. Thank you =)

That answer is half-right, in my limited GDscript experience. You want to get the areas parents. The area position is 0, I assume, which is probably centered on your node. So assuming your node is something like: -Node2d ----Area2D --------CollisionShape2D Then you want to use

position = _area.get_parent().position

Thank you, had nodes set up wrong. Much appreciated!

3 years later