what do you need this for?
A sprite2D is a node that can be moved by a Node2D or CharacterBody2D.
scaling is the way to do it.
if you need to fit it to certain constraints, you have to calculate it manually.
BUT, if you don’t need this to be animated, or if you are willing to animate it yourself, you can use a Node2D and draw the sprite manually by overriding the _draw method:
@export var image : Texture2D
@export var rect : Rect2
@export var region : Rect2
func _draw() -> void:
draw_texture_rect(image, rect, region)
but you can also just use a control if this thing doesn’t need to move, like if it’s a final fantasy or pokemon style combat.
no.
control nodes are designed to fit within each other and accommodate for different resolutions. Node2Ds are designed to move around independently of each other.