Преобразование области просмотра и холста¶
Введение¶
Это обзор 2D преобразований, происходящих для узлов с момента их локального рисования содержимого до момента их рисования на экране. В этом обзоре обсуждаются детали движка очень низкого уровня.
Преобразования холста¶
Как упоминалось в предыдущем руководстве Слои холста, каждый узел CanvasItem (помните, что узлы на основе Node2D и Control используют CanvasItem в качестве общего корня) будет находиться в Canvas Layer. Каждый слой холста имеет преобразование (перемещение, поворот, масштаб и т.д.), к которому можно получить доступ как Transform2D.
Как было сказано в предыдущем уроке, узлы по умолчанию рисуются на 0-ом слое на встроенном холсте. Для того, чтобы поместить узлы на другой слой, можно воспользоваться узлом CanvasLayer.
Глобальное преобразование холста¶
Видовые экраны также имеют преобразование Global Canvas (также: Transform2D). Это основное преобразование, которое влияет на все отдельные преобразования Canvas Layer. Как правило, от этого преобразования мало пользы, но оно используется в CanvasItem Editor в редакторе Godot.
Преобразования растяжения¶
Наконец, в видовых экранах есть функция Stretch Transform, которая используется при изменении размера или растягивании экрана. Это преобразование используется внутренне (как описано в Multiple resolutions), но также может быть вручную установлено для каждого видового экрана.
Входные события, полученные в обратном вызове MainLoop._input_event (), умножаются на это преобразование, но отсутствуют указанные выше. Чтобы преобразовать координаты InputEvent в локальные координаты CanvasItem, для удобства была добавлена функция CanvasItem.make_input_local ().
Порядок преобразований¶
Чтобы координата в локальных свойствах CanvasItem стала фактической координатой экрана, необходимо применить следующую цепочку преобразований:

Функции преобразования¶
Получить каждое преобразование можно с помощью следующих функций:
Тип |
Преобразование |
---|---|
|
|
|
|
|
Наконец, чтобы преобразовать локальные координаты CanvasItem в экранные координаты, просто умножьте в следующем порядке:
var screen_coord = get_viewport_transform() * (get_global_transform() * local_pos)
var screenCord = (GetViewportTransform() * GetGlobalTransform()).Xform(localPos);
Однако имейте в виду, что обычно нежелательно работать с экранными координатами. Рекомендуемый подход - просто работать в координатах холста (CanvasItem.get_global_transform ()
), чтобы автоматическое изменение размера разрешения экрана работало правильно.
Передача пользовательских событий ввода¶
Часто требуется передавать пользовательские события ввода в дерево сцены. Обладая вышеуказанными знаниями, чтобы правильно это сделать, необходимо сделать следующее:
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);