视区和画布转换¶
介绍¶
这是对节点进行的二维转换的概述,从节点在本地绘制内容到将其绘制到屏幕上的时间。本概述讨论了引擎的低级别详细信息。
画布转换¶
正如前面的教程中提到的, 画布层 ,每个canvasitem节点(记住node2d和基于控件的节点使用canvasitem作为其公共根)将驻留在 帆布层 . 每个画布层都有一个转换(平移、旋转、缩放等),可以作为 Transform2D .
在上一个教程中,默认情况下,节点在内置画布的第0层中绘制。要将节点放在不同的层中,请执行以下操作: CanvasLayer 可以使用节点。
全局画布转换¶
视区还具有全局画布转换(也是 Transform2D )这是主转换,影响所有个人 帆布层 转换。一般来说,这个转换并没有多大用处,但是在Godot的编辑器中的canvasitem编辑器中使用。
拉伸变换¶
最后,视区具有 拉伸变换 ,在调整或拉伸屏幕时使用。此转换在内部使用(如中所述 多分辨率 ,但也可以在每个视区上手动设置。
在中接收的输入事件 MainLoop._input_event() 回调与此转换相乘,但缺少上面的转换。要将输入的坐标转换为本地CanvasItem坐标,请 CanvasItem.make_input_local() 为了方便起见,添加了函数。
转换顺序¶
要使CanvasItem本地属性中的坐标成为实际屏幕坐标,必须应用以下转换链:
转换函数¶
通过以下功能可以获得每个转换:
类型 |
变换 |
---|---|
CanvasItem |
|
CanvasLayer |
|
CanvasLayer+GlobalCanvas+伸展 |
最后,要将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);