Ansichtsfenster und Canvas Transformationen

Einführung

Dies ist eine Übersicht über die 2D-Transformationen, die für Nodes vom Zeitpunkt des lokalen Zeichnens ihres Inhalts bis zum Zeitpunkt des Zeichnens auf dem Bildschirm ausgeführt werden. In dieser Übersicht werden grundlegende Details des Engine erläutert.

Canvas Transformationen

Wie in der vorherigen Anleitung Canvas-Ebenen erwähnt, befindet sich jeder CanvasItem-Node in einer Canvas-Ebene (denken Sie daran, dass Node2D- und Control-basierte Nodes CanvasItem als gemeinsame Wurzel verwenden). Jede Canvas-Ebene verfügt über eine Transformation (Verschiebung, Drehung, Skalierung usw.), auf die wie folgt zugegriffen werden kann Transform2D.

Ebenfalls im vorherigen Kapitel behandelt, werden Nodes standardmäßig in Ebene 0 in der integrierten Zeichenfläche gezeichnet. Um Nodes in einer anderen Ebene zu platzieren, kann ein CanvasLayer-Node verwendet werden.

Globale Canvas Transformation

Ansichtsfenster haben auch eine globale Canvas-Transformation (auch eine Transform2D). Dies ist die Master-Transformation und betrifft alle einzelnen Canvas-Ebenen -Transformationen. Im Allgemeinen ist diese Transformation nicht sehr nützlich, wird jedoch im CanvasItem-Editor in Godots Editor verwendet.

Dehnungstransformation

Schließlich verfügen Ansichtsfenster über eine Dehnungstransformation, die beim Ändern der Größe oder Strecken des Bildschirms verwendet wird. Diese Transformation wird intern verwendet (wie in Mehrere Auflösungen beschrieben), kann aber auch manuell für jedes Ansichtsfenster festgelegt werden.

Input events received in the MainLoop._input_event() callback are multiplied by this transform but lack the ones above. To convert InputEvent coordinates to local CanvasItem coordinates, the CanvasItem.make_input_local() function was added for convenience.

Transformationsreihenfolge

Damit eine Koordinate in den lokalen CanvasItem-Eigenschaften zu einer tatsächlichen Bildschirmkoordinate wird, muss die folgende Transformationskette angewendet werden:

../../_images/viewport_transforms2.png

Transformationsfunktionen

Das Ausführen jeder Transformation kann mit den folgenden Funktionen erreicht werden:

Art Transformation
CanvasItem CanvasItem.get_global_transform()
CanvasLayer CanvasItem.get_canvas_transform()
CanvasLayer+GlobalCanvas+Stretch CanvasItem.get_viewport_transform()

Um die lokalen CanvasItem-Koordinaten in Bildschirmkoordinaten umzuwandeln, multiplizieren Sie sie einfach in der folgenden Reihenfolge:

var screen_coord = get_viewport_transform() * (get_global_transform() * local_pos)
var screenCord = (GetViewportTransform() * GetGlobalTransform()).Xform(localPos);

Beachten Sie jedoch, dass es im Allgemeinen nicht erwünscht ist, mit Bildschirmkoordinaten zu arbeiten. Der empfohlene Ansatz besteht darin, einfach in Canvas-Koordinaten (CanvasItem.get_global_transform()) zu arbeiten, damit die automatische Größenänderung der Bildschirmauflösung ordnungsgemäß funktioniert.

Benutzerdefinierte Eingabeereignisse einlesen

Es ist häufig erwünscht, dem Szenenbaum benutzerdefinierte Eingabeereignisse zuzuführen. Mit dem oben genannten Wissen muss dies folgendermaßen geschehen:

var local_pos = Vector2(10, 20) # local to Control/Node2D
var ie = InputEventMouseButton.new()
ie.button_index = BUTTON_LEFT
ie.position = get_viewport_transform() * (get_global_transform() * local_pos)
get_tree().input_event(ie)
var localPos = new Vector2(10,20); // local to Control/Node2D
var ie = new InputEventMouseButton();
ie.ButtonIndex = (int)ButtonList.Left;
ie.Position = (GetViewportTransform() * GetGlobalTransform()).Xform(localPos);
GetTree().InputEvent(ie);