How to get the "absolute" position of a node within a control node?

Attention Topic was automatically imported from the old Question2Answer platform.

I have the following UI with playing cards being dealt as shown by the red arrow:

Cards dealt out of screen bounds

I’m trying to make them be dealt relative to the “Deal” button towards the center of the screen. So I have something like this on button click:

``````	deck.add_child(card)

var pos1 = deal_btn.rect_position + Vector2(-200, 0)
print_debug(deal_btn.rect_position)
print_debug(pos1)
print_debug(deck.rect_position)
tween.interpolate_property(card, "rect_position",
card.rect_position, pos1, 0.5,
Tween.TRANS_LINEAR, Tween.EASE_IN_OUT)
tween.start()
``````

The deck (which is the green square), is giving me a position of `(0,0)`, whereas the `deal_btn` is giving me a reasonable value of `819.200012, 512` and `pos1` is being calculated relative to it at `(619.200012, 512)`.

The problem seems to be with `deck` being at `(0,0)`. `card` is added as it’s child and is also at `(0,0)`… so I’m animating from `(0,0)` to `(619.200012, 512)` - off screen!

`deck` is a child of a control node… maybe that’s the reason? (as child nodes of control nodes don’t get to decide their position). See same link above - 2nd image for scene tree.

How can I get the “absolute” position of the deck in the screen (not relative to where the control node decides to put deck)? I assume I can then use this to do some vector math and get the right position.

(Added screenshot of Deck’s parent’s anchors).

How can I get the “absolute” position

Use `card.rect_global_position` instead of `card.rect_position`. It’s the same for Node2D: `global_position` is relative to the world origin (i.e. usually the top-left corner of your window), `position` is relative to the parent node.

Thanks njamster!

I had found `rect_global_position` shortly after posting this but after trying it - I ended up with no cards showing up … so I assumed I was setting a position way off the viewport.

Turns out, I missed changing the tween’s second argument to also be `"rect_global_position"`. So animating from the deck to the deal_btn (almost what I want) is:

``````	tween.interpolate_property(card, "rect_global_position",
card.rect_global_position, deal_btn.rect_position, 0.5,
Tween.TRANS_LINEAR, Tween.EASE_IN_OUT)
``````

Just a matter of adding some offset now.

Thanks!

justin | 2020-06-14 19:00

Now on godot 4 you can’t use this. If you want to take the equivalent, visit this post.