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.

Eingabeereignisse, die im MainLoop._input_event()-Callback empfangen qurden, werden mit dieser Transformation multipliziert, aber es fehlen die oben genannten. Um InputEvent-Koordinaten in lokale CanvasItem-Koordinaten zu konvertieren, wurde der Einfachheit halber die Funktion CanvasItem.make_input_local() hinzugefügt.

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)

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)