Quick answer: tw.as_relative() for offset-from-current. Default is absolute target.
Tween position by 100 right. Drifts because each call relative to start, not current.
The Fix
# Absolute (target = exact value)
tw.tween_property(node, "position", Vector2(200, 100), 0.5)
# Relative (offset from current)
tw.as_relative().tween_property(node, "position", Vector2(100, 0), 0.5)
# Mixed
tw.tween_property(node, "position", Vector2(200, 100), 0.5) # abs
tw.chain().as_relative().tween_property(node, "position", Vector2(100, 0), 0.5) # rel
as_relative() flips for the rest of the chain. chain() boundary lets you mix.
Verifying
Move-by-100: lands at +100 from start. Without as_relative: lands at world (100, 0).
“Relative or absolute. Pick intent.”
Related Issues
For Tween pause/resume, see pause. For Tween bounce, see bounce.
Relative for offset.