Attention: Here be dragons

This is the latest (unstable) version of this documentation, which may document features not available in or compatible with released stable versions of Godot.

Trasformazioni di viewport e di canvas

Introduzione

Questa è una panoramica delle trasformazioni 2D che avvengono sui nodi dal momento in cui disegnano il loro contenuto localmente fino a quando vengono disegnati sullo schermo. Questa panoramica discute dei dettagli di molto basso livello del motore.

L'obiettivo di questo tutorial è insegnare un metodo per inviare eventi di input all'Input con una posizione nel sistema di coordinate corretto.

Una descrizione più completa di tutti i sistemi di coordinate e delle trasformazioni 2D è disponibile in Sistemi di coordinate 2D e trasformazioni 2D.

Canvas transform

Come accennato nel tutorial precedente, Canvas layers, ogni nodo CanvasItem (ricorda che i nodi basati su Node2D e Control usano CanvasItem come radice comune) risiederà in un Canvas Layer. Ogni canvas layer ha una trasformazione (traslazione, rotazione, scala, ecc.) a cui è possibile accedere come Transform2D.

Anche trattato nel tutorial precedente, i nodi sono disegnati, come valore predefinito, nel Livello 0, nel canvas integrato. Per posizionare i nodi in un livello diverso, è possibile utilizzare un nodo CanvasLayer.

Global canvas transform

Viewports also have a Global Canvas transform (also a Transform2D). This is the master transform and affects all individual Canvas Layer transforms. Generally, this is primarily used in Godot's CanvasItem Editor.

Stretch transform

Infine, le viewport hanno una Trasformazione di stiramento, utilizzata durante il ridimensionamento o lo stiramento dello schermo. Questa trasformazione è utilizzata internamente (come descritto in Risoluzioni multiple), ma è anche possibile impostarla manualmente su ciascuna viewport.

Gli eventi di input sono moltiplicati da questa trasformazione, ma mancano di quelle sopra. Per convertire le coordinate di InputEvent in coordinate locali di CanvasItem, è stata aggiunta la funzione CanvasItem.make_input_local() per comodità.

Window transform

La viewport principale è una Window. Per ridimensionare e posizionare il contenuto della Window come descritto in Risoluzioni multiple, ogni Window contiene una trasformazione di finestra. Questa è, ad esempio, responsabile delle barre nere ai lati della Window in modo che la Viewport venga visualizzata con un rapporto di aspetto fisso.

Ordine di trasformazione

Per convertire le coordinate locali di un CanvasItem in coordinate effettive dello schermo, bisogna applicare la seguente sequenza di trasformazioni:

../../_images/viewport_transforms3.webp

Funzioni di trasformazione

Il grafico sopra riportato mostra alcune funzioni di trasformazione disponibili. Tutte le trasformazioni sono dirette da destra a sinistra, il che significa che moltiplicando una trasformazione per una coordinata si ottiene un sistema di coordinate più a sinistra, mentre moltiplicando per l'inversa affine di una trasformazione si ottiene un sistema di coordinate più a destra:

# Called from a CanvasItem.
canvas_pos = get_global_transform() * local_pos
local_pos = get_global_transform().affine_inverse() * canvas_pos

Infine, per convertire le coordinate locali di un CanvasItem in coordinate dello schermo, basta moltiplicare nel seguente ordine:

var screen_coord = get_viewport().get_screen_transform() * get_global_transform_with_canvas() * local_pos

Tieni presente, tuttavia, che in genere non è consigliabile lavorare con le coordinate dello schermo. L'approccio raccomandato è semplicemente quello di lavorare con le coordinate di Canvas (CanvasItem.get_global_transform()), per lasciare che il ridimensionamento automatico della risoluzione dello schermo funzioni correttamente.

Inviare eventi di input personalizzati

Spesso si desidera inviare eventi di input personalizzati al gioco. Con le conoscenze sopra riportate, per farlo correttamente nella finestra focalizzata, bisogna procedere nel seguente modo:

var local_pos = Vector2(10, 20) # Local to Control/Node2D.
var ie = InputEventMouseButton.new()
ie.button_index = MOUSE_BUTTON_LEFT
ie.position = get_viewport().get_screen_transform() * get_global_transform_with_canvas() * local_pos
Input.parse_input_event(ie)