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.