Перетворення вікна перегляду та полотна

Вступ

Це огляд 2D-перетворень, що відбуваються з вузлами від моменту, коли вони малюють свій вміст локально, до того часу, коли вони потрапляють на екран. У цьому огляді розглядаються деталі движка на дуже низькому рівні.

Перетворення полотна

Як уже згадувалося в попередньому посібнику Полотняні шари, кожен вузол CanvasItem (пам’ятайте, що вузли на основі Node2D та Control використовують CanvasItem як загальний корінь) буде знаходитись у Шарі Полотна. Кожен шар полотна має перетворення (переміщення, обертання, масштаб тощо), до якого можна отримати доступ як Transform2D.

Також в попередньому посібнику говорилося, що вузли за замовчуванням малюються на рівні 0 на вбудованому полотні. Щоб розмістити вузли в іншому шарі, можна використовувати вузол CanvasLayer (Полотняні Шари).

Глобальне перетворення полотна

Оглядові вікна також мають перетворення Global Canvas (також Transform2D). Це головне перетворення і впливає на всі окремі перетворення Шару полотна. Як правило, це перетворення не надто корисне, але використовується в Редакторі CanvasItem у Godot.

Перетворення розтягування

Нарешті, у вікна перегляду є Перетворення Розтягування, яке використовується при зміні розміру або розтягуванні екрана. Це перетворення використовується внутрішньо (як описано в розділі Multiple resolutions), але його також можна встановити вручну для кожного вікна перегляду.

Вхідні події, отримані у зворотному виклику MainLoop._input_event() помножуються на це перетворення, але не мають зазначених вище. Для перетворення координат InputEvent в локальні координати CanvasItem, для зручності була додана функція CanvasItem.make_input_local().

Порядок перетворень

Щоб координата в локальних властивостях CanvasItem стала фактичною координатою екрана, необхідно застосувати такий ланцюжок перетворень:

../../_images/viewport_transforms2.png

Функції перетворення

Отримати кожне перетворення можна за допомогою таких функцій:

Тип

Перетворення

CanvasItem (Елемент Полотна)

CanvasItem.get_global_transform()

CanvasLayer (Шар Полотна)

CanvasItem.get_canvas_transform()

CanvasLayer+GlobalCanvas+Stretch(Розтягування)

CanvasItem.get_viewport_transform()

Нарешті, щоб перетворити локальні координати 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);