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.
Checking the stable version of the documentation...
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:
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
// Called from a CanvasItem.
canvasPos = GetGlobalTransform() * localPos;
localPos = GetGlobalTransform().AffineInverse() * canvasPos;
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
var screenCoord = GetViewport().GetScreenTransform() * GetGlobalTransformWithCanvas() * localPos;
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)
var localPos = new Vector2(10,20); // Local to Control/Node2D.
var ie = new InputEventMouseButton()
{
ButtonIndex = MouseButton.Left,
Position = GetViewport().GetScreenTransform() * GetGlobalTransformWithCanvas() * localPos,
};
Input.ParseInputEvent(ie);