视区和画布转换

介绍

这是对节点进行的二维转换的概述,从节点在本地绘制内容到将其绘制到屏幕上的时间。本概述讨论了引擎的低级别详细信息。

画布转换

正如前面的教程中提到的, 画布层 ,每个canvasitem节点(记住node2d和基于控件的节点使用canvasitem作为其公共根)将驻留在 帆布层 . 每个画布层都有一个转换(平移、旋转、缩放等),可以作为 Transform2D .

在上一个教程中,默认情况下,节点在内置画布的第0层中绘制。要将节点放在不同的层中,请执行以下操作: CanvasLayer 可以使用节点。

全局画布转换

视区还具有全局画布转换(也是 Transform2D )这是主转换,影响所有个人 帆布层 转换。一般来说,这个转换并没有多大用处,但是在Godot的编辑器中的canvasitem编辑器中使用。

拉伸变换

最后,视区具有 拉伸变换 ,在调整或拉伸屏幕时使用。此转换在内部使用(如中所述 多分辨率 ,但也可以在每个视区上手动设置。

在中接收的输入事件 MainLoop._input_event() 回调与此转换相乘,但缺少上面的转换。要将输入的坐标转换为本地CanvasItem坐标,请 CanvasItem.make_input_local() 为了方便起见,添加了函数。

转换顺序

要使CanvasItem本地属性中的坐标成为实际屏幕坐标,必须应用以下转换链:

../../_images/viewport_transforms2.png

转换函数

通过以下功能可以获得每个转换:

类型

变换

CanvasItem

CanvasItem.get_global_transform()

CanvasLayer

CanvasItem.get_canvas_transform()

CanvasLayer+GlobalCanvas+伸展

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);